计算机系统漫游

计算机系统是由硬件和系统软件组成的,它们共同工作来完运行应用程序。

我们主要是从一个简单的hello程序出发, 理解从远程hello.c到执行程序hello执行的过程中,整个计算的发生的变化。

 #include <stdio.h>

 int main(){
    printf("hello,world\n");
 }

我们将通过上述程序的生命周期来开始对系统的学习--从它被程序员创建,到在系统上运行,输出简单的消息,然后终止。我们将沿着这个程序的生命周期,简单地介绍一些逐步出现的关键概念,专业术语和组成部分。

1.1信息就是位+上下文

hello 程序的生命周期是从一个源程序(或者说是源文件)开始的,即程序员用编辑器创建并保存的文本文件,文件名是hello.c。源程序实际上就是一个值由0和1组成的位(bit)序列,8个位被组织称一组,称为一个字节。每个字节表示程序中的某一个文本字符。

hello.c程序一字节序列的方式存储在文件中。每个字节都有一个整数值,而该整数值对应一个具体的字符。

系统的所有信息--包含磁盘文件,存储器中的程序,存储器中的用户数据以及网上传输的数据,都是由一串位表示的,区分不同数据对象的唯一方法就是我们读到这些数据对象的上下文

1.2程序被其他程序翻译成不同的形式

hello程序的生命周期是从一个高级语言程序开始的,因为这种形式能被人读懂。然后,为了在系统上面运行hello.c程序,每条c语句都是要被其他程序翻译成一系列的低级机器语言指令。然后这些指令按照一种称为可执行目标程序的格式打好包,并以二进制磁盘的形式存放起来。目标程序也被称为可执行目标文件。

主要包含了四个阶段:

  1. 预处理阶段
  2. 编译阶段
  3. 汇编阶段
  4. 链接阶段

1.3了解编译系统如何工作是大有益处的

  • 优化程序
  • 理解链接时出现的错误
  • 避免安全漏洞

1.4.处理器读屏解释存储在存储器中的指令

1.4.1系统硬件的组成

  1. 总线
  2. I/O设备
  3. 主存:主存是一个临时存储设备,用来存放程序和程序处理的数据。
  4. 处理器

    • 加载:把字节或者字从主存加载到寄存器
    • 存储:把字节或者字从寄存器复制到主存
    • 操作:把两个寄存器的内容复制到ALU,ALU对数据进行运算,将结果保存到寄存器
    • 跳转:从指令本身中抽取一个字,并将这个字复制到程序计数器(pc)中,以覆盖pc中原来的值

1.4.2运行hello程序

初始化时,外壳执行他的指令,等待我们输入一个指令。当我们在键盘上输入"./hello"之后,外壳程序将字符逐一读入寄存器,在把它存储在存储器中。

当我们在键盘上敲回车键时,外壳程序就知道我们结束了命令的输入。然后外壳程序执行一系列指令来加载可执行的hello文件,将hello目标文件中的代码和数据从磁盘复制到主存,数据包括最终会被输出的字符串“hello,world\n”;

后面我们可以学习到,通过直接存储器存取的技术,可以不通过处理器而直接从磁盘到达主存。

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

1.5高速缓存至关重要

数据串“hello,world\n”最初是在磁盘上的,然后会被复制到主存,最后从主存复制到显示设备。这些复制的开销,减少了程序的真正的工作。因此,系统设计者的一个主要目标就是使这些复制操作尽可能的完成。

根据机械原理,较大的存储设备要比较小的存储设备运行得慢,而快速设备的造价要远远高于同类的低速设备。

处理器和主存之间存在巨大的差异,处理的执行速度快,但是存储的字节数很少,主存的执行速度慢,但是存储的字节数大。针对这种处理器和主存之间的差异,设计者采用了更小,更快的存储设备,即高速缓存存储器(简称高速缓存),作为暂时的集结区域,用来存放处理器近期可能会需要的信息。

比较新的系统,一般可能会有L1,L2,L3个不同级别的高速缓存器,这样系统可以获得一个更大的存储器,同时访问速度也是很快的,原因就是利用了高度缓存的局部性原理,即程序具有访问局部区域里的数据和代码的趋势。

1.6存储设备形成层次结构

使用多个层级来设计存储设备,越是上面的,访问速度越快,所以每一个上级都是对应下级的存储设备。我们可以是用存储器的层次结构来理解提高程序性能。

1.7操作系统管理软件

操作系统有了两个基本的功能:

  1. 防止硬件被失控的应用控制
  2. 向应用提供了简单一致的机制来控制复杂而又通常大相径庭的低级硬件设备。

操作系统通过几个基本的抽象概念来实现这两个功能:

  • 文件:文件是对I/O设备的抽象表示
  • 虚拟存储器:是对主存和磁盘I/O设备的抽象表示
  • 进程:是对处理器,主存和I/O设备的抽象表示
  • 虚拟机:是对整个计算机体系的抽象表示

1.7.1进程

进程是操作系统对一个正在运行的程序的一种抽象。在一个系统上可以同时运行多个进程,而每个进程都好像在独立地占有使用整个硬件。

操作系统保持跟踪进程运行所需要的全部状态信息,这种状态,就是上下文,它包含了许多的信息,例如PC和寄存器文件中的当前值,以及主存的内容。

比如,当我们在shell里面执行hello程序的时候,外壳通过一个专门的函数,即系统调用来执行我们的请求,系统调用会将控制权传递给操作系统。操作系统保存外壳程序的上下文,创建一个新的hello进行以及其上下文,然后将控制权传递给新的hello进程。hello程序终止后,操作系统恢复外壳进程的上下文,并将控制权传回给它。外壳进进程继续等待下一个命令输入。

实现进程这个抽象概念是低级硬件和操作系统软件之间的紧密合作。

1.7.2线程

通常我们认为一个进程只有一个单一的控制流。一个进程可以由多个称为线程的执行单元组成,每个线程都运行在进程的上下文中,并共享同样的代码和全局数据。由于网络服务器对并行的需求,线程称为越来越重要的编程模型,因为多线程比多进程之间更容易共享数据,也因为线程一般来说比进程更加有效。

1.7.3虚拟存储器

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

  1. 程序代码和数据
  2. 共享库
  3. 内核虚拟存储器

1.7.4文件

文件就是字节序列,仅此而已。每个I/O设备,包含磁盘,键盘,显示器,甚至网络,都可以视为文件。

文件为应用程序提供了统一的视角,来看待系统中可能包含的所有各式各样的I/O设备。

1.8系统之间利用网络通信

1.9重要主题

系统是硬件和软件互相交织的集合体,它们必须共同协作已达到运行程序的最终目的。

1.9.1并发和并发

我们所说的并发是一个同时具有多个活动的系统。

并行是指用并发使一个系统运行得更快。

  1. 线程级并发
  2. 指令级并发
  3. 单指令,多数据并行

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

我们在学习操作系统的时候,主要学习了三种抽象:

  1. 文件是对I/O的抽象
  2. 虚拟存储器是对程序存储器的抽象
  3. 进程是对一个正在运行的程序的抽象
  4. 虚拟机提供了对整个计算机(包含操作系统,处理器和程序)的抽象。

从操作系统的角度来看,网络就是一种I/O设备。

共有 0 条评论

Top