1.程序是怎样跑起来的?
程序的生命周期是从一个源程序开始,源程序实际上就是一个由值0或者1组成的位序列,8个位被称为1字节,每个字节表示某些文本字符(大部分现代计算机系统都是用ASCII标准来表示文本字符),一个字节代表一个整数值,与ASCII码表的字符一一对应。像是hello.c这样的文件就是由ASCII字符构成的文本文件,除此之外,其他的都称为二进制文件。
为了在程序上运行hello.c文件,需要将每条c语句都转化为低级机器语言指令,然后这些指令按照一种称为可执行目标程序的格式打好包,并且以二进制磁盘文件形式存储起来,目标程序也可称为可执行目标文件。
GCC编译器驱动程序从读取源文件到翻译成一个可执行的目标文件hello,需要执行四个阶段的程序(预处理器、编译器、汇编器和连接器),如下图:
- 预处理阶段:预处理器根据字符#开头的命令,修改原始的C程序。
- 编译阶段:将hello.c文件翻译成hello.s,是汇编语言文件。
- 汇编阶段:汇编器将hello.s翻译成机器语言指令。并且将指令打爆成一种叫做可重定位目标程序的格式,并且将结果保存到hello.o中。
- 链接阶段:hello程序中调用的printf实际上是C编译器提供的标准C库中提供的一个函数,这个时候才被加入进来。
2.系统的硬件组成
- 总线:贯穿整个系统的一组电子管道,携带信息字节并负责在各个部件之间传输。
- I/O设备:系统与外界的联系通道。
- 主存:主存是临时存储设备,在处理器执行程序时,用来存放程序和程序处理的数据。
- 处理器:中央处理单元,简称处理器,是解释(或执行)存储在主存中指令的引擎。
高速缓存的必要
主要解决cpu和主存之间巨大的速度差异,在主存和cpu寄存器之间采用了更小更快的存储设备。获得一个更大的存储器的,同时访问速度也很快,原因是利用了高速缓存的局部性原理,即程序具有访问局部区域里的数据和代码的趋势(空间和时间两方面)。
存储设备形成层次结构
存储器层次结构的主要思想是上一层的存储器作为低一级存储器的高速缓存:
操作系统管理硬件
操作系统拥有的两个基本功能:(1)防止硬件被失控的程序滥用;(2)向应用程序提供简单一致的机制来控制复杂而又通常大不相同的低级硬件设备。
进程
进程是操作系统对一个正在运行的程序的一种抽象。在一个系统里可以运行多个进程,每个进程都好想独占的使用硬件。而并发运行,则是说一个进程的指令和另一个进程的指令是交错执行的。需要运行的进程数一般是多于可以运行它们的cpu个数。
操作系统保持跟踪进程运行所需的的所有状态信息,即上下文,它包括许多信息,比如寄存器和主存内的内容。当操作系统聚鼎奖控制权从当前进程转移到某个新进程时,就会产生上下文切换,即保存当前进程的上下文、恢复新进程的上下文,然后将控制权传递到新进程,新进程就会从它上次停止的地方开始。
从一个进程到另一个进程的转换是由操作系统内核管理的,内核是操作系统代码常驻主存的部分。当应用程序需要操作系统的某些操作时,就会执行系统调用指令,将控制传递给内核。内核不是一个独立的进程,它是系统管理全部进程所用代码和数据结构的集合:
线程
一个进程由多个称为线程的执行单元构成。
虚拟内存
虚拟内存是一个抽象概念,它为每一个进程提供一个假象,即每个线程都在独占的使用主存。每个进程看到的内存都是一致的,成为虚拟地址空间。