通过一个C语言程序的生命周期,了解计算机系统

news2024/11/26 6:24:05

我们通过跟踪这个hello程序来系统性的了解一个程序是如何被系统执行的。

#include <stdio.h>

int main(){
	printf("hello world");
}

一、信息的本质

一个C语言程序的生命周期从一个源程序开始,程序员用编辑器创建并保存的文本文件,文件后缀为.c。这个源程序本质上是一个由0和1组成的(也叫bit)序列,8个一组,被称为字节。每个字节表示一个字符。(注:现在的大部分系统都用ASCII标准来表示字符。)

该图是hello程序的ASCII文本表示

系统中的所有信息都是如hello程序一样由一串位组成的——包括磁盘文件、存储器中的程序、存储器中存放的用户数据以及网络上传输的数据。因此,我们可以说信息的本质就是一串位。(注:在不同的上下文中,一个相同的字节序列可能表示不同的意思。比如,一个数字在不同的上下文中可以表示为整数、浮点数等。)

二、被翻译成不同形式的hello程序

hello程序被创建之初是一个高级的C语言程序,这种形式可以被我们读懂,但无法被计算机读懂。因此,hello程序必须被翻译成计算机能够“明白”的形式。每条C语句都要被转化为一系列的低级机器语言指令。这些指令按照可执行目标程序的格式打包,然后以二进制磁盘文件的形式保存起来。该文件也被称为可执行目标文件

这个翻译过程分为四个阶段,由四个程序执行——预处理器、编译器、汇编器、链接器,它们一起构成了编译系统(compilation system)。
在这里插入图片描述

  • 预处理阶段。预处理器(即cpp)根据以#号开头的命令,修改源代码。如hello.c中第一行#include <stdio.h>,预处理器通过按照该命令读取头文件stdio.h中的内容,插入源代码中,得到hello.i。
  • 编译阶段。编译器(即ccl)将hello.i翻译成汇编语言程序文件hello.s。汇编语言是二进制指令的文本形式,汇编语言程序中的每条语句都以一种标准的文本格式表示了一条低级机器指令。它为不同高级语言的不同编译器提供了通用的输出语言。
  • 汇编阶段。汇编器(即as)将hello.s语言翻译成机器语言指令,这些指令最终会被打包成***可重定位目标程序(relocatable object program)***的格式,保存在二进制文件hello.o中。它的字节编码是机器语言指令。
  • 链接阶段。在我们的hello程序中,我们调用了printf函数,该函数在一个名为printf.o的目标文件(注:已经预编译好了)中。链接器(即ld)将这个文件合并到我们的hello.o中,就得到了一个可执行文件hello。该文件将加载到内存中,由系统执行。

三、处理器读取并解释指令

现在,我们的hello.c源程序已经被翻译成立可执行文件hello,保存在磁盘上。接下来就是执行,比如,在linux中我们通过shell(外壳)执行:

Linux> ./hello
hello world
Linux>

注:shell是一个命令行解释器,我们输入一个命令行,shell会执行这个命令。Shell的本质是一个应用程序,它连接了用户和 Linux 内核,让用户能够更加高效、安全、低成本地使用 Linux 内核。

在解释系统是如何执行可执行文件hello前,我们需要了解系统的硬件组成。

1、系统的硬件组成

我们通过一张图来解释系统的硬件组成。
在这里插入图片描述

  • 总线。一个贯穿系统的电子管道,它的主要作用是在各个部件之间传递信息。一般来说,总线会传输固定的字节块,也就是字(word)。字中的字长(即字节数)是一个基本的系统参数。主要有4个字节(32位)与8个字节(64)两种。
  • I/O设备。I/O设备是系统与外部的连接通道。一般我们的电脑有四个I/O设备——键盘、鼠标、显示器以及磁盘。可执行文件hello就存放在磁盘上。
  • 主存。主存是一个临时存储设备,用来存储程序与程序处理的数据。从逻辑上来说,主存是一个线性的字节数组,每个字节都有唯一的地址(从0开始)。
  • 处理器。处理器也叫CPU,是执行存储在主存中指令的引擎。该部件核心是一个存储设备(即寄存器),或者叫程序计数器(即PC)。程序计数器的主要作用是指向主存中的一条机器指令。处理器会不断的执行程序计数器指向的指令。

