第一章 计算机系统漫游

前言

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

#include<stdio.h>								//贯串全文的hello代码
int main()
{
	printf("hello world\n");
	return 0;
}

    计算机花费了大量的时间在内存、I/O设备和CPU寄存器之间复制数据,所以将系统中的存储设备划分成层次结构——CPU寄存器在顶部,接着是多层的硬件高速缓存存储器、DRAM主存和磁盘存储器。

系统就是位+上下文

    hello程序的生命周期是从一个源程序(源文件 hello.c)开始的。源程序实际上是由值0和1组成的位(bit)序列,8个位被组织为一组,称为字节(Byte)。

    hello.c程序是以字节序列的方式储存在文件中的。像hello.c这样只有ASCII字符构成的文件称为文本文件,所有其他文件都称为二进制文件

    基本思想:系统中的所有信息——包括磁盘文件、内存中的程序、内存中存放的用户数据以及网络上传达的数据,都是由一串比特表示的。区分不同数据对象的唯一方法是我们读到这些数据据对象的上下文。

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

    每条C语句都必须转化为一系列的低级机器语言指令,然后这些指令按照一种称为可执行目标程序的格式打包,并以二进制磁盘文件的形式存放起来。目标程序也成为可执行目标文件

    编译系统:预处理器、编译器、汇编器、链接器。

  • 预处理阶段:(hello.c)进入预处理器(cpp)根据以#开头的命令,读取头文件并插入程序文本中,得到另一个C程序(hello.i)。
  • 编译阶段:编译器(ccl)将文本文件hello.i翻译成文本文件hello.s,它包含一个汇编语言程序。
  • 汇编阶段:汇编器(as)将hello.s翻译成机器语言指令,把这些指令打包成一种可重定位目标程序的格式,并将结果保存在目标文件hello.o(文本编辑器打开后是乱码)中。
  • 链接阶段:printf函数存在于一个名为printf.o的预编译好了的目标文件中,这个文件需要合并到hello.o的程序中。链接器(ld)就负责处理这种合并,得到一个可执行目标文件(二进制)。

了解编译系统如何工作

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

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

    shell是一个命令行解释器,它输出一个提示符,等待输入一个命令行,然后执行这个命令。

  1. 此例中shell加载并运行hello程序,然后等待程序终止。
  2. hello程序在屏幕上输出它的消息,然后终止。
  3. shell随后输出一个提示符,等待下一个输入的命令行。

