#include <stdio.h>
int main()
{
printf("hello world\n");
return 0;
}
这么一段简单的程序,当我们在键盘上敲下回车的时候,系统都做了什么事情呢?
登录系统本机执行
寄存器
,再放入内存
磁盘
复制到主存main
程序中的机器语言
指令主存器复制到寄存器
寄存器
复制到显示设备
,既而显示在屏幕上。通过xshell或securCRT远程连接到主机上执行
磁盘
复制到主存main
程序中的机器语言
指令主存器复制到寄存器
呃,看起来好像不大简单的亚子。如果对计算机系统工作机制没有一定了解,理解起来确实会有困难。我们逐一来看。
1
一、系统可执行文件是什么
hello可执行文件在被系统执行前其实是已经被编译器编译过后可被机器识别的机器语言,对人类不可读。以C语言为例。
Linux> gcc -0 hello hello.c
预处理器(cpp)先根据文件首行#开着的命令,修改原始C程序,如hello.c首行的#include<stdio.h>命令告诉预处理器读取系统头文件 stdio.h的内容,并把他直接插入到程序文本中。结果就得到另外一个C程序。通常以.i作为文件扩展名
ccl编译器将文本文件 hello.i 翻译为hello.s 汇编语言(低级机器语言),早期程序员使用的语言,阿波罗登月计划中的航天员也需要掌握这门语言。但因为学习门槛高,遂衍生出各类高级语言,如C,Python,php,java等。
as汇编器将hello.o翻译为机器语言,即纯二进制,并将文件翻译到hello.o文件中。此时的文本才真正可被计算机操作系统识别
每个C编译器都会提供C标准库的标准函数。main函数调用通过链接器ld负责处理。
最后hello文件被shell调用处理,最后被系统执行。
2
二、CPU工作原理
CPU单元主要由PC,寄存器,ALU,总线接口,系统总线组成,与其紧连的是I/O桥,内存总线,主存储器(内存)。这些设备统一经由I/O总线和USB,图形适配器,磁盘控制器传递信息。
总线贯穿整个主板的电子管道,其负责信息的传递,通常被设计为传送室长的字节块。现代系统多为字节或8字节,不同系统可能存在差异。
学名动态随机存取器(DRAM),临时存储设备。在处理器执行程序时,用来存放程序和程序处理的数据
中央处理单元(CPU),简称处理器,是执行存储在主存中指令的引擎,核心是大小为一个字的PC寄存器,称为程序计数器PC,而ALU则负责算术/逻辑计算处理。从系统通电开始直至系统断电,处理器一直不断更新PC指令地址,支配ALU处理PC指向的寄存器中指令地址的任务。
看起来处理器的工作模式非常简单,在现代计算机工艺中,为了提升效率,CPU的模型设计由指令集架构决定,实际工艺非常复杂。
CPU在指令的要求下常有操作的:
从主存中复制一个字节或一个字到寄存器,以覆盖寄存器原来的内容
从寄存器复制一个字节或一个字到主存的某个位置,以覆盖这个位置上原来的内容
把两个寄存器中的内容,复制到ALU,ALU对这两个字做算术运算,并将结果存放到一个寄存器中,以覆盖原来的内容
从指令本身抽取一个字,并将这个字复制到程序计数器PC中,以覆盖PC中原来的值。
程序运行在操作系统之上,操作系统除了运行程序指令集外,还有的功能
3
三、操作系统的作用
回到hello程序执行过程,这里能看到有很多复制
操作,系统花费大量时间把信息从一个地方复制到另一个地方,减慢了程序的“真正”工作,系统设计者的目标就是使这些复制操作尽可能快完成。
这也是处理器中L1 L2 L3缓存出现的原因。通过硬件技术实现。SRAM(静态随机访问存储器),使内存中的复制操作大部分可以在高速缓存中完成。系统利用高速缓存的局部性原理,提升整体运行速度。
4
四、进程、线程、上下文的本质
hello程序执行时,PC会根据任务更新寄存器指令地址。如hello运行期间所有的资源(磁盘、alu、网络等)会供hello进程使用,hello运行完毕后,PC会指向新地址,回收hello进程的资源权限,传递给shell进程,等待用户输入。
在这个过程中,shell进程和hello程序运行进程的交替执行过程就是上下文切换,此过程中shell进程和hello进程形式上“独占”
资源的理念来自于进程
的伟大设计
进程是计算机科学史上最成功最重要的概念之一,进程是计算机系统对正在运行的程序的一种抽象。
一个进程指令和另一个进程指令交替执行。传统系统一个时刻只能执行一个程序。先进的多核处理器
可以并发执行多个进程 ,这是通过处理器在进程间切换来实现的
。操作系统实现这种交错执行的机制为上下文切换
。
操作系统保持跟踪进程运行所需的所有状态信息称为为上下文
。如PC和寄存器文件的当前值,以及主存的内容。当系统决定把控制权从当前进程转移传递到新进程时
,就会进程上下文切换
。即保存
当前进程的一下文,恢复新进程的上下文,然后新控制权传递给新进程,新进程就会从上次停止的地上开始。
从一个进程到另一个进程的转换是由操作系统内核Kernel管理的。内核是操作系统的常驻进程。进程需要的系统资源调度通过内核进程,但内核不是独立的进程。相反,他是系统管理全部进程所用代码和数据结构的集合。
通常我们认为进程是只有单一的控制流,是系统中运行的最小单位。在现代操作系统中,进程通常由多个线程的执行单元组成。每个线程都运行在进程的上下文,并共享同样的代码和全局数据。由于网络服务器对并行处理的需求越来越多,线程编程也越来越重要。多线程比多进程更容易共享数据。因此当有多处理器可用时,多线程也是一种使程序可以运行更快的方式。
【the end】