《深入理解计算机系统》学习总结一

  前几天开始看的《深入理解计算机系统》这本书,东西超级多,书老厚了。但是为了巩固一下我薄弱的计算机的基础知识还是决定看看。下面的是我写的关于这本书上对我来讲比较重要的一些知识点,外加一些东西的总结。因为书太厚了,所以博客会不断更新。

第一章 计算机系统

  这章主要是对后面的内容的梳理,简略的谈了一下。但是个人认为我们在接触一本新书的时候看目录来加深自己的宏观把握能力也很重要。另外,本书很重要的一个前提就是——基于Linux系统。本章需要注意一下的知识点如下:
  1.关于C语言中的hello world的源文件hello.c:
  (1)hello.c程序是以字节序列的方式存储在文件中的。像hello.c这样只由ASCII字符构成的文件成为文本文件,所有其他的文件成为二进制文件。
  (2)从hello.c到可执行程序文件的过程:linux> gcc -o hello hello.c 这个过程大致可以分为四个阶段,执行这四个阶段的程序(预处理器、编译器、汇编器和链接器)一起构成了编译系统。gcc编译器是Linux系统默认的编译器。
  《深入理解计算机系统》学习总结一_第1张图片
  预处理就是将头文件等直接插入程序文本中,并将宏定义等的替换内容替换掉;编译过程是将C语言程序翻译成汇编语言程序;汇编过程是将汇编语言翻译成机器语言命令,把这些命令打包成一种叫做可重定位目标程序的格式,形成目标文件;链接阶段就负责将之前引用的库函数的实体合并到hello.o程序中,形成hello这个可执行目标文件。
  (3)hello.c被翻译成可执行文件hello之后被存放在磁盘上,如果需要系统执行文件,那么在shell中输入:linux>./hello 结果:hello,world 。shell是命令行解释器,如果该命令行的第一个单词不是一个内置的shell命令,那么shell会假设这是一个可执行文件的名字,它会加载并运行这个文件。
  
  2.系统的硬件组成:
  (1)总线:贯穿整个系统的是一组电子管,称作总线。通常总线被设计成传送定长的字节块,也就是字。但是这个字在各个系统中的设置一般也不相同。
  (2)I/O设备:每个I/O设备都通过控制器或者适配器与I/O总线相连。控制器是I/O设备本身或者系统的主印制电路板(主板)上的芯片组,而适配器是一块插在主板插槽上的卡。
  (3)主存:主存是一个临时存储设备,用来存放程序和程序处理的数据。主存是由一组动态随机存取存储器(DRAM)芯片组成的。从逻辑上来说,存储器是一个线性的字节数组,每个字节都有唯一的地址(数组索引),这些地址是从零开始的。
  (4)处理器:也就是CPU。处理器的核心是一个大小为一个字的存储设备(或寄存器),称为程序计数器(PC).在任何时刻,PC都指向主存中的某条机器语言命令(含有该条指令的地址)。处理器一直不断地执行PC指向的指令,再更新PC,使其指向下一条指令。处理器中还有寄存器和ALU,寄存器是小的存储设备,每个寄存器都有唯一的名字;ALU是算数逻辑单元,用来计算新的数据和地址值。
  《深入理解计算机系统》学习总结一_第2张图片
  3.运行hello程序过程:
  (1)当在键盘上输入“./hello”之后,shell将字符读入寄存器,再把它复制到内存中。
  (2)按下回车之后,shell程序执行一系列指令来加载可执行的hello文件,这些指令将hello目标文件中的代码和数据从磁盘复制到主存
  (3)一旦目标文件中的代码和数据被加载到主存,处理器就开始执行hello程序中的main的机器语言指令,最后将程序的的结果从主存复制到寄存器,再从寄存器复制到显示设备。
  4.高速缓存:
  由于技术的发展导致处理器与驻村之间的差距不断地增大,加快处理器的运行速度比加快主存的运行速度要容易和便宜的多。针对这种差异,高速缓存存储器(cache)被设计出来,作为暂时的集结区域,存放处理器近期可能会需要的信息。
  《深入理解计算机系统》学习总结一_第3张图片
  L1高速缓存位于处理器芯片上,容量可以达到数万字节,访问速度几乎可以和访问寄存器文件一样快。
  L2高速缓存通过一条特殊的总线连接到处理器,容量为数十万字节到数百万字节,进程访问L2高速缓存的时间要比访问L1的时间长5倍。L1和L2都是SRAM.
  有的更新的系统包含了L1、L2和L3三级缓存。通过让高速缓存里存放可能经常访问的数据,大部分的内存操作都能在快速的高速缓存中完成。
  5.存储器的层次结构:
