1:计算机系统漫游

本周开始了CSAPP的读书计划,规划已久,终于要开动了。之前自己也零散看过,不得不说这本书有难度都没坚持下去,这次跟着码农翻身小伙伴们一起打卡这本书。

CSAPP这本书不用多说绝对经典中的经典,如果想成为一名知道计算机硬件和软件如何工作,了解其如何影响程序的正确性和性能的程序员,那么一定得看啊。

如果能完全理解本书讲解的计算机系统以及它对应用程序的影响,那么恭喜你,你走上了一条为数不多的大牛道路。

在开始之前,我们先看一个最常见的程序:

#include <stdio.h>
int main()
{
    printf("hello,world\n");
    return 0;
}

本文就从上面这个最简单的hello程序展开,沿着它的生命周期展开学习.

程序的保存格式

上面的hello程序其实就是一个由值 0 和 1 组成的位(即比特)序列,8个位成一组,称为字节。我们输入文本hello.c文件中的字符即用每个字节来表示(大部分计算机系统都是用ASCII标准来表示字符,即把字节转为整数值)。

总结: 信息=位+上下文

程序是如何运行的

hello程序的诞生使用C语言来编写的,好处是人可以读懂,但是为了在系统上运行,还是得转化为一系列低级的机器语言指令。

在Unix系统上,从源文件到目标文件的转化得靠编译器, 下面记录编译过程:


1.png
  1. hello.c需要经过预处理器读取系统头文件内容并且插入到程序文本中得到一个新的C程序,一般以.i作为扩展名;
  2. 然后编译器将文本文件hello.i 翻译成汇编语言文本文件hello.s
  3. 接下来,就该汇编器登场,将汇编语言翻译成机器语言指令,并保存到hello.o文件中,此时它是一个二进制文件了
  4. 最后链接阶段,将程序中调用的c标准库的函数合并到我们的hello.o程序中,结果就是一个可执行文件,可以被加载到内存中,由系统执行。

系统的硬件组成

要真正了解程序时如何运行的,首先要对系统的硬件组成有一个了解:

  1. 总线:贯穿整个系统的电子管道,可以理解为所有的数据设备以及系统之间的数据流转都要接到总线上。

  2. I/O设备:系统与外部世界的联系通道;比如键盘、鼠标、磁盘、显示器等;

    所有的I/O设置都要通过一个控制器或者适配器与I/O总线相连;

  3. 主存:也就是我们常说的内存,这是一个临时存储设备,在处理器执行程序时,用来存放程序和处理的数据;

  4. 处理器:也就是我们常说的CPU,是解释存储在主存中指令的引擎;其核心是一个大小为一个字(定长的字节,根据系统不同确定)的寄存器,称为程序计数器(PC)。在程序运行的过程中,PC都是指向主存中的一条机器语言指令。

    从系统通电开始,直到系统断电,处理器一直在不断的执行PC指向的指令,在更新PC,使其指向下一条指令;

    下面列举几个CPU在指令要求下可能执行的操作:

    • 加载:从主存复制一个字到寄存器,已覆盖原有寄存器的内容;
    • 存储:从寄存器复制一个字到主存的某个位置,以覆盖这个位置的原有值;
    • 操作:把两个寄存器的内容复制到ALU(算数/逻辑单元),ALU对这两个字做算数运算,并将结果存放到一个寄存器中覆盖原有的内容;
    • 跳转:从指令本身抽取一个字,并将这个字复制到PC中,以覆盖PC中原来的值;

    处理器看上去是它的指令集架构的简单实现,但是现代处理器采用非常复杂的机制来加速程序的运行。因此我们在理解的时候要将处理器的指令集架构 和处理器的 微体系结构分来:指令集架构描述的是每条机器代码指令的效果;微体系结构描述的是处理器的实现;

运行程序

当我们在执行 ./hello 后,其实发生的过程是:

刚开始,shell程序执行它的指令,等待我们输入一个命令,当我们输入./hello 后,shell程序将字符读入寄存器,在把它存放到内存中;

当你在敲回车时,shell程序就知道我们已经结束了命令的输入,然后shell执行一系列指令来加载可执行文件,将目前文件的代码和数据复制到主存。注:利用直接存储器(DMA)技术,数据可以不到处理器直接从磁盘到主存。

一旦加载到内存中,处理器就开始执行程序的main机器指令,这些指令将“hello,world\n” 字符串中字节从主存复制到寄存器文件。再从寄存器文件复制到显示设备,最终展示在屏幕上。

2.png

高速缓存

​ 从上面的例子,我们可以总结出,hello程序经历了从开始在磁盘上,加载时被复制到主存,处理器运行时又从主存复制到处理器,最后又从处理器复制到显示器。

​ 这里从我们程序员角度讲,这些复制就是开销,那么问题来了,如何减小开销提高处理器效率呢???

从机械原理角度来看,存储设备越大运行越慢;处理器读磁盘比读内存开销大1000万倍,而寄存器文件的读取速度又比内存块几乎100倍,加快处理器的运行速度比加快主存运行速度要容器的多。

