深入理解计算机系统 第一章

计算机系统漫游

一个hello程序最初作为一个源程序(亦即源文件)被创建,所谓源文件就是说被编辑器创建出来的文本文件。源程序就其本质来说是一大串0或1组成的位的序列,八位成一组被称为字节。这些字节同我们日常使用的符号有个对应关系,这对应关系是由ASCII标准规定的(字节是八位而成的,导致了有256个ASCII码,因为$2^8$=256)。
源程序的本质就是位序列,不仅如此,计算机系统中的所有消息都是用位表示的。

  • 编程语言C语言与Unix操作系统关系密切,小而简单,又易于实操。它的不足在于指针容易造成混乱和程序错误,它对抽象的显式支持也有所不足。

源文件就等于ASCII标准下的一大串位,这一堆位表示的其实还是高级语言C语言,计算机机器是读不懂的。它还得经历一个继续转变的过程。
编译过程

  1. 预处理阶段:根据以字符#开头的命令修改程序,hello.c变为hello.i,例#include,读取库中文件直接插入程序文本。
  2. 编译阶段:编译器将hello.i变为hello.s。hello.s即是一个汇编语言程序。所谓汇编语言程序,是一种一条语句对应一个低级机器语言指令的语言,为不同高级语言的不同编译器提供了共同语言。
  3. 汇编阶段:汇编器将hello.s翻译成机器语言指令,这些机器语言指令被打包为可重定位目标程序的格式,放在hello.o之中。
  4. 链接阶段:将函数代表的代码从标准库中链接到源程序来。最终的结果是hello文件,一个可执行目标文件。
    • 书中介绍了一点GNU项目,它包含GCC。GNU项目似乎是一个牛逼轰轰的项目,囊括万象,闪耀着开源精神的光辉。
    • shell是一个命令行解释器,输出一个提示符,等待一个命令行(对其进行解释后运行)。如果命令行的第一个单词不是内置命令,那么这个单词就会被假设为一个可执行文件。

系统的硬件组成

计算机系统组成

  1. 一组贯穿整个系统的电子管道被称为总线,携带并传递信息。消息往往被组织成定长字节块的形式,即。字包含的字节数是一个基本的系统参数,根据这一个参数我们区分32位(4字节)系统和64位(8字节)系统。
  2. I/O设备即是输入/输出设备。它包含键盘、鼠标、显示器和磁盘。每一个I/O设备都通过控制器或适配器与I/O总线相连。控制器是置于I/O设备本身的或者系统的主印制电路板(主板)上的芯片组,适配器则是一块插在主板插槽上的区别所在即封装方式。
  3. 主存是一个临时存储设备,在处理器执行程序时用来存放程序和程序需要的数据。物理地说,主存是一组动态随机存取存储器(DRAM)芯片组成的。本质上来说,存储器是一个线性的字节数组,每个字节都有一个唯一地址(数组索引)。
  4. 中央处理单元(CPU)是执行在主存中指令的引擎。处理器的核心是一些寄存器,寄存器能存储一个字长,它们被称为程序计数器。程序计数器指向主存中的某条机器语言指令,处理器再处理,之后再更新程序计数器的指向。这些简单操作涉及到主存、寄存器文件和算术单元(ALU),寄存器文件由许多寄存器组成;ALU计算新数据和新地址。
    • 加载:把一个字节或字从内存复制到寄存器并覆盖旧内容。
    • 存储:同上,不过是从寄存器到内存。
    • 操作:将两个寄存器的内容转到ALU并计算,结果被存放到另一个寄存器并覆盖旧内容。
    • 跳转:从指令中抽取一个字,并将其复制到程序计数器中,覆盖旧内容。

另外,处理器按照一个模型进行操作,这个模型由指令集结构决定。文中提到“处理器看上去只是它的指令集结构的简单实现”,并且需要区分“指令集结构”和“微体系结构”。看不懂,留待学习第三章时处理。


讲完计算机系统的硬件构成和操作后,我们回到hello程序的生命中来。
每个命令被输入时,字符被逐一读入寄存器,再被放入存储器。回车键的敲下标志着命令输入完成,shell会执行系列指令来加载可执行hello文件,再将其复制到内存。此时处理器开始执行hello程序,这些指令将最终输出的字符串的字节从主存复制到寄存器,再从寄存器复制到显示设备。
信息一直在往复传递着,压低信息传递的代价能让计算机跑得更快。不过首先我们得了解下计算机存储的基本原则,越大越慢。从寄存器取东西比从内存快得多,从内存取又比从硬盘取又快得许多,然而硬盘,内存却不可或缺,因为它们能放更多内容。为了弥合这种差距,我们采用高速缓存存储区来作为暂时的储存区,用于存放处理器可能用到的信息。它用静态随机访问处存储器来实现。
这体现出一种工程思想,在处理器和主存间插入更小却更快的存储设备可以加快计算机的运行速度。正因如此,计算机的存储设备被组织成了以恶存储器层次结构。

操作系统管理硬件

程序并不直接访问硬件,程序直接访问 操作系统,由操作系统再来访问硬件。操作系统起两个作用。

  • 防止硬件被应用程序滥用。
  • 使应用程序拥有简单一致的机制,来控制硬件。
    操作系统的抽象表示

计算机靠几个抽象概念(进程、虚拟存储器和文件),在操作系统中复现出硬件环境,从而实现两个作用。

  • 进程:对一个正在运行的程序的抽象。一个系统运行多个进程,每个进程似乎又在独立地使用硬件,然而传统系统在一个时刻是只能执行一个程序的。为了完成这种并发运行,CPU在多个进程中并发地执行,执行这种交错执行的机制叫做上下文切换
    操作系统跟踪进程运行的所有状态消息被称为上下文。操作系统要把控制权从当前进程转移到某个新进程时要进行上下文切换
    进程的上下文切换
    进程可以由多个称为线程的执行单元。每个线程共享进程同样的代码和全局数据,更加高校。

  • 虚拟存储器:通过虚拟存储器,每个进程“似乎”能够独占地使用主存。每个进程使用一致的存储器,被称为虚拟地址空间。说它是一致,是因为对每个进程来说都能用一个独立存储器副本,这个副本与其它副本完全一样。
    看不懂这段,留待后来

  • 文件:文件就是字节序列。I/O设备,甚至网络都可视为文件。系统中所有输入输出都通过Unix I/O的系统函数调用读写文件实现。通过文件这个概念,应用程序将一切I/O设备等量齐观。

网络通信

网络将系统与系统连接到一起。系统从主存把字节串复制到网络适配器,然后数据流便可流经网络到达另一台机器。
网络也是I/O设备
通过网络远程运行程序
上图所示表达了telnet是如何基于网络复制信息的功能完成功能的。

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注