《深入理解计算机系统》学习总结一_第4张图片
  存储器层次结构的主要思想是上一层的存储操作作为下一层存储器的高速缓存。也就是说寄存器是L1的高速缓存,L1是L2的高速缓存。。。
  6.操作系统中几个抽象的概念:
  操作系统在实现基本功能的时候提供了几个抽象的概念:进程、虚拟内存和文件
  《深入理解计算机系统》学习总结一_第5张图片
  (1)进程:是操作系统对一个正在运行的程序的抽象。而并发执行则是说一个进程的指令和另一个进程的指令是交错执行的(看上去像是多个进程同时执行,但是针对单个处理器来说,每个时间片只有一个进程的代码在执行)。从一个进程到另一个进程的切换是由操作系统内核管理的,内核是操作系统代码常驻主存的部分(注意:内核不是一个独立的进程,相反,它是系统管理全部进程代码和数据结构的集合)
  (2)线程:在现代操作系统中,一个进程实际上可以由多个成为线程的执行单元组成,每个线程都运行在进程的上下文中,并共享同样的代码和全局数据。多线程之间比多进程之间更容易共享数据,也因为线程一般比进程更高效。线程甚至被认为是轻量级进程。
  (3)虚拟内存:它为每个进程提供了一个假象,即每个进程都在独占的使用主存。每个进程看到的内存都是一样的,成为虚拟地址空间。下面为linux进程的虚拟地址空间(注意图中的地址是从下往上增大的)
  《深入理解计算机系统》学习总结一_第6张图片
  1>程序代码和数据:对所有的进程来说,代码是从同一固定地址开始。代码和数据区是直接按照可执行目标文件的内容初始化的。
  2>堆:不同于代码和数据区在进程一开始运行时就被指定了大小,堆可以在运行时动态的扩展和收缩。
  3>共享库:用来存放像C标注库和数学库这样的共享哭的代码和数据的区域。(这是个强大的概念)
  4>栈:编译器用它来实现函数的调用。和堆一样,用户栈在程序执行期间可以动态的扩展和收缩。
  5>内核虚拟内存:地址空间顶部是为内核保留的,不允许应用程序读写这个区域的内容或者直接调用内核代码定义的函数。相反,它们必须调用内核来执行这些操作。
  虚拟内存的运作需要硬件和操作系统软件之间精密复杂的交互。其基本思想是吧一个劲进程虚拟内存的内容存储在磁盘上,然后用主存作为磁盘的高速缓存。
  (4)文件:就是字节序列。在linux系统中,每个I/O设备,包括磁盘、键盘、显示器,甚至网络,都可以看成是文件。
  6.并行和并发:
  并发(concurrency)是一个通用的概念,指一个同时具有多个活动的系统
  并行(parallelism)指的是用并发来使一个系统运行的更快。
  通俗点说,并发指的是多个任务能被来回切换的做;而并行则指的是几件事情可以同时做(并发是两个队列交替使用一台咖啡机,并行是两个队列同时使用两台咖啡机)。并发和并行都可以指多个线程,如果这些线程可以被分配到多个CPU上同时执行,那么就是并行;如果是单CPU对多线程进行切换式处理,那么就是并发。
  7.多核处理器与超线程:
  多核处理器是将多个CPU集成到一个集成电路芯片上。每个核都有自己的L1和L2告诉缓存,其中L1高速缓存又分为保存指令的和保存数据的。这些核共享更高层次的高速缓存以及到主存的接口。
  《深入理解计算机系统》学习总结一_第7张图片
  超线程:有时也被成为同时多线程,是一项允许一个CPU执行多个控制流的技术。常规的处理器需要大约20000个时钟周期做不同线程间的转换,而超线程的处理器可以在单个周期的基础上决定要执行哪一个线程。
  
  
  

你可能感兴趣的:(计算机系统)