csapp第一章 计算机系统漫游 学习和理解

 计算机系统是由硬件和系统软件组成的。

系统的具体实现在变,但系统内在的概念没有变。

所有的系统都有相似的硬件,相似的软件组件,它们执行着相似的功能。

这些组件是如何工作的?这些组件是如何影响程序的正确性和性能的?本书予以解答。

K&R的hello程序要完成运行,系统的每个组成部分都需要协调工作。本书就是告诉你在系统上运行hello程序时,系统发生了什么以及为什么会这样。

1.1 信息就是位+上下文

图1-2真的是hello.c的ASCII码表示,除了可见的字符外,不可见的是sp和\n,从第一个到最后一个完整的表示出来。这就是文本文件。

“\n”是在每一行的结尾处,或者说有“\n"才有一行的结束,其表现就是光标到了下一行,另起一行。

这里说ASCII字符构成的文件称为文本文件,所有其他文件都是二进制文件,我想有点不对,应该是所有由编码字符构成了文件是文本文件,其他是二进制文件。编码字符不止ASCII,还有UTF-8等等,ASCII不可以表示中文。

系统的所有信息都是一串位,区分这些位表示什么信息的方法,唯一方法,是读到这些位时候的上下文。

这个上下文既然是从位的角度讲的,那么至少也是在汇编语言级别去解释,比如mov,是movb还是movw,这种就应该算是上下文,更底层的机器语言就看不懂了。c语言也不是,c的表达方式就已经在文本级别了,与位其实有一定的差距了。(这句话的理解也不知道对不对,暂且不管)

c语言是系统级编程的首选,同时也非常适用于应用级程序的编写。c++和java是应用级程序的新的程序设计语言。

1.2 程序被其他程序翻译成不同的格式

可执行目标文件是二进制文件,是按照一种格式打包起来的,这个格式称为可执行目标程序,打包的对象是从每条c语句转化出来的低级机器语言指令。

编译器驱动程序完成从源文件到可执行目标文件的转化。这里有驱动两个字。

转化的过程有4个阶段,分别用到预处理器,编译器,汇编器,链接器。

  • 预处理器处理的是以字符#开头的命令,也就是说#开头的就是预处理命令,会经过预处理器处理。
  • 编译器为不同的高级语言的不同的编译器提供了通用的输出语言—汇编语言。
  • 汇编器也会打包,按照可重定位目标程序的格式来打包。二进制文件的字节编码是机器语言指令而不是字符。
  • 链接器,每个程序不可避免的会使用到一些标准库里的函数什么的,每个编译器都包含了c的标准库,存放在可重定位目标程序格式打包的文件中(我认为),将这个文件和汇编器产生的文件合并,就是链接器的作用。然后,结果是得到了可执行目标文件,打包格式为可执行目标程序。

1.3 了解编译系统如何工作是大有益处的

优化程序性能-我们确实需要了解一些机器代码以及编译器将不同的c语句转化为机器代码的方式。

两种机器语言:IA32和X86-64,3章学习这个,机器语言,说的是机器语言还是汇编,应该是一样的,汇编和机器是一一对应的。所以就是机器语言。

3章学习这两个语言,5章学习如何优化程序性能,6章学习存储器系统

3章还将学习堆栈原理和缓冲区溢出错误,这是大多数安全漏洞的主要原因。

1.4 处理器读并解释存储在存储器中的指令

shell是一个命令行解释器。

所有系统都有的相同外观和特性:总线,字长是一个基本的系统参数,4字长就是32位。I/O设备,每个I/O设备都通过一个控制器或者适配器与I/O总线相连;控制器是芯片组,或在主板上或在I/O设备本身上;适配器是插在主板插槽上的卡。

处理器的核心是程序存储器(PC),是一个字长的存储设备,或者说寄存器。PC中始终存着某条指令的地址。这说明一个事情:地址是一个字长的。(至少表面上看是这样的)。

寄存器文件是由一些1字长的寄存器组成的。ALU计算新的数据和地址。

CPU执行:

  • 加载——把一个字节或者一个字从主存复制到寄存器。
  • 存储——把一个字节或者一个字从寄存器复制到主存。
  • 操作——两个寄存器的内容复制给ALU,ALU算术运算,并将结果存放到一个寄存器中
  • 跳转——从指令本身中抽取一个字,并复制到PC中。

3章介绍指令集结构(每条指令的效果),4章介绍微体系结构(处理器的实现)。

1.5 高速缓存至关重要

意识到高速缓存存在的应用程序员可以利用高速缓存将他们程序的性能提高一个数量级。6章将介绍。

1.6 存储设备形成层次结构

每个计算机系统中的存储设备都被组织成了一个存储器层次结构。

1.7 操作系统管理硬件

操作系统有两个基本功能:1防止硬件被失控的应用程序滥用,2应用程序提供简单一致的机制来控制复杂而又通常大相径庭的低级硬件设备。

操作系统通过几个基本的抽象概念来实现这两个功能:进程,虚拟存储系统,文件。文件抽象I/O设备,虚拟存储器抽象文件和主存,进程抽象虚拟存储器和处理器。

系统上只有一个程序的假象,是通过进程的概念来实现的。

进程是操作系统对正在运行的程序的一种抽象。操作系统进行的抽象。

一个cpu看上去像是在并发的执行多个进程,这时通过处理器在进程间切换来实现的。操作系统实现这种交错执行的机制是上下文切换。

上下文是操作系统保持跟踪进程运行所需的所有状态信息。包括:PC和寄存器文件的当前值,主存的内容。

