深入理解计算机系统第一章总结

 
 
#include<stdio.h>
int main(void){
print("hello world");
return 1;
}

hello程序的生命周期从一个高级C语言程序源文件开始的。经过预处理器(cpp)、编译器(cc1)、汇编器(as)、链接器(ld)生成一个可执行文件。

预处理阶段:预处理器处理按照源文件#开头命令处理。例如#include(stdio.h)将stdio.h头文件的信息插入到源文件文本中。生成以.i扩展名的文本文件。

编译阶段:编译器将预处理过后的文本文件翻译成汇编文本文件。生成以.s扩展名的汇编文本文件。

汇编阶段:汇编器将汇编文件翻译成可重定向二进制文件,一般以.o为扩展名。

链接阶段:hello程序调用了函数printf,它是每个C编译器都提供的库函数。链接器将hello.o和printf.o链接生成可执行的二进制文件。

无论是指令、文本、数字,计算机只将其存储为二进制数据。计算机本身无法识别存储的是何种数据,一样的数据可能表示为文本、数字或者指令,只能依靠上下文来区别。

运行hello程序

初始时,我们从shell输入./hello,shell读取来自键盘的字符流,例如当我们输入字符 字符从键盘通过IO总线到IO桥通过系统总线,到CPU,通过内存总线保存到内存。然后又到CPU,最终到达显示器(暂时不考虑缓存)。当我们按键回车时,shell判断我们输入结束

然后shell程序读取存入内存的字符流,利用直接存储器存取技术(DMA),可以不通过CPU,直接将hello程序从硬盘传送到内存中


CPU读取内存中的hello程序,将“hello world”从内存读取到CPU,在通过iO总线打印到显示器上。

运行hello程序的过程中,大家可以发现,计算机花费了大量时间将数据从一个地方移到另一个地方,这些时间就是系统开销。

现代CPU都有缓存系统

一般情况,速度越快,容量越小,单位价格也越贵。而速度越慢的一般容量更大,单位价格更加便宜。由于程序的局部性原理,我们可以通过缓存系统以廉价的方式存储程序,同时以告诉的存储器运行程序。

让我们回到hello程序,当我们输入./hello调用hello程序时,shell和hello都没有直接访问内存、硬盘、键盘、显示器,这些都是通过操作系统提供的提供调用来间接操作的。我们可以把操作系统看成应用程序和硬件之间的一层软件。他对应用程序提供了简单一致的接口,屏蔽了复杂又大不相同的硬件资源。同时可以防止应用程序失控的滥用硬件。应用程序通过一个简单的抽象提供这两种服务。

文件:文件是一个简单而又强大的概念。在Linux系统中,一切的IO设备都抽象为文件,文件就是字节流。写文件就是字节流从内存流入IO设备,读文件就是IO设备字节流流入内存。文件这个概念为不同的IO设备提供的统一的接口。

虚拟内存:一个程序运行中,好像自己全部的占有内存。这就是通过虚拟内存实现的。虚拟内存是对内存和块设备(一般指硬盘)的抽象,给每个程序提供了比实际内存大的多了内存空间,同时每个程序占用的内存看上去又不相互影响。

进程:进程是现代计算机科学中最重要的概念之一,进程为应用程序提供了一个假象,好像自己的独享CPU和一起设备资源。这是通过保存上下文来实现的,当一个进程切换到另一个进程时,操作系统保存当前进程的所有状态信息,指令计数器,寄存器以及内存中的内容,同时将下一个进程保存的状态信息回复成上次终止时的状态。好像所有进程一直再运行。

猜你喜欢

转载自blog.csdn.net/u013259665/article/details/80289511