深入理解计算机系统-笔记-第一章-计算机系统漫游

     深入理解计算机系统 算是一本非常经典的教材。之前看了一些但又放在了一边,这次重写开始读这本书,并通过摘记书中重要知识点的方式来加深自己的印象。希望能坚持写完

     由于我的目标是成为一名算法工程师,所以对这本书的阅读也有所侧重,主要参考了一篇文章:评《深入理解计算机系统》

     这本书的勘误见:http://www.yiligong.org/csapp2e/


1. 编译文件的基本过程

 
   
  1. gcc -o hello hello.c
其中hello.c是源程序文件,而hello是可执行文件。编译过程主要包括如下几个步骤

  • 预处理阶段:预处理器cpp根据#开头的命令修改原始代码,比如会将#include的内容直接插入到程序文本中
  • 编译阶段:编译器ccl将修改过的源程序修改为汇编指令程序
  • 汇编阶段:汇编器as将汇编程序翻译成机器语言指令,并打包为“可重定位目标程序”
  • 链接阶段:链接器ld,将链接的一些函数合并到hello程序中,得到的hello就是可执行文件

2. 了解编译系统工作方式的重要性
  • 优化程序性能:了解一些编译器的知识能让人知道如何编写程序能让程序跑的更快
  • 理解链接时发生的错误:感觉这个是平时写代码时最常遇到的问题之一了。包括静态和动态库的区别,编译时链接各个库的顺序的影响等等。
  • 避免安全漏洞:缓冲区溢出是最常见的安全漏洞的原因

3. 系统的基本硬件组成
以Intel Pentium系统产品系统模型为例(显然奔腾cpu已经很老了,此外图中也没有现在常见的独立显卡)
  • 总线:贯穿整个系统,携带信息在各个部件之间传递。总线通常被设计成传送定长的字节块,也就是字(word)。字中的字节数(字长)是一个基本的系统参数。常见的包括4字节(32位)和8字节(64位)。这就是我们平常说的64位系统的含义,现在新的电脑通常都是64位了。注意:32位系统最大只能表达4GB的储存器地址,即最大只能用4GB内存。
  • I/O设备:常用的I/O设备包括键盘,鼠标,显示器,磁盘(硬盘和软盘等)以及音箱啊游戏手柄之类的。每个I/O设备都通过控制器或者适配器与I/O总线相连接,两者区别在于其封装方式
    • 控制器:置于I/O设备本身的或者系统的主印制电路板(主板)上的芯片组
    • 适配器:插在主板上的一块卡
  • 主存:即我们平常所指的内存(RAM)。注意Cache不属于主存,而是属于CPU的一部分。当前常用的主存技术为DDR3 / DDR4
  • CPU:CPU通常包括PC(程序计数器),ALU(算术/逻辑单元),寄存器文件以及高速缓存等部分。能执行 加载,储存,操作,跳转等基本指令。

4. 高速缓存器
由于CPU和主存的速度存在很大的差异,所以一般采用高速缓存作为暂时的数据集结区域。高速缓存的空间较小,但速度很快
 
 
5. 操作系统管理硬件
操作系统有两个主要功能:
  • 防止硬件被失控的应用程序滥用
  • 向应用程序提供简单一致的机制来控制复杂而又通常大相径庭的低级硬件设备
操作系统通过几个基本抽象概念(进程,虚拟储存器,文件)来实现这两个功能
  • 进程
    • 进程是操作系统对一个正在运行的程序的一种抽象。也可认为进程是对处理器、主存和I/O设备的抽象表示。
    • 传统处理器一个时刻只能处理一个程序,但却可以运行多个进程。这些进程看起来是同时独立运行的,而实际上是通过处理器在进程之间切换来实现的,这种机制被称为“上下文切换”
  • 线程
    • 现代系统中,一个进程实际上可以由多个称为线程的执行单元组成。
    • 多线程之间比多进程之间更容易共享数据
    • 线程一般来说比进程更加高效
    • 当有多核处理器时,多线程可以加速程序
  • 虚拟存储器
    • 虚拟存储器是对主存和磁盘I/O的抽象表示。
    • 虚拟存储器为每个进程提供一个假象:每个进程都在独占地使用主存。每个进程看到的是一致的存储器——虚拟地址空间
    • 地址从下往上是增加的
    • 程序代码与数据:代码和数据区是直接按照可执行目标文件的内容初始化的。其大小在一开始运行的时候就确定了
    • 堆:堆的大小可以动态地扩展和收缩,比如使用malloc和free时
    • 共享库:包括C标准库和math库等,与动态链接的概念相关
    • 用户栈:编译器用其实现函数的调用,调用一个函数是栈会增长,从函数返回时栈会收缩
    • 内核虚拟存储器:为内核保留,不允许应用程序读写此区域内容或是直接调用内核代码定义的函数
  • 文件
    • 文件是对I/O设备的抽象。磁盘,键盘,显示器等等都可以看作是文件。(感觉在Linux下能很好的体现这一点)    

6. 并发和并行
  • 并发:指一个同时具有多个活动的系统
  • 并行:指用并发使一个系统运行的更快
  • 线程级并发
    • 单处理器系统:单处理器的并发通过快速切换正在执行的进程实现
    • 多核处理器:拥有多个核,还有超线程技术,下图为intel core i7处理器结构的示意图
    • 超线程:也称“同时多线程”,是一项允许一个CPU执行多个控制流的技术。i7中一个核可以执行2个线程(即常说的双核4线程,四核8线程)。原理:CPU的某些硬件有多个备份,比如PC和寄存器文件,某些硬件只有一个,比如ALU。常规的处理器需要20000哥始终周期做线程之间的转换,而超线程处理器可以在单个周期的基础上决定要执行哪一个线程。
  • 指令级并行
    • 指可以同时执行多条指令的属性称为指令级并行
    • 早期处理器,比如8086,需要3-10个时钟周期才能执行一条指令
    • 若处理器可以达到比一个周期一条指令更快的执行速率,则称之为超标量处理器
    • 流水线pipelining是一种加快指令执行速率的策略
  • 单指令,多数据并行
    • 许多现代处理器拥有特殊的硬件,允许一条指令产生多个可以并行执行的操作,即单指令多数据——SIMD并行


 

猜你喜欢

转载自blog.csdn.net/wzmsltw/article/details/52894071