您的位置:首页 > 理论基础

深入理解计算机系统--读书笔记(第一章)

2015-11-15 15:21 288 查看

1.1信息就是位+上下文(Information Is Bits + Context)

源程序实际上就是一个由0和1组成的位(bit)序列,8 个位被组织成一组,称为字节。

每个字节表示程序中某个文本字符。
大部分的现代系统都使用ASCII标准来表示文本字符,单字节大小的整数值来表示每个字符。
这样只由ASCII码构成的文件称为文本文件,所有其他文件称为二进制文件

系统中所有的信息----包括磁盘文件、存储器中的程序、存储器中存放的用户数据和网络中上传送的数据,都是又一串位表示的。区分不同的数据对象的唯一方法,是我们读到这些数据对象时的上下文。

gcc -o hello hello.c
在unix系统上,从源文件到目标文件的转换时由编译器驱动程序完成的:
预处理器(pre-processor),编译器(compiler),汇编器(assembler),连接器(linker)一起构成了编译系统

预处理阶段:预处理器(cpp)根据以#开头的命令,修改源码,通常会得到是以 .i 作为扩展名的文件
编译阶段:编译器(cc1)将文本文件hello.i翻译成文本文件hello.s,它包含一个汇编语言程序
汇编阶段: 汇编器(as)将文本文件hello.s翻译成机器语言指令,把这些指令打包成一种可重定位目标程序(relocateble object program),并将结果保存在目标文件hello.o中,这是个二进制文件
链接阶段:链接器(ld)以某种方式合并目标文件,得到hello二进制文件,这是个可执行目标文件

1.3了解编译器系统如何工作是大有益处的(It Pays to Understand How Compilation Systems Work):

优化程序性能(第三章)
理解链接时出现的错误(第七章)
避免安全漏洞(第三章)

1.5高速缓存Cache至关重要(第六章)

可执行文件hello最初是放在磁盘上的,当程序被加载时,它被复制到主存;当处理器运行程序时,指令又从主存复制到处理器。
从程序员的角度,这些复制就是开销,减缓了程序真正的工作。因此,系统设计者的一个主要目标就是使这些复制操作尽可能快地完成
处理器从寄存器中读数据的速度比处理器从主存中读取的速度快几乎一百倍。
针对这种处理器与主存之间的差异,系统设计者采用了更小,更快的的存储设备,即高速缓存存储器

系统可以获得获得一个很大的存储器,同时访问速度也很快,原因是利用了高速缓存的局部性原理,即程序具有访问局部区域里的数据和代码的趋势,通过让高速缓存里存放可能经常访问到的数据的方法,大部分的存储器操作都可以在快速的高速缓冲中完成。
结论:意识到高速缓存存在的应用程序员可以利用高速缓存将它们的程序性能提高一个数量级

1.6存储设备形成层次结构(Storage Devices Form a Hierarchy)(第六章)



从上至下,设备的访问速度越来越慢,设备容量越来越大,并且每字节的价格越来越便宜

1.7操作系统管理硬件(The Operating System Manages the Hardware)

操作系统可以看做是程序和硬件之间插入的一层软件,所有应用程序对硬件的操作尝试都必须通过操作系统
操作系统有两个基本功能:

防止硬件被失控的应用程序滥用
向应用程序提供简单一致的机制来控制复杂的硬件设备

操作系统通过几个基本的抽象概念(进程、虚拟存储器、文件)来实现这两个功能

如图:文件是对I/O设备的抽象表示,虚拟存储器是对主存和I/O设备的抽象表示,进程则是对处理器、主存和I/O设备的抽象表示。

1.7.1进程(Processes)(第八章)
进程是操作系统对一个正在运行的程序的一种抽象。在一个系统上可以同时运行多个程序,且每个进程都好像在独占的使用硬件。而并发运行则是说一个进程的指令和另一个进程的指令交错执行。

无论是单核还是多核系统中,一个cpu看上去是在并发的执行多个进程,这是通过处理器在进程间切换来实现的。操作系统实现这种交错执行的机制称为上下文切换。
操作系统保持跟踪进程运行所需要的所有状态信息,这种状态就称为上下文(它包括许多信息:例如PC和寄存器文件的当前值,以及主存的内容)。

在任何一个时刻,单核处理器都只能执行一个进程的代码。当操作系统决定要把处理器的控制权由当前进程手里收回拿给另外一个进程(即将运行的进程)时,就会进行上下文切换(即保存当前进程的上下文,恢复即将运行进程的上下文,然后再转移处理器的控制权,新进程就会从上次停止的地方开始)

hello:
示例场景中有两个并发的进程:shell进程和hello进程。

起初只有shell进程在运行,即等待命令行的输入。
当我们敲入./hello让它执行hello程序时,shell通过调用一个专门的函数,即系统调用,来执行我们的请求,系统调用会将处理器控制权传递给操作系统,操作系统保存shell进程的上下文,创建一个新的hello进程及其上下文,然后将处理器控制权交给hello进程。
hello进程结束后,操作系统恢复shell进程的上下文,并将cpu的控制权交给它,shell则继续等待下一个命令行的输入。

