一.系统的硬件组成
1.1 指令基本运行流程
系统的基本硬件组成为总线、I/O设备(键盘、鼠标、屏幕、磁盘)、主存(内存)、处理器(CPU),以运行一个hello.c程序为例
注意:当我们在键盘敲回车时,shell会将数据从磁盘复制到主存,处理器就开始执行hello程序的main程序中的机器语言指令,将"hello,worldn"字符串中的字节从主存复制到寄存器文件,再从寄存器文件中复制到显示设备,最终显示到屏幕上。
如下图所示1.2 高速缓存至关重要
上例中,系统花费大量时间把信息从一个地方挪到另一个地方,hello程序最初存放在磁盘上,当程序加载时,它们被复制到主存,当处理器运行程序时,指令又从主存复制到处理器。相似的,数据串“hello,world/n”开始时在磁盘上,然后被复制到主存,最后从主存上复制到显示设备。这些复制可以视作开销,减慢了程序运行的速度!
一个典型的体统上磁盘大小可能比主存大1000倍,但对处理器而言,从磁盘上读取一个字的时间开销要比主存中读取一个字要大1000万倍。(寄存器比主存读取文件速度几乎要快100倍,一个CPU可能有多个寄存器,具体根据电脑配置决定),为此系统设计者采用了更小更快的存储设备,称为高速缓存存储器,存放处理器近期可能会需要的信息,意识到高速缓存存储器的存在的应用程序员能够利用高速缓存将程序性能提高一个数量级!
1.3操作系统管理硬件
操作系统可以看做是应用程序与硬件之间插入的一层软件,应用程序对硬件的操作都必须通过操作系统。
操作系统有两个基本功能:(1)防止硬件被失控的应用程序滥用(2)向应用程序提供简单一致的机制来控制复杂而又大不相同的低级硬件设备。操作系统通过几个基本的抽象概念(进程,虚拟内存和文件)来实现这两个功能。
文件是对I/O设备的抽象表示,虚拟内存是对主存和磁盘I/O设备的抽象表示,进程则是对处理器、主存和I/O设备的抽象表示。
1.4进程
当一个可执行程序在现代系统上运行时,操作系统会提供一种假象——好像系统上只有这个程序在运行,看上去只有这个程序在使用处理器,主存和IO设备。
处理器看上去就像在不间断的一条接一条的执行程序中的指令,即改程序的代码和数据是系统存储器中唯一的对象。这些假象是通过进程的概念来实现的。
进程是操作系统对一个正在运行的程序的一种抽象。在一个系统上可以同时运行多个进程,而每个进程都好像在独占的使用硬件。而并发运行,则是说一个进程的指令和另一个进程的指令是交错执行的。
在大多数系统中,需要运行的进程数是多于可以运行他们的CPU个数的。
传统系统在一个时刻只能执行一个程序,而现在的多核处理器同时能够执行多个程序。 无论是在多核还是单核系统中,一个CPU看上去都像是在并发的执行多个进程,这是通过处理器在进程间切换来实现的。操作系统实现这种交错执行的机制称为上下文切换。操作系统保持跟踪进程运行所需的所有状态信息,这种状态,也就是上下文,它包括许多信息,例如PC和寄存器文件的当前值,以及主存的内容。 在任何一个时刻,单处理器系统都只能执行一个进程的代码。 当操作系统决定要把控制权从当前进程转移到某个新进程时,就会进行上下文切换,即保存当前进程的上下文,恢复新进程的上下文,然后将控制权传递到新进程,新进程就会从上次停止的地方开始
1.5线程
一个进程可以由多个称为线程的执行单元组成,每个线程都运行于进程的上下文中,并共享同样的代码和全局数据。
1.6虚拟内存
虚拟内存是一个抽象概念,它为每个进程提供了一个假象,即每个进程都在独占的使用主存,每个进程看到的内存都是一致的,称为虚拟地址空间。
1.7文件
文件就是字节序列,每个I/O设备都可以看做是文件,系统中所有输入输出都是通过UnixI/O的系统函数调用读写文件来实现的
1.8系统之间利用网络通信
现代系统经常通过网络和其他系统连接到一起。从一个单独的系统来看,网络可以视为一个I/O设备,系统可以从主存复制一串字符串到网络适配器到达另一台机器,反之亦然。如下图: