第一章 计算机系统漫游

1.1 信息就是位+上下文

  位的理解:源程序如hello.c,实际上是由值0和1组成的位,8个位组成一组,成为字节,如00011000。每个字节表示程序中的某些文本字符,每个字节都有一个整数值。如‘\n’,它的整数值为10,即00001010。若文件由有ASCII字符构成,则称之为文本文件,所有其他文件都称为二进制文件。

  系统中所有的信息——包括磁盘文件、内存中的程序、内存中存放的用户数据以及网络上传的数据,都是由一串比特表示的。上下文,可以理解为,一个同样的字节序列,它可能表示一个整数、浮点数、字符串或者机器指令。

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

  hello程序的生命周期是一个高级c 语言程序开始的,为了运行该程序,每条C语句都必须被其他程序转化成一系列的低级机器语言指令,然后这些指令按照一种称为可执行目标程序的格式打好包,并以二进制磁盘文件的形式存放起来。

预处理阶段:预处理器根据以字符#开头的命令,修改原始的C程序。如#include<stdio.h>命令告诉预处理器读取系统头文件stdio.h的内容,并把它直接插入程序文本中,这样得到了hello.i文件。

编译阶段:编译器将hello.i文件翻译成hello.s文件,它包含了一个汇编语言程序,每条语句都以一种文本格式描述了一条低级机器语言指令。

汇编阶段:汇编器将hello.s翻译成机器指令,将这些指令打包成一种叫做可重定位目标程序格式,并将结果保存在hello.o中。

链接阶段:hello程序中调用了prinf函数,prinf函数存在于一个名为prinf.o的单独的预编译好了的目标文件中,而这个文件必须以某种方式合并到我们的hello.o程序中。链接器负责处理这种合并,结果就得到hello文件,它是一个可执行目标文件。

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

  1. 优化程序性能
  2.  理解链接时出现的错误 
  3. 避免安全漏洞

 

1.4 处理器读并解释储存在内存中的指令

  这个是指我们常用的运行命令的shell,hello程序被编译成可执行目标文件,shell加载并运行输出hello程序它的消息,然后等待下一个命令行。

1.4.1 系统的硬件组成

 

总线:贯穿整个系统;

I/O设备:输入(键盘鼠标等)、输出(显示器等)

主存:临时存储设备,在处理器执行程序时,用来存放程序和程序处理的数据。物理上来说,主存是由一组动态随机存取存储器DRAM芯片组成。

处理器:解释或执行存储在主存中指令的引擎,其核心为程序计数器PC,它每次都指向主存中的某条机器语言指令。处理器从程序计数器指向的内存出读取指令,解释指令中的位,执行该指令指示的简单操作,然后更新PC,使其指向下一条指令,而这条指令并不一定和在内存中刚刚执行的指令相邻。
CPU可能执行的操作:

  加载:从主存复制一个字节或者一个字到寄存器;

  存储:从寄存器复制一个字节或者一个字到主存的某个位置;

  操作:把两个寄存器的内容复制到ALU,ALU对这两个字做算术运算,并将结果存放到一个寄存器中,以覆盖该寄存器原来的内容。

  跳转:从指令本身中抽取一个字,并将这个字复制到PC中,以覆盖PC原来的值。

1.4.2 hello 程序运行

最初,hello程序放在磁盘上;

程序加载时,从磁盘复制到主存

处理器运行时,将字节从主存复制到寄存器文件,再从寄存器文件复制到显示设备,最终显示在屏幕上。

这种,开始时在磁盘,然后被复制到主存,最后从主存上复制到显示设备,复制来复制去的 是不是额外的开销,是不是可以提升一下速度呢?(高速缓存)

1.5高速缓存至关重要

局部性原理:高速缓存里存放可能经常访问的数据,大部分的内存操作都能在快速的高速缓存中完成。

 结论:高速缓存存储器存在的应用程序员能够利用高速缓存将程序的性能提高一个数量级

1.6存储设备形成层次结构

在处理器和一个较大较慢的设备(主存)之间插入一个更小更快的存储设备(高速缓存)的想法已经成为一个普遍的观念

1.7 操作系统管理硬件

运行hello程序都没有直接访问键盘啊 鼠标显示器这些的 它们依靠着操作系统提供服务

操作系统有两个基本功能 一是防止硬件失控的应用程序滥用 二是 向应用程序提供简单一致的机制来控制复杂又通常大不相同的低级硬件设备

如图,文件是对IO设备的抽象,虚拟内存是对主存和磁盘I/O设备的抽象表示,进程是对处理器、主存和I/O设备的抽象表示;

1.7.1 进程

进程是操作系统对一个正在运行的程序的一种抽象

上下文:操作系统保持跟踪进程运行所需的所有状态信息,如PC,寄存器当前值,主存内容等;

上下文切换:保存当前进程的上下文,恢复新进程的上下文;

从一个进程到另一个进程的转换是由操作系统内核管理的。比如,读文件,应用程序会执行一条特殊的系统调用指令,将控制权传递给内核,然后内核执行被请求的操作并返回应用程序。

 

 1.7.2 线程

线程:一个进程可以由多个称为线程的执行单元组成,每个线程都运行在进程的上下文中,并共享同样的代码和全局数据。 多线程之间比多进程之间更容易共享数据,线程一般也比进程更高效。

 1.7.3虚拟内存

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

 

程序代码和数据:用户进程定义的代码数据;
堆:运行时堆;
共享库:C标准库;

栈:函数调用;

内核虚拟内存:为内核保留,不允许应用程序读写这个区域内容;

1.8 系统之间利用网络通信

网络提供了计算机系统之间通信的手段。从特殊系统的角度来看,网络就是一种I/O设备。

本地主机上的telnet客户端连接远程主机上的telnet服务器,具体过程如下:

1.9 重要主题

1.9.1 Amdahl定律:主要思想是当我们对系统的某个部分加速时,其对系统整体性能的影响取决于该部分的重要性和加速程度。

1.9.2 并发与并行:

  并发指一个同时具有多个活动的系统;并行指的是用并发来使一个系统运行的更快。

1.9.3 计算机系统中抽象的重要性

1.10 小结

  信息就是位+上下文;

  程序被其他程序翻译成不同的格式:预处理器、编译器、汇编器、链接器四个阶段过程;

  处理器读并解释存储在内存中的指令;

  存储设备层次结构:CPU寄存器在顶部,接着是多层的硬件高速缓存存储器,DRAM主存和磁盘存储器;

  操作系统内核三个基本抽象:文件是对I/O设备的抽象;虚拟内存是对主存和磁盘的抽象;进程是处理器、主存和I/O设备的抽象;

       网络提供了计算机系统之间通信的手段。
    

posted @ 2018-10-14 10:27  凌晨六点半  阅读(190)  评论(0编辑  收藏  举报