注:如果你对系统稍微有点了解的话,你会知道系统分为32位于64位。CPU一次处理数据的能力是32位还是64位,关系着系统需要安装32位还是64位的系统。

在了解到上述的硬件知识后,我们现在可以真正执行hello程序了。

2、执行hello程序

在一开始,我们通过shell执行 ./hello命令。而在之后,shell会将字符一个一个读入寄存器,再加载到主存中。一旦hello中的代码与数据被加载到主存中,处理器就开始执行hello程序中的main程序中的机器语言指令。执行后,得到"hello world"字符串,这些字符串将从主存复制到寄存器中,再从寄存器中复制到显示器,最终我们就看到了。

四、高速缓存

现在,hello程序的整个生命周期就已经结束了。但是我们会发现,在这个例子中,系统把大量的时间用在传输信息中。这本身没什么问题,但是在CPU、主存、磁盘巨大的访问速度的差距下,就会造成CPU被大幅度浪费。
针对这种处理器与主存之间的访问速度的差距,高速缓存存储器出现了。高速缓存可作为暂时的存储空间,用来存储处理器最近会使用的数据。一般来说,我们有L1、L2以及L3三种高速缓存。

  • L1高速缓存一般位于处理器上,它的访问速度可以与寄存器一样快,当然容量也会比L2高速缓存要小。
  • L2高速缓存容量可以从数十万到数百万,一般通过一条特殊的总线连接到处理器。访问速度要比L1高速缓存慢5倍,但是仍然比访问主存要快5~10倍。
  • 处理能力更强大的系统在有L1高速缓存与L2高速缓存后,还有L3高速缓存。L3高速缓存是一个很大的存储器,访问速度也很快,它使用了高速缓存的局部性原理,即程序可以访问局部区域里的数据和代码

注:在处理器与主存之间插入一个高速缓存已经是一个普遍的做法了。目前的计算机系统的存储设备已经组织成了一个存储器层次结构。

五、操作系统的基本功能

我们再回到hello程序中来讨论另一个问题。当hello被加载和执行时,以及hello程序输出时,hello程序没有直接访问I/O设备或者主存,而是通过操作系统提供的服务。因此,我们可以把操作系统当做是硬件与程序之间的一层软件,如下图所示。所有的程序都需要通过操作系统才能对硬件进行操作。
在这里插入图片描述
由此,我们可以总结出操作系统的两大基本功能:1)防止硬件被程序随意滥用。2)屏蔽掉低级硬件设备的复杂性,向程序提供一个简单一致的机制来控制硬件设备。
操作系统实现这两个功能主要是通过三个基本抽象概念——进程、虚拟存储器和文件。其中,文件是对I/O设备的抽象表示,虚拟存储器是对主存与磁盘I/O设备的抽象表示,进程则是对处理器、主存、I/O设备的抽象表示。如下图。
在这里插入图片描述

接下来,我们将依次讨论三个抽象概念。

1、进程

未完待续

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/753721.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Pycharm中快速校准代码格式】

Windows下&#xff1a; ctrlaltL Mac下&#xff1a; optioncommand 如何查看Pycharm的快捷键 keymap 键映射&#xff1a;计算机软件中&#xff0c;将键盘按键与特定功能或命令关联的配置。

scrapy ---分布式爬虫

导模块 pip install scrapy-redis 原来scrapy的Scheduler维护的是本机的任务队列&#xff08;待爬取的地址&#xff09;本机的去重队列&#xff08;放在集合中&#xff09;---》在本机内存中 如果把scrapy项目&#xff0c;部署到多台机器上&#xff0c;多台机器爬取的内容是重…

