第一章------计算机系统漫游

第一章------计算机系统漫游

1.gcc -o hello hello.c
       在这里GCC编译器驱动程序读取源程序文件hello.c,并把它翻译成一个可执行目标文件hello。这个翻译过程可以分为四个阶段:
 1)预处理阶段   2)编译阶段   3)汇编阶段    4)链接阶段

2.系统的硬件组成
1)总线
       贯穿整个系统的是一组电子管道,称作总线,它携带信息字节并负责在各个部件间传递。通常被设计成传送定长的字节快,也就是字。大多数机器字长要么是4字节,要么是8字节
2)I/O设备
       I/O(输入/输出)设备是系统与外部世界的联系通道。我们示例系统包括四个I/O设备:作为用户输入的键盘和鼠标,作为用户输出的显示器以及长期存储数据和程序的磁盘驱动器(简单地说就是磁盘)。最开始,可执行程序hello就存放在磁盘上。

3)主存
       主存是一个临时存储设备,在处理器执行程序时,用来存放程序和程序处理的数据。从物理上来说,主存是一组动态随机存取存储器(DRAM)芯片组成的。从逻辑上来说,存储器是一个线性的字节数组,每个字节都有其唯一的地址(数组索引),这些地址是从零开始的。
4)处理器
       中央处理单元(CPU),简称处理器,是解释(或执行)存储在主存中指令的引擎。处理器的核心是一个大小为一个字的存储设备(或寄存器),称为程序计数器(PC)。在任何时候,PC都指向主存中的某条机器语言指令(即含有该条指令的地址)。处理器从程序计数器指向的内存读取指令,解释指令的位,执行该指令指示的简单操作,然后更新PC,使其指向下一条指令,而这条指令并不一定和在内存由刚刚执行的指令相邻。
5)ALU
       算术逻辑单元(Arithmetic&logical Unit)中央处理器(CPU)的执行单元,能实现多组算术运算和逻辑运算的组合逻辑电路
3.运行hello程序
   初始时,shell程序执行它的指令,等待我们输入一个命令,当我们在键盘输入字符串"./hello"后,shell程序将字符逐一读入寄存器,再把它放到内存中,如下图

       当我们在键盘上敲回车键时,shell程序就知道我们已经结束了命令的输入。然后shell执行一系列指令来加载可执行的hello文件,这些指令将hello目标文件中的代码和数据从磁盘复制到主存。数据包括最终会被输出的字符串“hello,world\n”。
       利用直接存储器存取(DMA)技术,数据可以不通过处理器而直接从磁盘到达主存,如下图

一旦目标文件hello中的代码和数据被加载到主存,处理器就开始执行hello程序的main程序中的机器语言指令。这些指令将“hello, world\n”字符串中的字节从主存复制到寄存器文件,再从寄存器文件中复制到显示设备,最终显示在屏幕上。这个步骤如下图所示:

DRAM(Dynamic Random Access Memory),即动态随机存取存储器,最为常见的系统内存。DRAM 只能将数据保持很短的时间。为了保持数据,DRAM使用电容存储,所以必须隔一段时间刷新(refresh)一次,如果存储单元没有被刷新,存储的信息就会丢失。 (关机就会丢失数据)
3.操作系统管理硬件
操作系统有两个基本的功能:(1)防止硬件被失控的应用程序滥用;(2)向应用程序提供简单一致的机制来控制复杂而又通常不相同的低级硬件设备操作系统通过几个基本的抽象概念(进程、虚拟内存和文件)来实现这两个功能。如下图,文件是对I/O设备的抽象表示,虚拟内存是对主存和磁盘I/O设备的抽象表示,进程则是对处理器、主存和I/O设备的抽象表示。