​ 针对处理器与主存之间的差异,系统设计采用了更小更快的存储设备,称之为高速缓存,存放处理器近期可能会需要的信息。这个其实和我们平时开发程序是一样的,采用多级缓存,存放热点数据,提高系统处理能力。 这里的原理是利用程序具有访问局部区域里的数据和代码的趋势,所以高速缓存中存放了可能经常访问的数据,这样大部分操作就能在告诉缓存中完成。

请看下面的存储器层次的结构,相信你会一目了然:

3.png

如图所示,上一层存储器是下一层的高速缓存。

操作系统管理硬件

我们写的程序,没有直接访问键盘、显示器、磁盘等硬件,而是依赖操作系统提供的服务,所以可以把操作系统看成是应用程序和硬件之间一层软件。

4.png

操作系统有两大功能:

  1. 防止硬件被滥用;
  2. 对应用程序屏蔽底层复杂而通常又大不相同的硬件设备,提供简单一致的机制;

操作系统通常抽象出几个概念:进程、虚拟内存、文件;

进程

进程是操作系统对一个正在运行的应用程序的抽象,一个系统可以同时运行多个进程。

单核处理器一个时刻只能执行一个程序,而目前的多核处理器能同时执行多个程序。无论单核还是多核,一个CPU看上去都是在并发执行多个进程,这是通过处理器在进程间切换来实现的,这种切换被称为 上下文切换

进程之间的切换是由操作系统内核管理的,内核是操作系统常驻主存的部分。当应用程序需要操作系统的某些操作时,比如读写文件,它就执行一条系统调用指令,将控制权传递给内核。然后内核执行被请求的操作并返回应用程序。 注意,内核不是一个独立的进程,它是系统管理所有进程所用代码和数据结构的集合。

线程

一个进程实际上是由多个称为线程的执行单元组成,每个线程都运行在进程的上下文中,并共享同样的代码和全局数据。

优点:比进程之间更容易共享数据;一般来讲也比进程更高效;

虚拟内存

这是一个抽象概念,它为每个进程提供了一个假象,即每个进程都在单独使用主存,每个进程看到的内存都是一致的,称为虚拟地址空间,如下图所示,地址是从小往上增大的:

5.png

文件

文件就是字节序列,所有的I/O设备,甚至网络都可以看成是文件;

并发

多核处理器是将多个CPU集成到一个集成电路芯片上。多核处理器组织架构如下:

6.png

超线程:称为同时多线程,允许一个CPU同时执行多个并发流的技术。Intel Core i7 处理器可以让每个核执行两个线程。

计算机系统中的抽象

在处理里,指令集架构提供了对实际处理器硬件的抽象,使用这个抽象,机器代码表现的好像运行在一个一次只执行一条指令的处理器上。不管底层多复杂精细,哪怕可以并发的执行多条指令,担又总是与那个简单有序的模型保持一致。只要模型一样,不同的处理器实现也能执行同样的机器代码,而又提供不同的开销和性能。这种抽象思想简直太重要了,在整个计算机科学中也随处可见,比如java类的生命和C语言的函数原型,以及计算机网络的分层。

7.png

看了这上面的图可以总结为:

  1. 文件是对I/O设置的抽象;
  2. 虚拟内存是对主存和磁盘的抽象;
  3. 进程是对处理器、主存和I/O设备的抽象;

至此,本章的学习就结束了,主要对计算机系统的组成和程序运行有了大框架的认知,后续继续进行深入学习。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 161,873评论 4 370
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,483评论 1 306
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 111,525评论 0 254
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,595评论 0 218
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 53,018评论 3 295
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,958评论 1 224
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,118评论 2 317
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,873评论 0 208
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,643评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,813评论 2 253
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,293评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,615评论 3 262
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,306评论 3 242
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,170评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,968评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,107评论 2 285
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,894评论 2 278

推荐阅读更多精彩内容

  • 计算机系统漫游 代码从文本到可执行文件的过程(c语言示例):预处理阶段,处理 #inlcude , #defin...
    willdimagine阅读 3,509评论 0 5
  • 计算机系统漫游 信息是位 + 上下文 hello程序文件名为hello.c,源程序实际上是由0,1组成的位(又称比...
    ChaLLengerZeng阅读 327评论 0 0
  • 计算机系统是由硬件和软件系统组成的,它们共同工作来运行应用程序。作为程序员,也需要了解这些组件是如何工作的,以及这...
    knightaoko阅读 656评论 0 2
  • 计算机是由硬件和软件系统组成的。本章的内容主要讲述一个hello程序的生命周期:从被程序员创建开始,到在系统上运行...
    萧关逢候骑阅读 487评论 0 0
  • 本文借鉴自深入理解计算机系统和南京大学的计算机系统基础,只作为学习总结用。 一 计算机基本原理 1.信息就是位+上...
    古剑诛仙阅读 1,575评论 0 1