特斯拉上海工厂二季度交付创历史新高,员工奖金大幅增长

根据路透社的报道&#xff0c;特斯拉上海工厂的几位员工透露&#xff0c;他们在最新一季度获得了大幅增加的绩效奖金。 根据三位工厂员工的陈述&#xff0c;他们在二季度收到的奖金是他们月薪的1.5倍&#xff0c;高于之前按绩效评估获得的季度奖金&#xff08;月薪的1.2倍&…

《面试1v1》Kafka基础

&#x1f345; 作者简介&#xff1a;王哥&#xff0c;CSDN2022博客总榜Top100&#x1f3c6;、博客专家&#x1f4aa; &#x1f345; 技术交流&#xff1a;定期更新Java硬核干货&#xff0c;不定期送书活动 &#x1f345; 王哥多年工作总结&#xff1a;Java学习路线总结&#xf…

Nacos 虚拟机设置开机自启

执行命令 : vi /lib/systemd/system/nacos.service 创建并编辑文件将下面的代码放入此文件中,其中注意自己nacos的位置,即ExecStart与ExecReload与ExecStop 后面的nacos相关路径 [Unit] Descriptionnacos Afternetwork.target[Service] Typeforking TimeoutSec0 #防止启动超时…

呼吸灯——FPGA

文章目录 前言一、呼吸灯是什么&#xff1f;1、介绍2、占空比调节示意图 二、系统设计1、系统框图2、RTL视图 三、源码四、效果五、总结六、参考资料 前言 环境&#xff1a; 1、Quartus18.0 2、vscode 3、板子型号&#xff1a;EP4CE6F17C8 要求&#xff1a; 将四个LED灯实现循环…

我伴随HarmonyOS一起成长

大家好&#xff0c;我是waylau&#xff08;老卫&#xff09;&#xff0c;是一名80后程序员&#xff0c;华为开发者联盟社区认证讲师&#xff0c;HarmonyOS技术达人&#xff0c;曾获2021、2022年度牛人之星、2022年度OpenHarmony开源贡献之星。著有《跟老卫学HarmonyOS开发》开源…

jmeter 入门到精通

目录 一、jmeter 安装 二、jmeter 介绍 1、jmeter是什么&#xff1f; 2、jmeter 用来做什么&#xff1f; 3、优点 4、缺点 5、jmeter 目录介绍 ①_bin 目录介绍 ② docs 目录 — — 接口文档目录 ③ extras目录 — — 扩展插件目录 ④ lib 目录 — — 所用到的插件…

网络通信原理系统的认知(NEBASE第十四课)

1 物理层 第一层 物理层&#xff1a;建立、维护、断开物理连接&#xff0c;定义了接口及介质&#xff0c;实现了比特流的传输。 1.1传输层介质分类 有线介质&#xff1a;网线 &#xff08;双绞线&#xff09;光纤 无线: 无线电 1.2 双绞线 五类线 cat5 &#xff1a;适用 10…

[论文分享]ConvMAE:Masked Convolution Meets Masked Autoencoders

论文题目&#xff1a;ConvMAE: Masked Convolution Meets Masked Autoencoders 论文地址&#xff1a;https://arxiv.org/abs/2205.03892 代码地址&#xff1a;https://github.com/Alpha-VL/ConvMAE 摘要 视觉变压器(Vision transformer, ViT)已成为广泛应用于各种视觉任务的架…

如何使用 SVG 作为占位符和其他图像加载技术

从图像生成 SVG 可用于占位符。 一、说明 我们对图像性能优化和使图像在网络上快速加载充满热情。最有趣的探索领域之一是占位符&#xff1a;当图像尚未加载时要显示的内容。 在过去&#xff0c;我遇到了一些使用 SVG 的加载技术&#xff0c;我想在这篇文章中描述它们。 在这…

代码随想录算法训练营第52天 | 动态规划 part13 ● 300.最长递增子序列 ● 674. 最长连续递增序列 ● 718. 最长重复子数组

#300.最长递增子序列 自己想了20min没想出来。但没关系因为没接触过该题型。我想不出来的点就是&#xff0c;如果i-1的最后一个不要的话&#xff0c;我怎么找到上一个结束点。解决方案是&#xff1a;再搞一个循环&#xff0c;一个个找&#xff08;下面的 j &#xff09; 下面…

性能测试 Linux 环境下模拟延时和丢包实现

在性能测试过程中&#xff0c;我们还需要模拟网络异常的情况下&#xff0c;是否会出现一些异常数据。最常见的就是写库操作&#xff0c;比如说我们下单的场景&#xff0c;如果出现网络异常的时候是否会出现数据对不上这种情况。 如我们JMeter发送成功的请求数量和最终数据库表…

龙蜥白皮书精选:面向 HTTP 3.0 时代的高性能网络协议栈

文/高性能网络 SIG 01 背景概述 随着互联网特别是移动互联网的快速发展&#xff0c;对互联网通信协议提出了新的诉求。经过多年的发展&#xff0c;QUIC 协议在 2021 年正式被 IEFT 标准化&#xff0c;成为 HTTP 3 的标准传输层协议。QUIC 是基于 UDP 实现的面向连接可靠有序…

基于虚拟同步发电机控制的双机并联MATLAB仿真模型

使用MATLAB2021b打开 主要内容&#xff1a; 功率计算模块、虚拟同步发电机控制模块、电压合成模块、电压电流双环控制模块&#xff01; 1.两台VSG并联&#xff0c;开始各自带负载10KW&#xff0c;在0.3秒的时候加入公共负载10KW&#xff0c;稳定后两台VSG可以均分公共负载的…

大模型时代Embedding技术简介

Embeddings技术简介及其历史概要 在机器学习和自然语言处理中&#xff0c;embedding是指将高维度的数据&#xff08;例如文字、图片、音频&#xff09;映射到低维度空间的过程。embedding向量通常是一个由实数构成的向量&#xff0c;它将输入的数据表示成一个连续的数值空间中…

SciencePub学术 | 区块链类重点SCIEEI征稿中

SciencePub学术 刊源推荐: 区块链类重点SCIE&EI征稿中&#xff01;信息如下&#xff0c;录满为止&#xff1a; 一、期刊概况&#xff1a; SCI-01 【期刊简介】IF&#xff1a;4.0-4.5&#xff0c;JCR2区&#xff0c;中科院3区&#xff1b; 【检索情况】SCIE&EI双检&…

另一个流行漏洞。

Microsoft Office 和 Windows HTML 中的 CVE-2023-36884 漏洞。该漏洞由供应商公开披露&#xff0c;但尚未修补。Microsoft 意识到利用该漏洞的针对性攻击。据了解&#xff0c;RomCom 组织曾在此类攻击中使用勒索软件 Industrial Spy 和 Cuba。 可能导致什么后果&#xff1f; …

奇迹MU架设教程:SQL Server 2008数据库的安装教程

不管是搭建什么游戏&#xff0c;都是有数据库的&#xff0c;奇迹MU用的是SQL 数据库&#xff0c;根据服务器系统选择SQL server版本&#xff0c;我比较喜欢用Windows server 2008R2系统&#xff0c;所以我安装的是SQL server 2008。作为架设奇迹很重要的数据库程序&#xff0c;…

python中文版下载安装教程,python中文版下载官网

大家好&#xff0c;本文将围绕python中文版软件下载百度网盘展开说明&#xff0c;python中文版下载安装教程是一个很多人都想弄明白的事情&#xff0c;想搞清楚python中文最新版下载需要先了解以下几个事情。 1、python下载安装教程_百度知道 python下载安装教程&#xff1a;自…