4.进程
1)概念:进程是操作系统对于一个正在运行的程序的一种抽象。在一个系统上可以运行多个进程,而每个进程都好像在独占的使用硬件,而并发运行,则是指一个进程的指令和另一个进程的指令是交错执行的。
2)进程的上下文切换
从一个进程切换到另一个进程的转换是由操作系统内核管理的。内核是操作系统代码常驻主存的部分。当应用程序需要操作系统的某些操作时,比如读写文件,它就执行一条特殊的系统调用指令,将控制权传递给内核。然而内核执行被请求的操作并返回应用程序。逐一内核不是一个独立的进程。相反,它是系统管理全部进程所用代码和数据结构的集合。

5.线程
尽管通常我们认为一个进程只有单一的控制流,但是现代系统中,一个进程实际上可以由多个称为线程的执行单元组成,每个线程都运行在进程的上下文中,并共享同样的代码和全局数据。
6.虚拟内存
虚拟内存是一个抽象概念,它为每个进程提供一个假象,即每个进程都在独占的使用主存,每个进程看到的内存都是一致的,称为虚拟地址空间,如图所示,在Linux中,地址空间最上面的区域是保留给操作系统中的代码和数据的,这对所有进程来说都是一样。地址空间的底部区域存放用户进程定义的代码和护具。图中的地址是从下往上增大的。

程序代码和数据对所有的进程来说,代码是从同一固定地址开始,紧接着是和C全局变量相对应的数据位置。代码和数据区是直接按照可执行目标文件的内容初始化的,在示例终究是可执行文hello
堆。代码和数据区后紧随着的是运行时堆。代码和数据区在进程一开始运行时就被指定了大小,与此不同,当调用像malloc和free这样的C标准库函数时,堆可以在运行时动态的扩展和收缩。
●共享库。大约在地址空间的中间部分是一块用来存放像C标准库和数学库这样的共享库的代码和数据的区域。
栈。位于用户虚拟地址空间顶部的用户栈,编译器用它来实现函数调用。和堆一样,用户栈在程序执行期间可以动态地扩展和收缩。特别地,每次我们调用一个函数时,栈就会增长;从一个函数返回时,栈就会收缩
内核虚拟内存。地址空间顶部的区域是为内核保留的。不允许应用程序读写这个区域的内容或者直接调用内核代码定义的函数。相反,它们必须调用内核来执行这些操作。
虚拟内存的运作需要硬件和操作系统软件之间精密复杂的交互,包括对处理器生成的每个地址的硬件翻译。基本思想是吧一个进程虚拟内存的内容存储在磁盘上,然后用主存作为磁盘的高速缓存。
7.系统之间利用网络通信
如图所示,当系统从主存复制一串字节到网络适配器时,数据流经过网络到达另一台机器,而不是比如说到达本地磁盘驱动器。相似地,系统可以读取从其他机器发送来的数据,并把数据复制到自己的主存。

8.并发和并行
1)线程级并发
如下图所示典型的多核处理器,其中微处理器芯片有四个CPU核,每个核都有自己的L1和L2高速缓存,其中的L1高速缓存分为两个部分----一个保存最近取到的指令,另一个存放数据。这些核共享更高层次的高速缓存,以及到主存的接口。工业界的专家预言他们能够将几十个、最终会是上百个核做到一个芯片上。

超线程有时称为同时多线程,是一项允许一个CPU执行多个控制流的技术。假设一个线程必须等到某些数据被装载到高速缓存中,那么CPU就可以继续曲直性另一个线程。举例来说,Intel Core i7处理器可以让每个核执行两个线程,所以一个4核的系统实际上可以并行地执行8个线程。多处理器的使用可以从两方面提高系统性能。首先,它减少了在执行多个任务时模拟并发的需要,另外一个他可以是应用程序运行得更快。
2)指令级并行
在较低的抽象层次上,现代处理器可以同时执行多条指令的属性称为指令级并行。早期的微处理器,如1987年的Intel 8086,需要多个(通常是3~10个)时钟周期来执行一条指令。最近的处理器可以保持每个时钟周期2~4条指令的执行效率。
3)单指令、多数据并发
在较低的层次上,许多现代处理器拥有特殊的硬件,允许指令产生多个可以并行执行的操作,这种方式称为单指令、多数据,即SIMD并行。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章