计算机系统漫游

文章详细阐述了从源代码到可执行文件的编译过程,包括预处理、编译、汇编和链接四个阶段。讨论了系统硬件如总线、I/O设备、主存和处理器的工作原理,以及高速缓存如何提高性能。同时,介绍了操作系统的角色,尤其是进程、虚拟内存和文件的概念,以及并发和并行执行的差异。
摘要由CSDN通过智能技术生成

源文件是如何储存的

#include<stdio.h>
int main()
{
printf("hello,world \n");
return 0;
}

源文件hello.c实际上就是由值0和1组成的位(又称为比特)序列,八个位组成一个字节,每个字节表示程序中的某个文本字符
ASCⅡ就是用一个唯一的单字节大小的整数值来表示每一个字符

在这里插入图片描述
hello.c的表示方法说明了一个基本思想:‘系统中的所有信息——包括磁盘文件,内存中的程序,内存中存放的用户数据及网络上传送的数据,都是由一段比特表示的。区分不同数据对象的唯一方法是我们读到这些数据对象时的上下文。’

源文件到目标可执行文件的转化过程

为了系统上运行hello.c源文件,每条C语言都需要被其他程序转化为一系列的低级机器语言指令,然后这些程序按照一种可执行目标程序格式打好包,并以二进制磁盘文件的格式储存起来。
GCC编译器驱动程序翻译过程可分为以下四个阶段
在这里插入图片描述
这四个阶段的程序(预处理器,编译器,汇编器,链接器)一起组成了编译系统

  • 预处理阶段:预处理器根据以字符#开头的命令,修改原始的C程序,比如hello.c中就会告诉预处理器读取系统头文件stdio.h的内容,并把它直接插入程序文本中,得到一个以i为后缀名的文件
  • 编译阶段:对预处理后的文件进行语法分析,词法分析,语义分析,符号汇总,然后生成汇编代码,后缀名为s
  • 汇编阶段:汇编器将汇编代码翻译成机器语言指令,再打包成一个二进制文件,后缀名为o
  • 链接:由汇编阶段生成的二进制文件并不能立即执行,例如某个文件里可能引用了另一个源文件或库里定义的符号或函数等,链接程序的主要工作就是将有关文件彼此相连,得到一个可执行的二进制文件。

处理器读并解释储存在内存中的指令

shell是一个命令行解释器,它输出一个提示符,等待输入一个命令行,然后执行这个命令,如果命令行的第一个单词不是一个内置的shell命令,那么shell就会假设这是一个可执行文件的名字,它将加载并执行这个文件

系统的硬件组成

在这里插入图片描述

  • 总线:一组电子管道,携带信息字节并各个部件之间传递,被设计成传送定长的字节块,也就是字。现在大多数机器字长要么是4个字节(32位),要么是8个字节(64位)。
  • I/O设备:I/O(输入/输出)设备是系统与外部世界的联系通道,每个I/O设备都通过一个适配器或控制器与I/O总线相连。控制器与适配器的区别主要在于他们的封装方式,控制器是I/O设备本身或者系统的主印制电路板上的芯片组。而适配器则是插在主板插槽上的卡。
  • 主存:一个临时储存设备,在处理器执行程序时,用来存放程序和程序处理的数据,物理上来说是一组动态随机存取存储器组成,逻辑上来说是一个线性的字节数组,每一个字节都有其唯一的地址,这些地址是从零开始的。
  • 处理器:中央处理单元(CPU),解释(或执行)存储在主存中指令的引擎,核心是一个大小为一个字的的储存设备(或寄存器),称为程序计数器(PC),在任何时刻,PC都指向主存中的某条机器语言指令。

运行程序

初始时,shell程序执行他的指令,等待我们输入一个命令,当在键盘上输入./hello,shell程序将字符逐一读入寄存器,再把它存放到内存中。
在这里插入图片描述
当我们在键盘上敲回车时,shell程序就知道了我们结束了命令的输入。然后shell执行一系列指令来加载可执行文件,这些指令会把hello目标文件中的代码和数据从磁盘复制到主存中。这种访问数据的方式不会经过CPU,直接从磁盘到主存,这种方式称为DMA,有利于减轻CPU的负荷。
在这里插入图片描述
加载完文件后,CPU将会开始从hello程序的主函数处执行指令,这些指令将hello,world\n字符串中的字节从主存复制到寄存器文件,再从寄存器文件复制到显示器,最终显示到屏幕上。
在这里插入图片描述