1.7.2线程(Threads)(第12章)
一个进程实际上可以由多个称为线程的执行单元组成,每个线程都运行在进程的上下文中,并共享同样的代码和全局变量

1.7.3虚拟存储器
虚拟存储器是一个抽象的概念,它给每个进程提供了一个假象,即每个进程都在独占的使用内存,每个进程看到的是一致的存储器,称为虚拟地址空间



程序代码和数据:对于所有的进程来说,代码是从同一固定地址开始,紧接着是C全局变量相对应的数据位置。代码和数据是直接按照可执行目标文件的内容来初始化的(第七章)
堆:代码和数据区后紧接着的是运行时堆。代码和数据区是在进程一开始运行时就被规定了大小,而当调用如malloc和free这样的标准库函数时,堆可以在程序运行时动态的扩展和收缩。(第九章)
共享库:大约在地址空间的中间部分是一块用来存放像C标准库和数学库这样共享库的代码和数据的区域(第七章)
栈:位于用户虚拟地址空间顶部的是用户栈,编译器用它来实现函数的调用。(第三章)
内核虚拟存储器:内核总是存在于内存中,是操作系统的一部分。地址空间顶部的区域是为内核保留的,不允许应用程序读写这个区域的内容,或者直接调用内核代码定义的函数。(第九章)

1.7.4文件
文件就是字节序列,仅此而已。每个I/O设备,包括磁盘,键盘,显示器甚至网络,都可以视为文件。系统中的所有输入输出都是通过一小组称为Unix I/O的系统函数调用读写文件来实现的(第十章)

1.8系统之间利用网络进行通信
从一个单独的系统来看,网络可以视为一种I/O设备



1.9重要主题
系统第硬件和系统软件互相交织的集合体,它们必须共同协作以达到运行应用程序的最终目的。
1.9.1并发和并行

并发(concureency):指一个同时具有多个活动的系统
并行(parallelism):指的是用并发使一个系统运行的更快

1.线程级并发Thread-Level Concurrency

构建进程这个抽象,我们能够设计出同时执行多个程序的系统,这就导致了并发。使用线程,我们能够使一个进程中执行多个控制流。
超线程(hyperthreading):是一项允许一个CPU执行多个控制流的技术

多处理器的使用可以从两个方面提高系统性能(第十二章)

2.指令级并行(Instruction-Level Parallelism)

在较低的抽象层次上,处理器可以同时执行多条指令的属性称为指令级并行。
流水线技术(pipelining):将执行一条指令所需要的动作划分不同的步骤,将处理器的硬件组织成一系列的阶段,每个阶段执行一个步骤。这些阶段可以并行的操作,用来处理不同指令的不同部分,我们可以看到一个相当简单的硬件设计,它能够达到接近一个时钟周期一条指令的执行速度。
如果处理器可以达到比一个时钟周期执行一条指令更快的执行效率,称为超标量(superscalar)处理器。(第五章)

3.单指令、多数据并行SIMD(Single-Instruction, Multiple-Data (SIMD) Parallelism)

SIMD允许一条指令产生多个可以并行执行的操作。
提供这些SIMD指令是为了提高处理影像、声音和数据应用的执行速度(编程方式???)

1.9.2计算机系统中抽象的重要性

计算机中一个重大主题就是提供不同层次的抽象表示,来隐藏实际实现的复杂性

文件:对I/O设备的抽象表示,
虚拟存储器:对主存和I/O设备的抽象表示,
进程则:对处理器、主存和I/O设备的抽象表示
虚拟机:对整个计算机(包括操作系统、处理器和程序)的抽象

1.10小结

计算机系统是由硬件和系统软件组成的,它们共同协作以运行应用程序。
计算机被表示为一组组的位,它们根据上下文有不同的解释方式。
程序被其他程序翻译成不同的形式,开始是ASCII文本,然后被编译器和链接器翻译成二进制可执行文件
处理器读取并解释存储在主存里的二进制指令。
因为计算机花了大把时间用于存储器、I/O设备和CPU寄存器之间复制数据,所以讲系统中的存储设备划分成层次结构——寄存器在顶部,接着是多层的硬件高速缓存存储器、DRAM主存和磁盘存储器。高层的存储设备比底层的存储设备更快,单位比特价格更贵。层次结构中较高层次存储设备可以作为较低层次存储设备的高速缓存。通过理解和运用这种存储层次结构的知识,程序员可以优化c程序的性能。
操作系统内核是应用程序和硬件之间的媒介。它提供三个基本的抽象:(1)文件是对I/O设备的抽象(2)虚拟存储器是对主存和I/O设备的抽象(3)进程是对处理器、主存和I/O设备的抽象。
网络提供了计算机系统之间通信的手段。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  计算机系统