单处理器系统在任何时候都只能执行一个进程的代码。

shell是一个进程,hello是一个进程。8章介绍进程的实现。

每个线程都运行在进程的上下文中,并共享同样的代码和全局变量。12章学习写线程化的程序。

虚拟存储器为进程提供了一个假象,即每个进程都在独占地使用主存。

每个进程看到的是一致的存储器,称为虚拟地址空间。一致的,就是说一样的。

在linux中,每个进程看到的虚拟地址空间由大量准确定义的区组成。空间从底部向上地址不断增加。

  • 对于所有的进程来说,代码是从同意固定地址开始,就是程序的代码(这里应该是编译后的机器代码了)从确定的位置开始。也就是虚拟地址空间的底部都具有相同的地址,从这个地址开始首先存放的是代码,然后是c全局变量。这两者是按照可执行目标文件的内容初始化的。7章会学到更多有关地址空间的内容。
  • 在代码和数据后是堆,运行时堆,代码和数据区在进程开始的时候就规定了大小,这是正常的,因为代码和全局变量是不会变化的。堆会动态的扩展和收缩,c中使用malloc和free这两标准库函数就会有这种效果。9章更详细的研究堆。
  • 大约在地址空间的中间部分是一块用来存放像C标准库和数学库这样共享库的代码和数据的区域。也是代码和数据的区域。7章将学习共享库是如何工作的。
  • 位于用户虚拟地址空间顶部的是用户栈,编译器用它来实现函数调用。也会收缩和扩展,调用一个函数时就增长,从一个函数返回时就收缩。这里的栈是在顶部,用户虚拟地址空间的顶部,上面还有内核虚拟存储器,这个不管,在用户虚拟地址空间的顶部说明栈是向下增长的,而堆紧靠着代码和数据区说明堆是向上增长的,两者中间是共享库区,好理解。3章学习编译器是如何使用栈的。
  • 内核总是驻留在内存中的,是操作系统的一部分,地址空间顶部的区域(不是用户虚拟地址空间,而是虚拟地址空间)是为内核保留的,不允许应用程序读写这个区域的内容或者直接调用内核代码定义的函数。应用程序只能使用操作系统提供的统一的接口吧,这些接口既然不在内核中(因为不能使用内核代码),所以应该在共享库中。

9章将详细解释虚拟存储器系统如何工作。

文件就是字节序列,仅次而已。I/O设备可以视为文件。

系统中所有输入和输出都是通过使用一小组称为Unix I/O的系统函数调用读写文件来实现的。

这里有个概念,I/O就是输入和输出,I/O设备就是可以输入和输出的设备。而文件可以读和写,读和写又可以看作是输出和输入。所以,I/O设备与文件具有核心的共性。所以可以抽象。10章介绍Unix I/O。

1.8 系统之间利用网络通信

网络可以视为一个I/O设备,适配器就是网络适配器(网卡,有线的或者无线的),而网络就是一个I/O设备。11章讲学到如何构造网络应用程序,并利用这些知识创建一个简单的web服务器。

1.9 重要主题

系统是硬件和软件相互交织的集合体。系统又是硬件和应用程序之间的一层软件。系统可以有很多名字。

在此再次强调几个贯穿计算机系统所有方面的重要概念:

并发(concurrency)指同时具有多个活动的系统。并行指用并发使系统更快。并行可以在计算机系统的多个抽象层次上运用。从高到低的三个层次:

线程级并发:单处理器系统--只有一个处理器的系统,这种系统也是可并发的,因为比如奔4的单核系统就可以变听歌边上网。但这种并发是模拟出来的,是的,这就是模拟出来了,是单处理器在不同进程之间不断切换来实现的,这种就叫模拟出来的并发。

多处理器系统分两种:多处理器和超线程。

  • 多处理器是一个集成电路芯片上有多个核(cpu),一个核完整的应该是计算单元,寄存器文件,L1高速缓存(L2高速缓存);这称为一个核,一个cpu。
  • 超线程是指一个核执行多个控制流的技术,事实上,一个进程中多个控制流就指多个线程。这个时候的核可以只有一个计算单元,但是寄存器文件和L1高速缓存可能就有多组,由于内存中共用虚拟地址空间(一个进程吗)所以几组寄存器和L1高速缓存就可以有几组线程。常规的处理器需要大约20000个时钟周期来做不同线程间的切换,而这种超线程技术的处理器之用一个周期。

这种多处理器系统才可以说是真的做到了并发吧。

指令级并行;这个微机原理中其实讲的比较清楚,就是取指令和处理指令其实是分开的,多条指令的不同步骤可以同时的进行,这个就是指令级并行,4章研究流水线的使用,5章介绍超标量处理器的高级模型。

单指令/多数据并行:一条指令可以产生多个可以并行执行的操作。上面的是多个指令并行的执行,这个是一个指令的不同部分并行的执行。SIMD并行。

最高级别是线程级并发,其实多核就是进程级的并发了,超线程是线程级的并发。再往上,就没有了。进程已经到顶了。

抽象是计算机科学中最为重要的概念之一。

指令集结构是对实际硬件的抽象,表示的是执行模型。两个处理器的执行模型一样不代表实际硬件的实现方式一样,虽然由于执行模型相同,也就是指令集相同,所有可以执行相同的机器语言代码,但是却有不同的开销和性能。

1.10 小结

(OVER)

转载于:https://www.cnblogs.com/rayhill/archive/2012/04/15/2450641.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值