操作系统
1.1 操作系统的概念、特征、功能、目标
操作系统( Operating System,OS)是指控制和管理整个计算机系统的硬件和软件资源,并合理地组织调度计算机的工作和资源的分配,以提供给用户和其他软件方便的接口和环境的程序集合。
计算机操作系统是随着计算机研究和应用的发展逐步形成并发展起来的,它是计算机系统中最基本的系统软件。
1.1.1 操作系统的特征
操作系统的基本特征包括并发、共享、虚拟和异步。
1.1.1.1 并发( Concurrence)
并发是指两个或多个事件在同一时间间隔内发生。在多道程序环境下,一段时间内宏观上有多道程序在同时执行,而在每一时刻,单处理机环境下实际仅能有一道程序执行,故微观上这些程序还是在分时地交替执行。操作系统的并发性是通过分时(时分复用技术)得以实现的。
虽然现在CPU很多都是多核的,但是程序有可能很多,所以并发还是很重要.
1.1.1.2 共享( Sharing)
资源共享即共享,是指系统中的资源可供内存中多个并发执行的进程共同使用。
共享可分为以下两种资源共享方式:
(1)互斥共享方式
系统中的某些资源,如打印机、磁带机,虽然它们可以提供给多个进程使用,但为使所打印或记录的结果不致造成混淆,应规定在一段时间内只允许一个进程访问该资源。为此,当进程A访问某资源时,必须先提出请求,如果此时该资源空闲,系统便可将之分配给进程A使用,此后若再有其他进程也要访问该资源时(只要A未用完)则必须等待。仅当进程A访问完并释放该资源后,才允许另一进程对该资源进行访问。我们把这种资源共享方式称为互斥式共享,而把在一段时间内只允许一个进程访问的资源称为临界资源或独占资源。计算机系统中的大多数物理设备,以及某些软件中所用的栈、变量和表格,都属于临界资源,它们都要求被互斥地共享
(2)同时共享方式
系统中还有另一类资源,允许在一段时间内由多个进程“同时”对它们进行访问。这里所谓的“同时”往往是宏观上的,而在微观上,这些进程可能是交替地对该资源进行访问,即“分时共享”,典型的可供多个进程“同时”访问的资源是磁盘设备,一些用重入码编写的文件也可以被“同时”共享,即若干个用户同时访问该文件.
要注意到,互斥共享,是因为一种资源在一段时间内(哪怕是一段很小的时间)只能满足一个请求,否则就会出现严重的问题(如打印机,第一行打印A文档的内容,第二行打印B文档的内容,你能想象是什么效果吗?).而同时共享方式,通常要求,一个请求分几个时间片段间隔地完成的效果,与连续完成的效果相同
并发和共享是操作系统两个最基本的特征,这两者之间又是互为存在条件的:
① 资源共享是以程序的并发为条件的,若系统不允许程序并发执行,则自然不存在资源共享问题(无意义)
② 若系统不能对资源共享实施有效的管理,也必将影响到程序的并发执行,甚至根本无法并发执行
1.1.1.3 虚拟( Virtual)
虚拟是指把一个物理上的实体变为若干个逻辑上的对应物。物理实体(前者)是实的,即实际存在的;而后者是虚的,是用户感觉上的事物。用于实现虚拟的技术,称为虚拟技术。在操作系统中利用了多种虚拟技术,分别用来实现虚拟处理器、虚拟内存和虚拟外部设备等。
在虚拟处理器技术中,是通过多道程序设计技术,让多道程序并发执行的方法,来分时使用一个处理器的。此时,虽然只有一个处理器,但它能同时为多个用户服务,使每个终端用户都感觉有一个*处理器(CPU)在专门为它服务。利用多道程序设计技术,把一个物理上的CPU虚拟为多个逻辑上的CPU,称为虚拟处理器
类似地,可以通过虚拟存储器技术,将一台机器的物理存储器变为虚拟存储器,以便从逻辑上来扩充存储器的容量。当然,这时用户所感觉到的内存容量是虚的。我们把用户所感觉到的存储器(实际是不存在的)称为虚拟存储器。还可以通过虚拟设备技术,将一台物理I/O设备虚拟为多台逻辑上的I/O设备,并允许每个用户占用一台逻辑上的I/O设备,这样便可以使原来仅允许在一段时间内由一个用户访问的设备(即临界资源),变为在一段时间内允许多个用户同时访问的共享设备.因此,操作系统的虚拟技术可归纳为:时分复用技术,如处理器的分时共享;空分复用技术,如虚拟存储器。
把CPU抽象成进程,把磁盘抽象成文件,把内存抽象成地址空间
1.1.1.4 异步((Asynchronism)
在多道程序环境下,允许多个程序并发执行,但由于资源有限,进程的执行不是一贯到底,而是走走停停,以不可预知的速度向前推进,这就是进程的异步性.
1.1.2 操作系统的目标和功能
1.1.2.1 操作系统作为计算机系统资源的管理者
(1)处理机管理
在多道程序环境下,处理机的分配和运行都以进程(或线程)为基本单位,因而对处理机的管理可归结为对进程的管理。
并发时在计算机内同时运行多个进程,所以,进程何时创建、何时撤销、如何管理、如何避免冲突、合理共享就是进程管理的最主要的任务。
进程管理的主要功能有:进程控制、进程同步、进程通信、死锁处理、处理机调度等。
(2)存储器管理
存储器管理是为了给多道程序的运行提供良好的环境,方便用户使用以及提高内存的利用率,主要包括内存分配、地址映射、内存保护与共享和内存扩充等功能
(3)文件管理
计算机中的信息都是以文件的形式存在的,操作系统中负责文件管理的部分称为文件系统。
文件管理包括文件存储空间的管理、目录管理及文件读写管理和保护等。
(4)设备管理
设备管理的主要任务是完成用户的I/O请求,方便用户使用各种设备,并提高设备的利用率,主要包括缓冲管理、设备分配、设备处理和虚拟设备等功能。
1.1.2.2 操作系统作为用户与计算机硬件系统之间的接口
操作系统提供的接口主要分为两类
一类是命令接口,用户利用这些操作命令来组织和控制作业的执行;另一类是程序接口,编程人员可以使用它们来请求操作系统服务。
(1)命令接口
使用命令接口进行作业控制的主要方式有两种,即联机控制方式和脱机控制方式。按作业控制方式的不同,可以将命令接口分为联机命令接口和脱机命令接口
联机命令接口又称交互式命令接口,适用于分时或实时系统的接口。它由一组键盘操作命令组成。用户通过控制台或终端输入操作命令,向系统提出各种服务要求。用户每输入完一条命令,控制权就转入操作系统的命令解释程序,然后由命令解释程序对输入的命令解释并执行,完成指定的功能。之后,控制权又转回到控制台或终端,此时用户又可以输入下一条命令.
脱机命令接口又称批处理命令接口,即适用于批处理系统,它由一组作业控制命令(或称作业控制语句)组成。脱机用户不能直接干预作业的运行,应事先用相应的作业控制命令写成一份作业操作说明书,连同作业一起提交给系统。当系统调度到该作业时,由系统中的命令解释程序,对作业说明书上的命令或作业控制语句逐条解释执行,从而间接地控制作业的运行,联机命令接口可以理解为:“雇主”说一句话,“工人”做一件事,并做出反馈,这就强调了交互性。
(2)程序接口
程序接口由一组系统调用命令(简称系统调用,也称广义指令)组成。用户通过在程序中使用这些系统调用命令来请求操作系统为其提供服务。用户在程序中可以直接使用这组系统调用命令向系统提出各种服务要求,如使用各种外部设备,进行有关磁盘文件的操作,申请分配和回收内存以及其他各种控制要求
操作系统不允许用户直接操作各种硬件资源,因此用户程序只能通过系统调用的方式来请求内核为其服务,间接地使用各种资源
(3) GUI
图形用户界面(GUI)即图形接口,用户通过鼠标和键盘,在图形界面上单击或使用快捷键就能很方便地使用操作系统。有些系统提供了上述三种接口,但GUI最终是通过调用程序接口实现的,严格地说GUI图形接口不属于操作系统的一部分,但图形接口所调用的系统调用命令,属于操作系统的一部分.
1.1.2.3 操作系统用做扩充机器
没有任何软件支持的计算机称为裸机,它仅构成计算机系统的物质基础,而实际呈现在用户面前的计算机系统是经过若干层软件改造的计算机。裸机在最里层,它的外面是操作系统,由操作系统提供的资源管理功能和方便用户的各种服务功能,将裸机改造成功能更强、使用更方便的机器,通常把覆盖了软件的机器称为扩充机器,又称之为虚拟机.
单处理机系统中,可并行的是(D).
I.进程与进程 Ⅱ.处理机与设备 Ⅲ.处理机与通道 Ⅳ.设备与设备
A.I、Ⅱ、Ⅲ
B.I、Ⅱ、Ⅳ
C.I、Ⅲ、Ⅳ
D.Ⅱ、Ⅲ、Ⅳ
在单处理机系统(不包含多核的情况)中,同一时刻只能有一个进程占用处理机,
因此进程之间不能并行执行。通道是独立于CPU的控制输入输出的设备,两者可以并行,显然,
处理器与设备是可以并行的,难道CPU和显示屏不能并行工作?设备与设备是可以并行的,难道显示屏与打印机不
能并行工作?
1.2 操作系统的发展与分类
1.2.1 手工操作阶段(此阶段无操作系统)
用户在计算机上操作的所有工作都要人工干预,如程序的装入、运行、结果的输出等。随着计算机硬件的发展,人机矛盾(速度和资源利用)越来越大,必须寻求新的解决办法。
手工操作阶段有两个突出的缺点:
1)用户独占全机。不会出现因资源已被其他用户占用而等待的现象,但资源利用率低。
2)CPU等待手工操作,CPU的利用不充分。唯一的解决办法就是用高速的机器代替相对较慢的手工操作来对作业进行控制
1.2.2 批处理阶段(操作系统开始出现)
为了解决人机矛盾及CPU和I/O设备之间速度不匹配的矛盾,出现了批处理系统。
它按发展历程又分为单道批处理系统、多道批处理系统(多道程序设计技术出现以后)
1)单道批处理系统
系统对作业的处理是成批进行的,但内存中始终保持一道作业。
该系统是在解决人机矛盾和CPU与 I/O 设备速率不匹配的矛盾
中形成的。单道批处理系统的主要特征如下
1)自动性。在顺利的情况下,在磁带上的一批作业能自动地逐个依次运行,而无需人工
2)顺序性。磁带上的各道作业是顺序地进入内存,各道作业的完成顺序与它们进入内存的顺序,在正常情况下应完全相同,亦即先调入内存的作业先完成
3)单道性。内存中仅有一道程序运行,即监督程序每次从磁带上只调入一道程序进入内存运行,当该程序完成或发生异常情况时,才换入其后继程序进入内存运行
此时面临的问题是:每次主机内存中仅存放一道作业,每当它运行期间(注意这里是“运行时”,并不是“完成后”)发出输入输出请求后,高速的CPU便处于等待低速的I/O完成状态.为了进一步提高资源的利用率和系统的吞吐量,引入了多道程序技术.
2)多道批处理系统
多道程序设计技术允许多个程序同时进入内存并运行。即同
时把多个程序放入内存,并允许们交替在CPU中运行,它们
共享系统中的各种硬、软件资源。当一道程序因I/O请求而暂
停运行时,CPU便立即转去运行另一道程序。
多道程序设计的特点有:多道、宏观上并行、微观上串行。
1)多道:计算机内存中同时存放多道相互独立的程序。
2)宏观上并行:同时进入系统的多道程序都处于运行过程中,即它们先后开始了各自的运行,但都未运行完毕。
3)微观上串行:内存中的多道程序轮流占有CPU,交替
执行多道程序设计技术的实现需要解决下列问题
1)如何分配处理器
2)多道程序的内存分配问题。
3)I/O设备如何分配。
4)如何组织和存放大量的程序和数据,以便于用户使用和保证其安全性与一致性。
优点是资源利用率高,多道程序共享计算机资源,从而使各种资源得到充分利用:系统吞吐量大,CPU和其他
资源保持“忙碌”状态。
缺点是用户响应的时间较长。不提供人机交互能力,用户既不能了解自己程序的运行情况,也不能控制计算机.
1.2.3 分时操作系统
在操作系统中采用分时技术就形成了分时系统。所谓分时技术就是把处理器的运行时间分成很短的时间片,按时间片轮流把处理器分配给各联机作业使用。若某个作业在分配给它的时间片内不能完成其计算,则该作业暂时停止运行,把处理器让给其他作业使用,等待下一轮再继续运行。
由于计算机速度很快,作业运行轮转得很快,给每个用户的感觉好像是自己独占一台计算机,分时操作系统是多个用户通过终端同时共享一台主机,这些终端连接在主机上,用户可以同时与主机进行交互操作而互不干扰。
分时系统也是支持多道程序设计的系统,但它不同于多道批处理系统。多道批处理是实现作业自动控制而无需人工干预的系统,而分时系统是实现人机交互的系统,这使得分时系统具有与批处理系统不同的特征,其主要特征如下:
1)同时性。同时性也称多路性,指允许多个终端用户同时使用一台计算机,即一台计算机与若干台终端相连接,终端上的这些用户可以同时或基本同时使用计算机。
2)交互性。用户能够方便地与系统进行人机对话,即用户通过终端采用人机对话的方式直接控制程序运行,与同程序进行交互。
3)独立性。系统中多个用户可以彼此独立地进行操作,互不干扰,单个用户感觉不到别人也在使用这台计算机,好像只有自己单独使用这台计算机一样
4)及时性。用户请求能在很短时间内获得响应。分时系统采用时间片轮转方式使一台计算机同时为多个终端务,使用户能够对系统的及时响应感到满意虽然分时操作系统比较好地解决了人机交互问题,但是在一些应用场合,需要系统能对外部的信息在规定的时间(比时间片的时间还短)内作出处理(比如飞机订票系统或导弹制导系统).因此,实时系统应运而生。
1.2.4 实时操作系统
为了能在某个时间限制内完成某些紧急任务而不需时间片排队,诞生了实时操作系统。
这里的时间限制可以分为两种情况:如果某个动作必须绝对地在规定的时刻(或规定的时间范围)发生,则称为硬实时系统。例如,飞行器的飞行自动控制系统,这类系统必须提供绝对保证,让某个特定的动作在规定的时间内完成。
如果能够接受偶尔违反时间规定,并且不会引起任何永久性的损害,则称为软实时系统,如飞机订票系统、银行管理系统,在实时操作系统的控制下,计算机系统接收到外部信号后及时进行处理,并且要在严格的时限内处理完接收的事件。实时操作系统的主要特点是及时性和可靠性。
1.2.5 网络操作系统和分布式计算机系统
网络操作系统把计算机网络中的各台计算机有机地结合起来,提供一种统一、经济而有效的使用各台计算机的方法,实现各个计算机之间的互相传送数据。
网络操作系统最主要的特点是网络中各种资源的共享以及各台计算机之间的通信,分布式计算机系统是由多台计算机组成并满足下列条件的系统:
系统中任意两台计算机通过通信方式交换信息:系统中的每一台计算机都具有同等的地位,即没有主机也没有从机;每台计算机上的资源为所有用户共享;系统中的任意若干台计算机都可以构成一个子系统,并且还能重构;任何工作都可以分布在几台计算机上,由它们并行工作、协同完成。用于管理分布式计算机系统的操作系统称为分布式计算机系统。该系统的主要特点是:分布性和并行性。分布式操作系统与网络操作系统本质上的不同之处在于分布式操作系统中,若干台计算机相互协同完成同一任务。
1.2.6 个人计算机操作系统
个人计算机操作系统是目前使用最广泛的操作系统,广泛应用于文字处理、电子表格、游戏等。常见的有
Windows、 Linux和 Macintosh等
1.3 操作系统的运行机制跟体系结构
1.3.1 操作系统的运行机制
计算机系统中,通常CPU执行两种不同性质的程序:一种是操作系统内核程序;另一种是用户自编程序或系统外层的应用程序。对操作系统而言,这两种程序的作用不同,前者是后者的管理者,因此“管理程序”要执行一些特权指令,而“被管理程序”出于安全考虑不能执行这些指令。操作系统在具体实现上划分了用户态(目态)和内核态(管态),以严格区分两类程序,操作系统的各项功能分别被设置在不同的层次上。一些与硬件关联较紧密的模块,诸如时钟管理、中断处理、设备驱动等处于最底层。其次是运行频率较高的程序,诸如进程管理、存储器管理和设备管理等。
这两部分内容构成了操作系统的内核。这部分内容的指令操作工作在核心态。
内核是计算机上配置的底层软件,是计算机功能的延伸。不同系统对内核的定义稍有区别。大多数操作系统内核
包括四个方面的内容
1)时钟管理
在计算机的各种部件中,时钟是最关键的设备。时钟的第一功能是计时,操作系统需要通过时钟管理,向用户提
供标准的系统时间。另外,通过时钟中断的管理,可以实现进程的切换。诸如,在分时操作系统中,采用时间片
轮转调度的实现;在实时系统中,按截止时间控制运行的实现;在批处理系统中,通过时钟管理来衡量一个作
业的运行程度等。因此,系统管理的方方面无不依赖于时钟。
2)中断机制
引入中断技术的初衷是提高多道程序运行环境中CPU的利用率,而且主要是针对外部设备的。例如,键盘或鼠标信息的输入、进程的管理和调度、系统功能的调用、设备驱动、文件访问等,无不依赖于中断机制。可以说,现代操作系统是靠中断驱动的软件。
中断机制中,只有一小部分功能属于内核,负责保护和恢复中断现场的信息,转移控制权到相关的处理程序。这样可以减少中断的处理时间,提高系统的并行处理能力
3)原语
按层次结构设计的操作系统,底层必然是一些可被调用的公用小程序,它们各自完成一个规定的操作。其特点是:
1)它们处于操作系统的最底层,是最接近硬件的部分。
2)这些程序的运行具有原子性,其操作只能一气呵成(这主要是从系统的安全性和便于管理考虑的)
3)这些程序的运行时间都较短,而且调用频繁。
通常把具有这些特点的程序称为原语( Atomic Operation).定义原语的直接方法是关闭中断,让它的所有动作不可分割地进行完,再打开中断。
系统中的设备驱动、CPU切换、进程通信等功能中的部分操作都可以定义为原语,使它们成为内核的组成部分
4)系统控制的数据结构及处理
系统来登记状态信息的数据结构很多,比如作业控制块、进程控制块(PCB)、设备控制块、各类链表、消息队列、缓冲区、空闲区登记表、内存分配表等。为了实现有效的管理,系统需要一些基本的操作,常见的操作有以下三种
1)进程管理:进程状态管理、进程调度和分派、创建与撤销进程控制块等
2)存储器管理:存储器的空间分配和回收、内存信息保护程序、代码对换程序等
3)设备管理:缓冲区管理、设备分配和回收等
从上述内容可以了解,核心态指令实际上包括系统调用类指令和一些针对时钟、中断和原语的操作指令
1.3.2 中断和异常
中断( Interruption),也称外中断,指来自CPU执行指令以外的事件的发生,如设备发出的I/O结束中断,表示设备输入输出处理已经完成,希望处理机能够向设备发下一个输入输出请求,同时让完成输入输出后的程序继续运行。时钟中断,表示一个固定的时间片已到,让处理机处理计时、启动定时运行的任务等。这一类中断通常是与当前程序运行无关的事件,即它们与当前处理机运行的程序无关
异常( Exception),也称内中断、例外或陷入(Trap),指源自CPU执行指令内部的事件,如程序的非法操作码、地址越界、算术溢出、虚存系统的缺页以及专门的陷入指令等引起的事件。对异常的处理一般要依赖于当前程序的运行现场,而且异常不能被屏蔽,一但出现应立即处理。
1.3.3 系统调用
所谓系统调用就是用户在程序中调用操作系统提供的一些子功能,系统调用可以被看做特殊的公共子程序。系统中的各种共享资源都由操作系统统一掌管,因此在用户程序中,凡是与资源有关的操作(如存储分配、进行I/O传输以及管理文件等),都必须通过系统调用方式向操作系统提出服务请求,并由操作系统代为完成。通常,一个操作系统提供的系统调用命令有几十乃至上百条之多,这些系统调用按功能大致可分为如下几类
设备管理:完成设备的请求或释放,以及设备启动等功能
文件管理:完成文件的读、写、创建及删除等功能
进程控制:完成进程的创建、撤销、阻塞及唤醒等功能
进程通信:完成进程之间的消息传递或信号传递等功能
内存管理:完成内存的分配、回收以及获取作业占用内存区大小及始址等功能。显然,系统调用运行在系统的
核心态。
通过系统调用的方式来使用系统功能,可以保证系统的稳定性和安全性,防止用户随意更改或访问系统的数据或命令。系统调用命令是由操作系统提供的一个或多个子程序模块实现的。
下面列举一些由用户态转向核心态的例子:
1.3.4 操作系统的体系结构
1.4 虚拟机
2.1 进程与线程
2.1.1 进程的概念和特征
进程的概念
进程( Process)以便更好地描述和控制程序的并发执行,实现操作系统的并发性和共享性(最基本的两个特性)为了使参与并发执行的程序(含数据)能独立地运行,必须为之配置一个专门的数据结构,称为进程控制块
( Process Control Block,PCB)系统利用PCB来描述进程的基本情况和运行状态,进而控制和管理进程。相应地,由程序段、相关数据段和PCB三部分构成了进程映像(进程实体)所谓创建进程,实质上是创建进程映像中的PCB,而撤销进程,实质上是撤销进程的PCB,值得注意的是,进程映像是静态的,进程则是动态的。
从不同的角度,进程可以有不同的定义,比较典型的定义有:
1)进程是程序的一次执行过程
2)进程是一个程序及其数据在处理机上顺序执行时所发生的活动。
3)进程是具有独立功能的程序在一个数据集合上运行的过程,
进程是系统进行资源分配和调度的一个独立单位。
在引入进程实体的概念后,我们可以把传统操作系统中的进程定义为:“进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位这里的系统资源,指的是处理机、存储器和其他设备服务于某进程的“时间”,比如,把处理机资源理解为处理机的时间片才是准确的。因为进程是这些资源分配和调度的独立单位,即“时间片”分配的独立单位,这就决定了,进程一定是一个动态的、过程性的概念。
2)进程的特征
进程是由多程序的并发执行而引出的,它和程序是两个截然不同的概念。进程的基本特征是对比单个程序的顺序执行提出的,也是对进程管理提出的基本要求
1)动态性:进程是程序的一次执行,它有着创建、活动、暂停、终止等过程,具有一定的生命周期,是动态地产生、变化和消亡的。动态性是进程最基本的特征
2)并发性:指多个进程实体,共存于内存中,能在一段时间内同时运行,并发性是进程的重要特征,同时也是操作系统的重要特征。引入进程的目的就是为了使程序能与其他进程的程序并发执行,以提高资源利用率
3)独立性:指进程实体是一个能独立运行、独立获得资源和独立接受调度的基本单位。凡未建立PCB的程序都不能作为一个独立的单位参与运行。
4)异步性:由于进程的相互制约,使进程具有执行的间断性,即进程按各自独立的、不可预知的速度向前推进。异步性会导致执行结果的不可再现性,为此,在操作系统中必须配置相应的进程同步机制
5)结构性:每个进程都配置一个PCB对其进行描述。从结构上看,进程实体是由程序段数据段和进程控制段三部分组成的
2.1.2 进程的状态与转换
通常进程有以下五种状态,前三种是进程的基本状态
1)运行状态:进程正在处理机上运行。在单处理机环境下,每一时刻最多只有一个进程处于运行状态。
2)就绪状态:进程已处于准备运行的状态,即进程获得了除处理机之外的一切所需资源,一旦得到处理机即可运行
3)阻塞状态,又称等待状态:进程正在等待某一事件而暂停运行,如等待某资源为可用(不包括处理机)或等待输入输出完成。即使处理机空闲,该进程也不能运行。
4)创建状态:进程正在被创建,尚未转到就绪状态。创建进程通常需要多个步骤:首先申请一个空白的PCB,并向PCB中填写一些控制和管理进程的信息;然后由系统为该进程分配运行时所必需的资源:最后把该进程转入到就绪状态
5)结束状态:进程正从系统中消失,这可能是进程正常结束或其他原因中断退出运行。当进程需要结束运行时,系统首先必须置该进程为结束状态,然后再进一步处理资源释放和回收等工作
注意区别就绪状态和阻塞状态:就绪状态是指进程仅缺少处理机,只要获得处理机资源就立即执行;而阻塞状态是指进程需要其他资源(除了处理机)或等待某一事件。
之所以把处理机和其他资源划分开,是因为在分时系统的时间片轮转机制中,每个进程分到的时间片是若干毫秒。也就是说,进程得到处理机的时间很短且非常频繁,进程在运行过程中实际上是频繁地转换到就绪状态的:而其他资源(如外设)的使用和分配或者某一事件的发生(如I/O操作的完成)对应的时间相对来说很长,进程转换到阻塞状态的次数也相对较少。这样来看,就绪状态和阻塞状态是进程生命周期中两个完全不同的状态,很显然需要加以区分。
就绪状态→运行状态:处于就绪状态的进程被调度后,获得处理机资源(分派处理机时间片)于是进程由就绪状态转换为运行状态
运行状态→就绪状态:处于运行状态的进程在时间片用完后,不得不让出处理机,从而进程由运行状态转换为就绪状态。此外,在可剥夺的操作系统中,当有更高优先级的进程就绪时,调度程度将正执行的进程转换为就绪状态,让更高优先级的进程执行。
运行状态→阻塞状态:当进程请求某一资源(如外设)的使用和分配或等待某一事件的发生(如IO操作的完成)时,它就从运行状态转换为阻塞状态。进程以系统调用的形式请求操作系统提供服务,这是一种特殊的、由运行用户态程序调用操作系统内核过程的形式
阻塞状态→就绪状态:当进程等待的事件到来时,如I/O操作结束或中断结束时,中断处理程序必须把相应进程的状态由阻塞状态转换为就绪状态
需要注意的是,一个进程从运行状态变成阻塞状态是一个主动的行为,而从阻塞状态变到就就绪状态是一个被动的行为,需要其他相关进程的协助
2.1.3 进程控制
进程控制的主要功能是对系统中的所有进程实施有效的管理,它具有创建新进程、撤销已有进程、实现进程状态转换等功能。在操作系统中,一般把进程控制用的程序段称为原语,原语的特点是执行期间不允许中断,它是一个不可分割的基本单位。
1. 进程的创建
允许一个进程创建另一个进程。此时创建者称为父进程,被创建的进程称为子进程。子进程可以继承父进程所拥有的资源。当子进程被撤销时,应将其从父进程那里获得的资源归还给父进程。此外,在撤销父进程时,也必须同时撤销其所有的子进程,在操作系统中,终端用户登录系统、作业调度、系统提供服务、用户程序的应用请求等都会引起进程的创建。
操作系统创建一个新进程的过程如下(创建原语):
- 为新进程分配一个唯一的进程标识号,并申请一个空白的PCB(PCB是有限的)若PCB申请失败则创建失败。
- 为进程分配资源,为新进程的程序和数据,以及用户栈分配必要的内存空间(在PCB中体现).
注意:这里如果资源不足(比如内存空间),并不是创建失败,而是处于“等待状态“或称为“阻塞状态”,等待的是内存这个资源
- 初始化PCB,主要包括初始化标志信息、初始化处理机状态信息和初始化处理机控制信息,以及设置进程的优先级等
- 如果进程就绪队列能够接纳新进程,就将新进程插入到就绪队列,等待被调度运行。
2. 进程的终止
引起进程终止的事件主要有:
正常结束,表示进程的任务已经完成和准备退出运行。
异常结束,表示进程在运行时发生了某种异常事件,使程序无法继续运行,如存储区越界、非法指令、特权指令、I/O故障等。
外界干预是指进程应外界的请求而终止运行,如操作员或操作系统干预、父进程请求和父进程终止
操作系统终止进程的过程如下(撤销原语):
- 根据被终止进程的标识符,检索PCB,从中读出该进程的状态
- 若被终止进程处于执行状态,立即终止该进程的执行,将处理机资源分配给其他进程
- 若该进程还有子进程,则应将其所有子进程终止
- 将该进程所拥有的全部资源,或归还给其父进程或归还给操作系统。
- 将该PCB从所在队列(链表)中删除
3. 进程的阻塞和唤醒
正在执行的进程,由于期待的某些事件未发生,如请求系统资源失败、等待某种操作的完成数据尚未到达或无新工作可做等,则由系统自动执行阻塞原语( Block),使自己由运行状态变为阻塞状态。可见,进程的阻塞是进程自身的一种主动行为,也因此只有处于运行态的进程(获得CPU),才可能将其转为阻塞状态。
阻塞原语的执行过程如下(阻塞原语):
1)找到将要被阻塞进程的标识号对应的PCB.
2)若该进程为运行状态,则保护其现场,将其状态转为阻塞状态,停止运行。
3)把该PCB插入到相应事件的等待队列中去当被阻塞进程所期待的事件出现时,如它所启动的IO操作已完成或其所期待的数据已到达,则由有关进程(比如,提供数据的进程)调用喚醒原语( Wakeup),将等待该事件的进程唤醒
唤醒原语的执行过程如下(唤醒原语):
1)在该事件的等待队列中找到相应进程的PCB
2)将其从等待队列中移出,并置其状态为就绪状态
3)把该PCB插入就绪队列中,等待调度程序调度
需要注意的是,Block原语和 Wakeup原语是一对作用刚好相反的原语,必须成对使用。 Block原语是由被阻塞进程自我调用实现的,而 Wakeup原语则是由一个与被唤醒进程相合作或被其他相关的进程调用实现的。
4. 进程切换
对于通常的进程,其创建、撤销以及要求由系统设备完成的 IO 操作都是利用系统调用而进入内核,再由内核中相应处理程序予以完成的。进程切换同样是在内核的支持下实现的,因此可以说,任何进程都是在操作系统内核的支持下运行的,是与内核紧密相关的,进程切换是指处理机从一个进程的运行转到另一个进程上运行,这个过程中,进程的运行环境产生了实质性的变化。
进程切换的过程如下:
1)保存处理机上下文,包括程序计数器 PC 和指令寄存器 IR 和其他寄存器。
2)更新PCB信息
3)把进程的PCB移入相应的队列,如就绪、在某事件阻塞等队列。
4)选择另一个进程执行,并更新其PCB
5)更新内存管理的数据结构
6)恢复处理机上下文
注意,进程切换与处理机模式切换是不同的,模式切换时,处理机逻辑上可能还在同一进程中运行。如果进程因中断或异常进入到核心态运行,执行完后又回到用户态刚被中断的程序运行,则操作系统只需恢复进程进入内核时所保存的CPU现场,无需改变当前进程的环境信息。但若要切换进程,当前运行进程改变了,则当前进程的环境信息也需要改变。
注意:“调度”和“切换”的区别,调度是指决定资源分配给哪个进程的行为,是一种决策行为,切换是指实际分配的行为,是执行行为。一般来说,先有资源的调度,然后才有进程的切换。
2.1.4 进程的组织
进程是操作系统的资源分配和独立运行的基本单位。它一般由以下三个部分组成
1. 进程控制块PCB
进程创建时,操作系统就新建一个PCB结构,它之后就常驻内存,任一时刻可以存取,在进程结束时删除。PCB是进程实体的一部分,是进程存在的唯一标志。
当创建一个进程时,系统为该进程建立一个PCB:
当进程执行时,系统通过其PCB了解进程的现行状态信息,以便对其进行控制和管理;
当进程结束时,系统收回其PCB,该进程随之消亡。
操作系统通过PCB表来管理和控制进程,PCB主要包括进程描述信息、进程控制和管理信息、资源分配清单和处理机相关信息等。各部分的主要说明如下:
1)进程描述信息
进程标识符:标志各个进程,每个进程都有一个并且是唯一的标识号。
用户标识符:进程归属的用户,用户标识符主要为共享和保护服务
2)进程控制和管理信息
进程当前状态:描述进程的状态信息,作为处理机分配调度的依据
进程优先级:描述进程抢占处理机的优先级,优先级高的进程可以优先获得处理机。
3)资源分配清单,用于说明有关内存地址空间或虚拟地址空间的状况:所打开文件的列表和所使用的输入输出设备信息。
4)处理机相关信息,主要指处理机中各寄存器值,当进程被切换时,处理机状态信息都必须保存在相应的PCB中,以便在该进程重新执行时,能再从断点继续执行
在一个系统中,通常存在着许多进程,有的处于就绪状态,有的处于阻塞状态,而且阻塞的原因各不相同。为了方便进程的调度和管理,需要将各进程的PCB用适当的方法组织起来。
目前常用的组织方式有链接方式和索引方式两种。
链接方式将同一状态的PCB链接成一个队列,不同状态对应不同的队列,也可以把处于阻塞状态的进程的PCB,根据其阻塞原因的不同,排成多个阻塞队列。
索引方式是将同一状态的进程组织在一个索引表中,索引表的表项指向相应的PCB。不同状态对应不同的索引表,如就绪索引表和阻塞索引表等
2. 程序段
程序段就是能被进程调度程序调度到CPU执行的程序代码段。
注意,程序可以被多个进程共享,就是说多个进程可以运行同一个程序
3. 数据段
一个进程的数据段,可以是进程对应的程序加工处理的原始数据,也可以是程序执行时产生的中间或最终结果
2.1.5 进程的通信
进程通信是指进程之间的信息交换。PV操作是低级通信方式,高级通信方式是指以较高的效率传输大量数据的通信方式。高级通信方法主要有以下三个类。
2.1.5.1 共享存储
2.1.5.2 消息传递
2.1.5.3 管道通信
2.1.6 线程概念和多线程模型
2.1.6.1 线程的基本概念
引入进程的目的,是为了更好地使多道程序并发执行,以提高资源利用率和系统吞吐量,增加并发程度;而引入线程,则是为了减小程序在并发执行时所付出的时空开销,提高操作系统的并发性能线程最直接的理解就是“轻量级进程”,它是一个基本的CPU执行单元,也是程序执行流的最小单元,由线程ID、程序计数器、寄存器集合和堆栈组成。线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源但它可与同属一个进程的其他线程共享进程所拥有的全部资源。一个线程可以创建和撤销另一个线程,同一进程中的多个线程之间可以并发执行。由于线程之间的相互制约,致使线程在运行中呈现出间断性。线程也有就绪、阻塞和运行三种基本状态。引入线程后,进程的内涵发生了改变,进程只作为除CPU以外系统资源的分配单元,线程则作为处理机的分配单元。由于一个进程内部有多个线程,如果线程的切换发生在同一个进程内部,则只需要很少的时空开销
2.1.6.2 线程与进程的比较
1)调度。在传统的操作系统中,拥有资源和独立调度的基本单位都是进程。在引入线程的操作系统中,线程是独立调度的基本单位,进程是拥有资源的基本单位。在同一进程中,线程的切换不会引起进程切换。在不同进程中进行线程切换,如从一个进程内的线程切换到另一个进程中的线程时,会引起进程切换。
2)拥有资源。不论是传统操作系统还是设有线程的操作系统,进程都是拥有资源的基本单位,而线程不拥有系统资源(也有一点必不可少的资源),但线程可以访问其隶属进程的系统资源。我们要知道,如果线程也是拥有资源的单位,那么,切换线程也需要较大的时空开销,线程这个概念的提出就没有意义了。
3)并发性。在引入线程的操作系统中,不仅进程之间可以并发执行,而且一个进程中的多个线程之间也可以并发执行,从而使操作系统具有更好的并发性,提高了系统的吞吐量。
4)系统开销。由于创建或撤销进程时,系统都要为之分配或回收资源,如内存空间、IO设备等,因此操作系统所付出的开销远大于创建或撤销线程时的开销。类似地,在进行进程切换时,涉及当前执行进程CPU环境的保存及新调度到进程CPU环境的设置,而线程切换时只需保存和设置少量寄存器内容,开销很小。此外,由于同一进程内的多个线程共享进程的地址空间,因此,这些线程之间的同步与通信非常容易实现,甚至无需操作系统的干预
5)地址空间和其他资源(如打开的文件):进程的地址空间之间互相独立,同一进程的各线程间共享进程的资源,某进程内的线程对于其他进程不可见
6)通信方面:进程间通信(IPC)需要进程同步和互斥手段的辅助,以保证数据的一致性而线程间可以直接读/写进程数据段(如全局变量)来进行通信。
2.1.6.3 线程的属性
在多线程操作系统中,把线程作为独立运行(或调度)的基本单位,此时的进程,已不再是个基本的可执行实体。但进程仍具有与执行相关的状态,所谓进程处于“执行”状态,实际上是指该进程中某线程正在执行。线程的主要属性如下
- 线程是一个轻型实体,它不拥有系统资源,但每个线程都应有一个唯一的标识符和一个线程控制块,线程控制块记录了线程执行的寄存器和栈等现场状态
- 不同的线程可以执行相同的程序,即同一个服务程序被不同的用户调用时,操作系统为它们创建成不同的线程
- 同一进程中的各个线程共享该进程所拥有的资源
- 线程是处理机的独立调度单位,多个线程是可以并发执行的。在单CPU的计算机系统中各线程可交替地占用CPU;在多CPU的计算机系统中,各线程可同时占用不同的CPU,若各个CPU同时为一个进程内的各线程服务则可缩短进程的处理时间。
- 一个线程被创建后便开始了它的生命周期,直至终止,线程在生命周期内会经历阻塞态就绪态和运行态等各种状态变化为什么线程的提出有利于提高系统并发性?可以这样来理解:由于有了线程,线程切换时有可能会发生进程切换,也有可能不发生进程的切换,那么平均下来,每次切换所需要的开销就小了,因而,就能够让更多的线程参与并发,也不会影响到响应时间等问题了
2.1.6.4 线程的实现方式
线程的实现可以分为两类:用户级线程( User-Level Thread,ULT)和内核级线程( Kernel-Lev Thread,KLT)内核级线程又称为内核支持的线程。
在用户级线程中,有关线程管理的所有工作都由应用程序完成,内核意识不到线程的存在应用程序可以通过使用线程库设计成多线程程序。通常,应用程序从单线程起始,在该线程中开始运行,在其运行的任何时刻,可以通过调用线程库中的派生例程创建一个在相同进程中运行的新线程。图(a)说明了用户级线程的实现方式
在内核级线程中,线程管理的所有工作由内核完成,应用程序没有进行线程管理的代码,只有一个到内核级线程的编程接口。内核为进程及其内部的每个线程维护上下文信息,调度也是在内核基于线程架构的基础上完成。图(b)说明了内核级线程的实现方式
在一些系统中,使用组合方式的多线程实现。线程创建完全在用户空间中完成,线程的调度和同步也在应用程序中进行。一个应用程序中的多个用户级线程被映射到一些(小于或等于用户级线程的数目)内核级线程上。图(c)说明了用户级与内核级的组合实现方式
2.1.6.5 多线程模型
有些系统同时支持用户线程和内核线程,由此产生了不同的多线程模型,即实现用户级线程和内核级线程的连接方式
- 多对一模型。将多个用户级线程映射到一个内核级线程,线程管理在用户空间完成。此模式中,用户级线程对操作系统不可见(即透明).
优点:线程管理是在用户空间进行的,因而效率比较高。