高速缓存

从上面的运行过程来看,系统花费了大量时间来复制指令和数据,从磁盘到主存最后到显示器,这些复制就是开销。根据机械原理,较大的储存设备要比小的储存设备运行慢,而快速设备的造假要远高于慢速设备。比如一个典型的寄存器文件只储存几百字节信息,而主存里可放置几百亿字节信息,然而,处理器从寄存器中读取信息比主存中快了近100倍,针对这种处理器和主存之间的差异,系统设计者采用了一种更小更快的储存设备,称为高速缓存存储设器,作为暂时的集结区域,存放处理器近期可能会需要的数据。
在这里插入图片描述
位于处理器芯片上的L1高速缓存的容量可达到数万字节,访问速度基本和访问寄存器一样,一个容量为数十万甚至数百万字节的L2高速缓存通过一条特殊的总线连接到处理器,进程访问L2高速缓存的时间要比访问L1高速缓存的时间长5倍,但仍然比访问主存快5到10倍。
L1和L2高速缓存是通过一种叫做静态随机访问储存器的硬件技术实现的。
高速缓存的局部性原理:程序具有访问局部区域里的数据和代码趋势。通过在高速缓存存放可能经常访问的信息,大部分的内存操作都能在快速的高速缓存中完成。

储存设备形成层次结构

储存器层次结构的主要思想是上一层储存器作为低一层储存器的高速缓存,寄存器就是L1的高速缓存,L1就是L2的高速缓存
在这里插入图片描述

操作系统管理硬件

所有应用程序对硬件的操作尝试都需要通过操作系统。
操作系统有两个基本的功能:1.防止硬件被失控的应用程序滥用。2.向应用程序提供简单一致的来控制复杂而又通常大不相同的低级硬件设备。
在这里插入图片描述
操作系统通过几个基本的抽象概念(进程、虚拟内存、文件)来实现两个功能,文件是对I/O设备的抽象表示,虚拟内存是对主存和I/O设备的抽象表示,进程是对处理器、主存和I/O设备的抽象表示。

  • 进程和线程:进程是一个操作系统对一个正在运行的程序的抽象,在一个系统上可以同时运行多个进程,而每个进程都好像在独占的使用硬件,并发运行则是说一个进程的指令和另一个进程的指令是交叉执行的,操作系统保持跟踪进程所需要的所有状态信息,这种状态就被称为上下文,包括PC、寄存器文件的当前值以及主存里的内容。当操作系统决定要把控制权从当前进程转移到另一个进程是,就会进行上下文切换,即保存当前上下文,恢复新进程的上下文。一个进程可以有多个被称为线程的执行单元组成,每个线程都运行在进程的上下文中,并共享同样的代码和数据
  • 虚拟内存:为每个进程提供了一个假象,即都在独占的使用主存,每个进程看到的内存都是一致的,称为虚拟地址空间。
    在这里插入图片描述
    代码和数据:存放可执行代码和全局变量
    :用于动态申请的内存变量,可以在运行时动态的向上扩展和收缩。
    共享库:用来存放像C标准库和和数学库这样的共享库区域。
    :位于用户虚拟地址空间顶部的是用户栈,编译器用它来实现函数调用,可以动态的扩展和收缩,调用函数时会扩展,返回时会收缩。
    内核虚拟内存:为内核保留的,不允许应用程序读写这个区域的内容或者直接调用内核代码定义的函数,相反,他们必须调用内核来执行这些操作。
  • 文件:文件就是字节序列

并发和并行

在这里插入图片描述

  • 并发:同一时间刻只能有一个指令执行,多个进程指令被快速轮换执行。

  • 并行:同一时刻有多个指令在多个处理器上同时执行。

  • 多核处理器:将多个CPU集成到一个集成电路芯片上。
    在这里插入图片描述

  • 超线程:允许一个CPU执行多个控制流的技术,涉及CPU某些硬件有多个备份。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值