系统硬件组成

  1. 总线:贯串整个系统的一组电子管道,它携带信息字节并负责在各个部件间传递。通常总线被设计成传送定长的字节块,也就是字(word)。
  2. I/O设备:每个I/O设备都通过一个控制器或适配器与I/O总线相连。控制器和适配器的主要区别是它们的包装方式。控制器是I/O设备本身或者系统的主板的芯片组,适配器是在主板插槽上的卡。
  3. 主存:由一组动态随机存取储存器(DRAM)芯片组成。
  4. 处理器:中央处理单元(CPU),简称处理器,是解释或执行)存储在主存中指令的引擎。处理器的核心是一个大小为一个字的存储设备(或寄存器),称为程序计数器(PC

    寄存器文件是一个小的存储设备,由一些单个字长的寄存器组成,每个寄存器都有唯一的名字。ALU计算新的数据和地址值。CPU在指令的要求下执行加载、存储、操作、跳转操作。

运行hello程序

    初始时,shell程序执行它的指令,等待我们输入命令。当我们在键盘上输入字符串“./hello”后,shell程序将字符逐一读入寄存器,再把它放入内存中。敲下回车后,shell执行一系列指令来加载可执行的hello文件,这些指令将hello目标文件中的代码和数据从磁盘复制到主存。
     一旦目标文件hello中的代码和数据被加载到主存,处理器就开始执行hello程序的main程序中的机器语言指令,这些指令将“hello world\n”字符串中的字节从主存复制到寄存器文件,再从寄存器文件中复制到显示设备,最终显示在屏幕上。

高速缓存

    一个寄存器文件只储存几百字节的信息,主存里存放几十亿字节,处理器从寄存器文件中读数据比从主存中快100倍。针对这种差异,系统设计者采用了更小更快的存储设备,称为高速缓存存储器,作为暂时的集结区域,存放处理器近期可能会需要的信息。
    L1和L2高速缓存是一种叫静态随机访问存储器的硬件技术实现的。比较新的、处理能力更强大的系统甚至有三级高速缓存,L1、L2、L3。系统有一个很大的存储器,访问速度很快,原因就是利用了高速缓存的局部性原理,即程序具有访问局部区域里的数据和代码的趋势。

存储设备形成层次结构

存储器层次结构示例
    主要思想:上一层的存储器作为低一层存储器的高速缓存。

操作系统管理硬件

    两个基本功能:

  • 防止硬件被失控的应用程序滥用。
  • 向应用程序提供一种简单一致的机制来控制复杂而又通常大不相同的低级硬件设备。文件是对I/O设备的抽象表示,虚拟内存是对主存和磁盘I/O设备的抽象表示,进程是对处理器、主存、I/O设备的抽象表示。

1.进程

    进程是操作系统对一个正在运行的程序的一种抽象。在一个系统上可以同时运行多个进程,而每个进程都好像在独占地使用硬件。而并发运行,则是说一个进程的指令和另一个进程的指令是交错执行的。
    操作系统保持跟踪进程运行所需的所有状态信息。这种状态,就是上下文
    从一个进程到另一个进程的转换是由操作系统内核管理的,内核是操作系统代码常驻主存的部分。当应用程序需要操作系统的某些操作时,它就执行一条特殊的系统调用的指令,将控制权传递给内核,然后内核执行被请求的操作并返回应用程序。

2.线程

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

3.虚拟内存

    每个进程看到的内存都是一致的,称为虚拟地址空间。地址空间的底部区域存放用户进程定义的代码和数据。
    每个进程看到的虚拟地址空间由大量准确定义的区构成,每个区都有专门的功能,从最低的地址向上来说,分别是程序代码和数据、堆、共享库、栈、内核虚拟内存。

4.文件

    文件就是字节序列。每个I/O设备,包括磁盘、键盘、显示器、甚至网络,都可看作是文件。

系统之间利用网络通信

现代系统经常通过网络和其他系统连接到一起。从一个单独的系统来看,网络可视为一个I/O设备

重要主题

    系统是硬件和系统软件互相交织的集合体。

1.Amdahl定律

    当我们对系统部分加速时,其对整体性能的影响取决于该部分的重要性和加速度。若系统执行某应用程序需要时间为Told,假设系统某部分所需执行时间与该时间的比例为a,而该部分性能提升比例为k。即该部分初始所需时间为aTold,现在所需时间为(aTold)/k,因此,总的执行时间为

                                Tnew = Told[(1 - a) + a / k ]

2.并发和并行

    并发是一个通用概念,指一个同时具有多个活动的系统;而并行是用并发来使一个系统运行得更快。并行可以在计算机系统的多个抽象层次上运用。

2.1线程级并发

    并发形式允许多个用户同时与系统交互。
    当构建一个由单操作系统内核控制的多处理器组成的系统时,我们就得到了一个多处理器系统。
    超线程,也被称为同时多线程,是一项允许一个CPU执行多个控制流的技术。
    多处理器的使用从两方面提高系统性能:1.减少了执行多个任务时模拟并发的需要。2.它使应用程序运行的更快。

2.2指令级并行

    现代处理器可以执行多条指令的属性被称为指令级并行
    处理器可以达到一个周期一条指令更快的执行效率,称之为超标量处理器

2.3单指令、多数据并行

    允许一条指令产生多个可以并行执行的操作,这种方法称为单指令、多数据,即SIMD并行

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

    为一组函数规定一个简单的应用程序接口(API)是一个很好的编程习惯。
    在处理器中,指令集架构提供了对实际处理器硬件的抽象,文件是对I/O设备的抽象表示,虚拟内存是对主存和磁盘I/O设备的抽象表示,进程是对处理器、主存、I/O设备的抽象表示,虚拟机是对整个计算机的抽象。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值