计算机系统漫游
计算机系统是由硬件和系统软件组成的
我们将通过hello程序的生命周期来开始对系统的学习
#include<stdio.h>
int main()
{
printf("hello world\n");
return 0;
}
- 创建
- 编译
- 运行
- 终止
创建
通过编辑器写好hello.c.
源程序实际上是由值0和1组成的位序列,8个位被组织成一组,成为字节。
即 1 byte = 8 bit
大部分的现代计算机操作系统都是用ASCII标准来表示文本字符
在linux中可使用命令 man ascii
查看ascii标准
如下图为hello.c程序的ascii码表示
hello.c程序是以字节序列的方式存储在文件中的。
每个文本行都是以一个看不见的换行符'\n'来结束的。
像hello.c这样只由ASCII字符构成的文件称为文本文件
所有其他的文件都称为二进制文件
编译-> 程序被其他程序翻译成机器能够读懂
为了能够在系统上运行hello.c程序
每条C语句都必须被其他程序转化为一系列的低级机器语言指令
最后生成目标程序
在linux上从源文件到目标文件的转化是由编译器驱动程序完成
linux> gcc hello.c -o hello
利用gcc将hello.c翻译成一个可执行的目标文件hello
翻译过程分为4个阶段完成,构成编译系统
-
预处理器
根据以字符#开头的命令,修改原始的C程序
比如#include
命令告诉预处理器读取系统头文件stdio.h内容。最终得到另一个C程序,即hello.i -
编译器
将文本文件hello.i翻译成文本文件hello.s
为一个汇编程序
-
汇编器
汇编器将hello.s翻译成机器语言指令,把这些指令打包成一种可重定位目标程序的格式,并将结果保存在目标文件hello.o中。hello.o是一个二进制文件
-
链接器
hello程序中调用了printf函数,它是每个C编译器都提供的标准C库中的一个函数。printf函数存在于一个名为printf.o的单独的预编译好了的目标文件中。链接器负责处理这种合并。最终得到hello文件,它是一个可执行目标文件,可以被加载到内存中,由系统执行。
全部过程
gcc -E hello.c -o hello.i #预处理
gcc -S hello.i -o hello.s #得到汇编程序
gcc -c hello.s -o hello.o #生成目标文件
gcc hello.o -o hello #链接,得到可执行文件
系统的硬件构成
-
总线
贯穿整个系统的是一组电子管道,称作总线
它携带信息字节并负责在各个部件间传递
通常总线被设计成传送定长的字节块
4个字节即32位
8个字节即64位
-
I/O设备
I/O设备是系统与外部世界的联系通道
- 键盘
- 鼠标
- 显示器
- 磁盘
最开始,可执行程序hello就放在磁盘上
-
主存
主存是一个临时存储设备
在处理器执行程序时,用来存放程序和程序处理的数据
-
处理器
cpu
解释或执行存储在主存中指令的引擎
处理器的核心是一个大小为一个字的存储设备(寄存器)
称为程序计数器(PC)
在任何时刻,PC都指向主存中的某条机器语言指令
运行hello程序
./hello
高速缓存
hello程序的机器指令最初是存放在磁盘上
当程序加载时,它们被复制到主存
当处理器运行程序时
指令又从主存复制到处理器
然而复制的开销比较大
因此高速缓存至关重要(cache高速缓存)
作为暂时的集结区域,存放处理器近期可能会需要的信息
操作系统管理硬件
当shell加载和运行hello程序时
以及hello程序输出自己的信息时
shell和hello程序都没有直接访问键盘,显示器,磁盘或者主存
它们依靠操作系统提供的服务
可以把操作系统看成是应用程序和硬件之间插入的一层软件
所有应用程序对硬件的操作尝试都必须通过操作系统
操作系统的两个基本功能
- 防止硬件被失控的应用程序滥用
- 向应用程序提供简单一致的机制来控制复杂而又通常大不相同的低级硬件设备
操作系统的几个基本的抽象概念
- 进程
13033即是该程序运行时的进程号
进程是计算机科学中最重要和最成功的概念之一
进程是操作系统对一个正在运行的程序的一种抽象
在一个系统上可以同时运行多个进程
而每个进程好像都在独占地使用硬件
这是通过处理器在进程间切换来实现的
操作系统会保持跟踪进程运行所需的所有状态信息
这种状态也就是上下文
实例场景
shell进程和hello进程
最开始只有shell进程在运行,即等待命令行上的输入
当我们让它运行hello程序时
shell通过调用一个专门的函数来执行我们的请求
系统调用会将控制权传递给操作系统
操作系统保存shell进程的上下文
创建一个新的hello进程以及其上下文
然后将控制权传给新的hello进程
当hello程序进程终止后
操作系统恢复shell进程的上下文
并将控制权传回给它
shell进程会继续等待下一个命令行输出
从一个进程到另一个进程的转换是由操作系统内核管理的
- 线程
在现代系统中
一个进程实际上是可以由多个称为线程的执行单元组成
每个线程都运行在进程的上下文中
并共享同样的代码和全局数据
- 虚拟内存
虚拟内存是一个抽象概念
它为每个进程提供了一个假象
即每个进程都在独占地使用主存
- 文件
文件就是字节序列
每个I/O设备
包括磁盘,键盘,显示器,甚至网络
都可以看成是文件
系统中所有输入输出都是通过使用一小组称为Unix I/O的系统函数调用读写文件来实现的
系统之间利用网络通信
现代系统经常通过网络和其他系统连接到一起
从一个单独的系统来看
网络可视为一个I/O设备
当系统从主存复制一串字节到网络适配器时
数据流经过网络到达另一台机器
总结系统漫游
系统不仅仅只是硬件
系统是硬件和系统软件互相交织的集合体
它们必须共同协作以达到运行应用程序为最终目的