一、 C 程序的编译过程
概念
- 文本文件:只包含 ASCII 字符
- 二进制文件: 除文本文件外其他文件
二、计算机系统硬件组成
- CPU :中央处理器
- 主存: 存储数据和指令
- IO 设备:鼠标、键盘、显示器、磁盘控制器等
- 总线:数据通道
计算机内部结构拓补图
系统内部结构如下图所示, hello.c
程序如何执行呢?一个简单的描述如下,编写好的 hello.c
文本文件被存储在磁盘上,经过编译后形成的 a.out
文件也存储在磁盘上,在 shell
中敲入 ./a.out
时, ./a.out
首先被存入寄存器中,当敲入回车时,寄存器中的 a.out
被送入主存, 主存开始加载 a.out
程序和数据,加载完成后,CPU 执行程序时,从主存获取程序指令和数据,并将相应的输出送到显示器进行显示。
由上可见,程序执行过程中,大量时间花费在访存上,即将程序数据和指令从一个地方复制到另一个地方,与 CPU 执行指令速度相比,访存速度大大影响了程序执行效率,故现代计算机多设置有 cache
(高速缓存),CPU 访问 cache
的速度通常比访问主存快得多,cache
通常设置在总线接口与寄存器之间,程序执行时先从 cache
查找相应的数据和命令,找不到再访问内存。从内存取数据和指令时,会在 cache
形成缓存,cache
的使用大大提高了程序执行效率,因此,提高 cache
命中率通常是提高软件系统整体运行速度的有效办法之一。
存储设备的层次结构
存储设备的层次结构如下图所示。
三、操作系统对硬件的管理
几个重要抽象
1. 文件
文件就是字节序列。系统中每个 I/O 设备都可以看成一个文件,甚至网络也可以看成一个文件,系统的所有输入/输出都是通过一组 Unix I/O 系统调用读写文件来实现的。
2. 进程
进程是对操作系统正在运行的程序的一种抽象。看起来每个进程好像都是独占 CPU 的,实际上是通过上下文切换实现并发的。
上下文是指进程运行所需要的状态信息,这些信息包括 PC 值、寄存器值、内存中的数据等。上下文切换是指系统保存当前运行进程的上下文信息,然后切换到另一个进程的上下文,执行新的进程,待新进程执行结束后如果要继续执行原来的进程,再恢复之前保存的上下文信息。
进程切换是由操作系统内核完成的。内核是操作系统常驻内存的部分,当进程需要某系操作系统的某些操作时(如读写文件),通过一条系统调用将控制权交给内核,内核执行完相应操作后返回应用程序。