本文若未注明均摘抄自《操作系统精髓与设计原理》:William Stallings著,陈向群、陈渝译,机械工业出版社出版第六版
关键词 | |||
---|---|---|---|
批处理 | 管程 | 物理地址 | 串行处理 |
批处理系统 | 单体内核 | 特权指令 | 对称多处理 |
执行上下文 | 多道批处理系统 | 进程 | 任务 |
中断 | 多道程序设计 | 进程状态 | 线程 |
作业 | 多任务 | 实地址 | 分时 |
作业控制语言 | 多线程 | 常驻监控程序 | 分时系统 |
内核 | 时间片轮转 | 但到程序设计 | 内存管理 |
操作系统 | 调度 | 虚地址 | 微内核 |
操作系统是应用程序和计算机之间的接口,它的目标是方便、有效、可扩展。
应用程序的用户,即终端用户,通常不需要关心计算机的硬件细节。
如果完全用控制计算机硬件的机器指令开发应用程序,将是非常复杂的任务。为了简化这个任务,操作系统提供了以下几个方面的服务:
一台计算机就是一组资源,这些资源用于对数据的移动、存储和处理, 以及对这些功能的控制。操作系统负责管理这些资源。
操作系统也是一种软件,与普通计算机软件原理相同,因此也经常会释放控制,而且必须依赖处理器才能恢复控制。
原始的串行系统存在两个影响性能的问题:
为了克服串行处理的弊端,人们开始开发批处理操作系统,简单批处理方案的中心思想是使用一个称作监控程序的软件。计算机操作人员直接将一批作业放在输入设备上,这个监控程序将自动顺序加载这些作业。
简单的说,这个监控程序对于处理器来说就是一个不断调用其他子程序的常驻程序,称为常驻监控程序(resident monitor),每个用户作业被当作子程序调用,结束后就又返回到常驻监控程序中。
简单批处理系统相对于串行处理而言最大的进步之处在于使用了一下概念
简单批处理系统相当于一种自动作业序列,在这种系统中,处理器在某些情况下依然会长时间空闲,问题在于I/O设备相对于处理器太慢。
图2.5a显示了这种只有一个单独程序的情况,称作单道程序设计(uniprogramming)。这种低效可以在多道程序设计批处理系统中得到改善。这种系统可以保存三个、四个甚至更多的程序,并在他们之间切换(见图2.5c),这种处理称作多道程序设计(multiprogramming)或多任务处理(multitasking),他是现代操作系统多任务方案的最初形态。
对多道程序设计有用的最显著的辅助功能是支持I/O终端和直接存储器访问操作(DMA)的硬件。多道程序操作系统相比单个程序或单道程序系统,由于需要在同一时段内运行多个作业,这些作业必须同时存在于内存中,这就需要内存管理(memory management)。此外还需要决定哪个作业先运行的调度算法。
多道程序设计批处理系统示例:
类别 | JOB1 | JOB2 | JOB3 |
---|---|---|---|
作业类型 | 大量计算 | 大量I/O | 大量I/O |
持续时间 | 5分钟 | 15分钟 | 10分钟 |
需要的内存 | 50M | 100M | 75M |
是否需要磁盘 | 否 | 否 | 是 |
是否需要终端 | 否 | 是 | 否 |
是否需要打印机 | 否 | 否 | 是 |
类别 | 单道程序设计 | 多道程序设计 |
---|---|---|
处理器使用 | 20% | 40% |
存储器使用 | 33% | 67% |
磁盘使用 | 33% | 67% |
打印机使用 | 33% | 67% |
总运行时间 | 30分钟 | 15分钟 |
吞吐量 | 6个作业/小时 | 12个作业/小时 |
平均响应时间 | 18分钟 | 10分钟 |
分时系统与前述的多道程序设计批处理系统在基本理念上相似,但侧重不同,后者的目的在于充分使用CPU的运算资源,而前者的设计目的在于能够同时响应多个用户的请求。
在这种系统中,系统时钟会以固定频率产生中断,在每个中断处,系统得到控制权并将处理器分配给另一位用户。这项技术被称为时间片(Time slicing)技术。在每个新用户程序得到CPU控制权之前老的用户程序和数据被写出到磁盘。当获得下一次机会时,老的用户程序代码和数据才被恢复到内存中。
新来的的程序只会占用内存中恰好足够他使用的空间,这样可以节省磁盘读取开销(如图2.7)
分时和多道程序设计引发了操作系统中许多的新问题,如内存中有多个作业时必须保护它们互不干扰,有多个用户时,必须对文件系统进行保护,还必须处理资源竞争问题。针对这些问题在现代操作系统中已经有了一些较为成熟的解决方案。
现代操作系统已经采用了一些行之有效的办法,来使得多任务处理变得可靠健壮。[DENN80a]提出在操作系统开发中的五个重要理论进展:进程、内存管理、信息保护和安全、调度和资源管理、系统结构。接下来将对这五个领域进行简单的回顾。
进程的定义:
计算机系统的发展有三条主线:多程序批处理操作、分时和实时事务系统,在这些类型的系统中,总是要面对将有不同活动需要同时被处理。这样的处理很容易出现一些错误,而这些错误的产生又主要有4种原因:
解决这些问题的一种概念就是——进程,进程可以看作由三部分组成:
其中执行上下文(execution context)是进程的根本,又被称作进程状态(process state),是操作系统用来管理和控制进程所需的内部数据。这种内部信息和进程是分开的,因为操作系统不允许被进程直接访问。
以图2.8为例,进程表的每条表项对应一个进程,表项内容包括指向包含进程的存储块地址的指针,还包括该进程的部分或全部执行上下文。进程索引寄存器(process index register)负责记录当前处理器正在处理的进程。当需要由A切换到B时,先将当前上下文存入到A的表项,再将B的表项中的上下文加载到各寄存器。
根据博主理解,其过程其实和调用函数时将CPU状态压入堆栈原理相似。其实就相当于运行栈中各层CPU状态是以“栈”的数据结构组织的,后存储的先被还原;而在进程表中,CPU状态是以“队列”形式组织的,你存我加载,轮流得到时间片。
操作系统担负着五个基本的存储器管理责任:
典型情况下,操作系统使用虚拟存储器和文件系统机制来满足这些要求。虚拟存储机机制允许程序从逻辑的角度访问存储器,而不考虑物理内存上可用的空间数量。
当处理器在切换进程时,由于一些进程体积偏大,很难被紧密的压入内存中,因此引进了分页系统。在分页系统中进程被分割为固定大小的块,被称作页。程序通过虚地址(virtual address)访问字,虚拟地址又页号和页中的偏移量组成。
进程被分为多个页之后,就可以以页为单位零散的分配在内存中。分页系统提供了程序中使用的虚拟地址和内存中的实地址(real address)或称物理地址之间的动态映射。
大多数与操作系统相关的安全保护问题可分为四类
操作系统的一个关键任务是管理各种可用资源(内存空间、I/O设备、处理器),并调度各种活动进程使用这些资源。分配和调度策略必须考虑3个要素:公平性、有差别的响应性、有效性。
图2.11给出了多道程序设计环境中涉及进程调度和资源分配的操作系统主要组件。操作系统中维护者多个队列,每个队列代表着等待某些资源的进程的简单列表。
短期队列中包含了等待处理器并且随时可以准备运行的进程。而具体哪个进程会下一个使用处理器取决于短期调度器,或称为分派器(dispatcher)。一个常用的策略是依次给队列中的每一个进程一定的时间(时间片技术 round-robin)。另一种策略是带优先级队列。
长期队列是等待使用处理器的新作业列表。作为短期队列的补充。
I/O队列用于排列多个请求使用同一个I/O的进程
一个功能完善的操作系统导致了4个让人遗憾但又普遍存在的问题
对于大型操作系统,软件的体系结构和信息抽象的概念得到越来越广泛的使用,通常情况下被设计成一系列的层
层 | 名称 | 对象 | 示例操作 |
---|---|---|---|
13 | shell | 用户程序设计环境 | shell语言中的语句 |
12 | 用户进程 | 用户进程 | 退出、终止、挂起和恢复 |
11 | 目录 | 目录 | 创建、销毁、连接、分离、查找和列表 |
10 | s设备 | 外部设备,如打印机、显示器和键盘 | 打开、关闭、读写 |
9 | 文件系统 | 文件 | 创建、销毁、打开、关闭、读写 |
8 | 通信 | 管道 | 创建、销毁、打开、关闭、读写 |
↓ | 开发者透明 | ||
7 | 虚拟存储器 | 段、页 | 读写和取 |
6 | 本地辅助存储器 | 数据块、设备通道 | 读写、分配和空闲 |
5 | 原始进程 | 原始进程、信号量、准备就绪列表 | 挂起、恢复、等待和发信号 |
↓ | HAL | ||
4 | 中断 | 中断处理程序 | 调用、屏蔽、去屏蔽和重试 |
3 | 过程 | 过程、调用栈、显示 | 标记栈、调用、返回 |
2 | 指令集合 | 计算栈、微程序解释器、标量和数组数据 | 加载、保存、加操作、减操作、转移 |
1 | 电路 | 寄存器、门、总线 | 清空、传送、激活、求反 |
至今大多数操作系统都有一个单体内核(monolithic kernel),微内核体系结构只给内核分配一些最基本的功能,包括地址空间、进程间通信(InterProcess Communication, IPC)和基本调度。
线程和进程有以下区别:
在拥有多个微处理器的计算机上,为了实现更高的有效性和可靠性,可使用对称多线程(Symmetric MultiProcessing, SMP)技术。对称多处理计算机可以定义为具有以下特征的一个独立的计算机系统:
近年来单芯片上的多处理器系统(也称为单片多处理器系统)已经开始广泛应用。
没细看,只放张图
没细看,只放张图
没细看,只放张图
Linux的结构是一个模块的结合,这些模块可以根据需要自动地加载或卸载,这些相对独立的块叫做可加载模块(loadable module)。因此虽然Linux被认为是单体内核,但他的模块结构克服了在开发和发展内核过程中所遇到的困难。
Linux可加载模块有两个重要特征:
图2.17举例说明了Linux的管理模块的结构,该图显示了当只有两个模块FAT和VFAT被加载后内核模块的列表。每个模块有两个表定义,即符号表和模块表。模块表包含以下元素:
图2.17显示了VFAT模块在FAT模块后被加载,并且它依赖于FAT模块
图2.18显示了基于IA-64体系结构(例如Intel Itanium)的Linux内核的主要组件。
主要内核组件简介如下: