操作系统的任务是为用户程序提供一个更好、更简单、更清晰的计算机模型,管理计算机硬件设备。
用户与操作系统之间进行交互的程序,基于文本的称为shell,基于图形的称为GUI,他们实际上并不是操作系统的一部分。
操作系统的简化视图如下:
多数计算机拥有两种运行模式:内核态和用户态。
操作系统运行在内核态,对硬件具有完全的访问权,其余软件运行在用户态,使用机器指令的一个子集,那些会影响机器控制或是I/O操作的,在用户态中的程序是禁止的。
用户接口程序:shell或GUI,处于用户态最底层,允许用户运行其他程序。
操作系统运行在裸机上,为其他软件提供基础运行时环境。
操作系统不允许用户修改,由硬件保护。
在用户态下的程序也能协助操作系统完成特权功能,这些软件很难划分是否属于操作系统。
什么是操作系统:
可以理解为运行在内核态上的软件,但不总是符合现实。操作系统执行两个基本独立的任务:为程序员提供各个资源集的清晰抽象,并管理这些硬件资源,下面从不同功能角度介绍。
1.扩展机器
由于机器语言的复杂性,需要对硬件进行抽象化,隐藏对硬件操作的一些具体细节。文件就是对磁盘的抽象,对磁盘的操作,可以简化为文件的读写。
抽象是管理复杂性的一个关键。好的抽象可以把一个几乎不可能管理的部分划分为两个可管理的部分,一个是有关抽象的定义和实现,一个是随时用这些抽象解决问题。操作系统的任务是创建好的抽象,并实现和管理它所创建的抽象对象。
操作系统的实际用户是应用程序,直接与操作系统及其抽象打交道。而最终用户与用户接口提供的抽象打交道,shell或是GUI。
2.资源管理者
上面的概念讲了操作系统向应用程序提供各种抽象,另一种观点是用来管理复杂系统的各个部分。操作系统的任务是在相互竞争的程序之间有序的控制硬件。
资源管理通过用以下两种不同方式实现多路复用:在时间上复用和在空间上复用。
时间上复用:不同程序或用户轮流使用。
空间上复用:将内存划分为多个部分给不同的应用程序。
操作系统的历史:
第一代:真空管和穿孔卡片
第二代:晶体管和批处理系统
第三代:集成电路芯片和多道程序设计
第四代:个人计算机
计算机硬件介绍:
一般的计算机可以抽象为以下的模型:
1.处理器:
从内存中读取指令并执行,每一个CPU有专门的指令集,寄存器的出现加快了访问数据的速度。
程序计数器保存后一条指令的地址。
堆栈指针指向内存中当前栈的顶端。
程序状态字PSW保存了条件码位、CPU优先级、模式(用户态还是内核态)以及其他控制位。
在时间多路复用CPU中,操作系统会终止正在运行的某个程序并启动另一个程序,停止一个运行的程序时,必须保存所有的寄存器,稍后程序再次运行时可以把这些寄存器重新载入。
流水线:分开的取指单元、解码单元和执行单元。
超标量CPU:多个执行单元,一个执行单元空闲,就检查缓冲区是否有可用的指令。
CPU有用户态和内核态两种模式,由PSW控制,内核态运行时,CPU可以使用每一条指令,用户态运行时,只能使用部分指令。
为了从操作系统中获得服务,需要使用系统调用。
TRAP指令把用户态切换为内核态,并启动操作系统,工作完成后,系统调用后面的指令把控制权返还给用户。
计算机使用陷阱(TRAP)而不是一条指令来执行系统调用。多数陷阱由硬件引起,用于警告异常。
多线程和多核芯片:
多线程允许CPU保持两种不同的线程状态,在纳秒级的时间内来回切换。多线程不提供真正的并行处理。
每个线程在操作系统看来像是单独的CPU。
图中多核芯片上有效的装有4个小芯片,每一个小芯片都是一个独立的CPU。
2.存储器:
由于无法同时满足速度快、容量大、价格便宜多个优势,出现分层次结构。
顶层的存储器速度较高,容量较小,底层反之。
寄存器与CPU相同材料制成,与CPU一样快。存储容量是:32位CPU中32*32位,64位CPU中64*64位。
高速缓存多数由硬件控制。主存被分割为高速缓存行,典型大小为64个字节,地址0~63对应高速缓存行0,地址64~127对应高速缓存行1。最常用的高速缓存行放置在CPU内部或是接近CPU的高速缓存中。当某个程序需要读取一个存储字时,高速缓存硬件检查所需要的高速缓存行是否在高速缓存中,若果是,称为高速缓存命中,不需要访问内存,未命中则需要访问内存。
在任何的缓存系统中,需要考虑的问题:
1.何时把一个新的内容放入缓存
2.把新内容放在缓存的哪一行上
3.在需要时,应该把哪个内容从缓存上移走
4.应该把新移走的内容放在某个较大存储器的何处
CPU中设计了两种缓存,第一级L1总在CPU中,通常用来将以解码的指令调入CPU的执行引擎。对于频繁使用的数据字,多数芯片设计有第二个L1缓存。二级缓存L2用来存放近来所使用的若干兆字节的内存字。L1和L2的差别在于时序,L1的访问不存在延时,L2的访问存在1或2个时钟周期。
主存称为随机访问存储器(RAM),过去有时称为磁芯存储器。
只读存储器(ROM)不可修改,一般用于启动计算机的引导加载模块。
EEPROM和闪存可以擦除和重写,但重写比写入RAM更高数量级的时间。在电子设备中,闪存常用于存储媒介。
CMOS存储器是易失性的,许多计算机用来保存当前时间和日期,由电池驱动。
3.磁盘:
磁盘的容量大,但随即访问速度慢,原因在于磁盘是机械装置:
在一个磁盘中有一个或多个金属盘片,以5400、7200或10800rpm的速度旋转。边缘有一个机械臂。信息写在磁盘上的一些列同心圆上。在任意给定臂的位置,每个磁头可以读取一段环形区域,称为磁道,把一个给定臂的所有磁道合并起来,组成了一个柱面。
每个磁道划分为若干个扇区,扇区的典型值都是512字节。
虚拟内存机制:将程序放在磁盘上,将主存作为一种缓存,用来保存最频繁使用的部分程序。这种机制需要快速的映像内存地址,以便把程序生成的地址转化为有关字节在RAM中的物理地址。由存储器管理单元(MMU)完成。
4.磁带:
一般用于磁盘的备份。
5.I/O设备:
I/O设备一般包括两个部分:设备控制器和设备本身。
控制器的任务是为操作系统提供一个简单的接口,通常在控制器中需要安装一个小的计算机。
设备本身有个相对简单的接口,因为接口既不能做很多工作,又已经被标准化了。IDE磁盘控制器可以适应任意一种IDE磁盘。
专门与控制器对话,发出命令并接受响应的软件称为设备驱动程序。为了使用设备驱动程序,需要装入到操作系统中,在内核态中运行,装入有3中途径:
第一种:将内核与设备驱动程序重新链接,重启系统(UNIX)
第二种:操作系统文件中设置一个入口,并通知该文件需要一个设备驱动程序,然后重启系统,在启动时,操作系统会寻找设备驱动程序并装载(Windows)
第三种:操作系统在运行时接受新的设备驱动程序并立即装好,无需重启(热插拔设备)
每个设备都有用于通信的寄存器,所有设备寄存器的集合构成了I/O端口空间。
有些计算机中,设备寄存器映射到操作系统的地址空间,不需要专门的I/O指令。另一些计算机中,设备寄存器被放入一个专门的I/O空间中,每个寄存器都有一个端口地址。这些机器提供内核态可使用的专门的IN/OUT指令,供设备驱动器读写这些寄存器使用。
输入和输出的方式分为三种:
第一种:用户程序发出一个系统调用,内核将其翻译为一个对应设备驱动程序的过程调用。然后设备驱动程序启动I/O并在一个连续不断的设备中检查该设备,看该设备是否完成工作。I/O结束后,设备驱动程序把数据送到指定地方,并返回。然后操作系统将控制返回给调用者。这种方式称为忙等待,需要一直占用CPU。
第二种:设备驱动程序启动设备并且让该设备在操作完成时返回一个中断。设备驱动程序在这个时刻返回。操作系统接着在需要时阻塞调用者并安排其他操作,当设备驱动程序检测到设备的完成时,发出一个中断通知操作完成。
一旦CPU决定取中断,通常程序计数器和PSW被压入当前堆栈中,CPU被切换到用户态。设备编号可以称为部分内存的一个引用,用于寻找该设备中断处理程序的地址。这部分内存称为中断向量。当中断处理程序开始后,取走以入栈的程序计数器和PSW,并保存之,然后查询设备的状态。当中断处理程序全部完成后,返回先前运行的用户程序中尚未执行的头一条指令。
第三种:为I/O使用一种特殊的直接存储器访问(DMA)芯片,可以控制在内存和某些控制器之间的位流,无需持续的CPU干预。CPU对DMA芯片进行设置,启动DMA。当DMA芯片完成时,引发一个中断。
在中断关闭时,多个设备发出中断,中断控制器决定使用哪个,取决于设备的静态优先级。
6.总线:
图中含有8个总线:高速缓存、局部、内存、PCI、SCSI、USB、IDE、ISA
两个主要的总线:早期IBM PC的ISA总线和后继者PCI总线
CPU通过局部总线与PCI桥芯片对话PCI桥芯片通过专门的存储总线与存储器对话。
三个专门的总线:USB、IDE和SCSI。IDE用来连接诸如磁盘和CD-ROM,USB用来连接所有慢速I/O设备,SCSI用来连接高速硬盘和扫描器
7.启动计算机:
主板上的BIOS程序->BIOS检查基本硬件->通过存储在CMOS中的设备清单决定启动设备->操作系统询问BIOS获得配置信息->调入内核等
操作系统大观园:
1.大型机操作系统
OS/390 面向多个作业的同时处理,提供3种服务:批处理、事物处理、分时处理
2.服务器操作系统
通过网络同时为若干个用户服务
3.多处理器操作系统
4.个人计算机操作系统
5.掌上计算机操作系统
6.嵌入式操作系统
7.传感器节点操作系统
8.实时操作系统
9.智能卡操作系统