目录
一、程序执行
1. 前趋图
2. 程序的顺序执行
3. 程序的并发执行
二、进程的描述
(一)、进程的概念
1. 进程的定义
2. 进程的特征
(二)、进程的状态极其转换
1. 进程的三种基本状态
(1)就绪状态
(2)运行状态
(3)等待状态
2. 进程状态的转换
(三)、进程的挂起状态
1. 挂起状态的引入
(四)、进程控制块PCB
1. 进程控制块的作用
2. 进程控制块的内容
三、进程控制
(一)操作系统内核
特权指令和非特权指令
特权指令
非特权指令
(二)、进程创建
(三)、进程撤销
(四)、进程等待(进程阻塞)
(五)、进程唤醒
四、进程同步
(一)进程同步的概念
(二)、进程同步机制应遵循的原则
(三)、进程同步机制——锁
(四)、进程同步机制——信号量
五、进程通信
(一)、共享存储器系统
(二)、消息传递系统
(三)、管道通信系统
六、处理机调度
一、进程调度算法的选取原则
二、常用的进程调度算法
三、常用的作业调度算法
四、死锁的基本概念
七、线程技术
1. 线程的概念
2. 线程与进程的比较
3. 线程的类型
一、程序执行
程序执行是指程序在计算机中的运行过程。程序的执行可以用前趋图表示,程序的执行方式有顺序执行和并发执行两种。
1. 前趋图
前趋图是一个有向无循环图。图中的每个节点可用于表示一条语句、一个程序段等;节点间的有向边表示在两个节点之间存在的前趋关系。如Pi→Pj,称Pi是Pj的前趋,而Pj是Pi的后继。在前趋图中,没有前趋的节点称为初始节点,没有后继的节点称为终止节点。应当注意的是,前趋图中不能存在循环。
在上图所示的前趋图中存在下述前趋关系: P1→P2,P1→P3,P2→P4,P3→P4,P4→P5。
2. 程序的顺序执行
(1)程序顺序执行的概念
一个较大的程序通常由若干个操作组成。程序在执行时,必须按照某种先后次序逐个执行操作,只有当前一个操作执行完后,才能执行后一个操作。
(2)程序顺序执行的特征
- 顺序性。严格按照程序所规定的顺序执行。
- 封闭性。程序在封闭的环境下执行,其执行结果不受外界因素的影响。
- 确定性。程序执行的结果与它的执行速度无关,不会影响到最终结果。
- 可再现性。只要程序执行的环境和初始条件相同,都将获得相同的结果。
3. 程序的并发执行
(1)程序并发执行的概念
在处理一批程序时,它们之间有时并不存在严格的执行次序,可以并发执行。
程序并发执行时的前趋图,如下图所示。
(2)程序并发执行的特征
- 间断性。在程序并发执行时,它们之间共享资源或相互合作,形成了相互制约的关系,表现为“执行—暂停执行—执行”的间断性活动规律。
- 失去封闭性。程序并发执行时,多个程序共享系统中的各种资源,致使程序的运行失去了封闭性。这样,一个程序在执行时,必然会受到其他程序的影响。
- 不可再现性。即使并发程序执行的环境和初始条件相同,程序多次执行或以不同的方式执行都可能获得不相同的结果。
- 资源共享性。系统中的硬件资源(CPU、内存和I/O设备等)和软件资源(系统程序和数据集等)为多个用户或作业共同使用。
- 程序和计算不再一一对应。
二、进程的描述
(一)、进程的概念
进程的组成:是由PCB、程序段、数据段组成。
PCB是给操作系统用的,而程序段和数据段是给进程自己用的,与进程自身的运行逻辑有关。
1. 进程的定义
关于进程的定义有以下一些描述:
(1)进程是程序的一次执行。
(2)进程可以定义为一个数据结构及能在其上进行操作的一个程序。
(3)进程是程序在一个数据集合上的运行过程,是系统资源分配和调度的一个独立单位。
据此,可以把“进程”定义为:一个程序在一个数据集合上的一次运行过程。所以一个程序在不同数据集合上运行,乃至一个程序在同样数据集合上的多次运行都是不同的进程。
可将进程定义为:进程是进程实体的一次运行过程,是系统进行资源分配和调度的独立单位。
当进程创建时,操作系统会给该进程分配唯一的身份证号——PID
2. 进程的特征
进程与传统的程序是截然不同的两个概念,它具有五个基本特征,从这五个特征可以看到进程与程序的巨大差异。
(1)动态性
动态性是进程的最基本特征,它表现为“进程因创建而产生,因调度而执行,因得不到资源而暂停,以及因撤销而消亡”。因此,进程具有一定的生命周期,其状态也会不断发生变化,是一个动态实体。而程序仅是一组指令的集合,并且可以一成不变地存放在某种介质上,是一个静态实体。
(2)并发性
进程的并发性是指多个进程在一段时间内同时运行,交替使用处理器的情况。并发性是进程也是操作系统的重要特征。
(3)独立性
独立性是指进程实体是一个能独立运行的基本单位,同时也是独立获得资源和独立调度的基本单位。没有创建进程的程序,是不能参加运行的。
(4)异步性
异步性是指系统中的进程按照各自独立的、不可预知的速度向前推进,即进程按照异步方式运行。正因如此,将导致执行的不可再现性。因此,在操作系统中必须采取相应的措施来保证进程之间能够协调运行。
(5)结构性
进程的结构性是指在结构上进程实体由程序段、数据段和进程控制块组成,这三部分也统称为“进程映像”。
(二)、进程的状态极其转换
系统中的诸多进程并发运行,并因竞争系统资源而相互依赖相互制约,因而进程执行时呈现了“运行—暂停—运行”的间断性。进程执行时的间断性可用进程的状态及其状态的转换来描述。
1. 进程的三种基本状态
通常,一个进程必须有就绪、运行和等待三种基本状态。
(1)就绪状态
当进程已分配到除处理器(CPU)以外的所有必要资源后,只要再获得处理器就可以立即执行,这时进程的状态称为就绪状态。
在一个系统里,可以有多个进程同时处于就绪状态,通常把这些就绪进程排成一个或多个队列,称为就绪队列。
(2)运行状态
处于就绪状态的进程一旦获得了处理器,就可以运行,进程状态也就处于运行状态。
在单处理器系统中,只能有一个进程处于运行状态。在多处理器系统中,可能有多个进程处于运行状态。
(3)等待状态
正在运行的进程因为发生某些事件(如请求输入/输出、申请额外空间等)而暂停运行,这种受阻暂停的状态称为等待状态。
通常将处于等待状态的进程排成一个队列,称为等待队列。在有些系统中也会按照等待原因的不同将处于等待状态的进程排成多个队列。
2. 进程状态的转换
(三)、进程的挂起状态
1. 挂起状态的引入
在很多系统中,进程只有上述三种基本状态。但在另一些系统中,由于某种需要又增加了一些新的进程状态,其中最重要最常见的是挂起状态。
引入挂起状态主要是基于下列需求:
(1)用户的需求;
(2)父进程的需求;
(3)操作系统的需求;
(4)对换的需求;
引入挂起状态后的进程状态转换过程如下图所示。
(四)、进程控制块PCB
1. 进程控制块的作用
进程控制块PCB(Process Control Block)是进程实体的重要组成部分,是操作系统中最重要的记录型数据。在进程控制块中记录了操作系统所需要的、用于描述进程情况及控制进程运行所需要的全部信息。换句话说,在进程的整个生命周期中,操作系统都要通过进程的PCB来对并发运行的进程进行管理和控制。
由此看来,进程控制块是系统对进程控制采用的数据结构。系统是根据进程的PCB而感知进程存在的。所以,进程控制块是进程存在的唯一标志。 PCB可以被多个系统模块读取和修改,如调度模块、资源分配模块、中断处理模块、监督和分析模块等。因为PCB经常被系统访问,因此常驻主存。系统把所有的PCB组织成若干个链表(或队列),存放在操作系统中专门开辟的PCB区内。
2. 进程控制块的内容
(1)进程标志信息
进程标识符用于标识一个进程,通常有外部标识符和内部标识符两种。
① 外部标识符:
由进程创建者命名,通常是由字母、数字所组成的一个字符串,在用户(进程)访问该进程时使用。外部标识符都便于记忆,如计算进程、打印进程、发送进程、接收进程等。
② 内部标识符
为方便系统使用而设置的。操作系统为每一个进程赋予唯一的一个整数,把它作为内部标识符。内部标识符通常就是一个进程的序号。
(2)说明信息(进程调度信息)
说明信息是与进程调度有关的状态信息,它包括:
- 进程状态。它指明进程当前的状态,作为进程调度和对换时的依据。
- 优先权高的进程将优先获得处理器。
- 进程调度所需的其他信息。其内容与所采用的进程调度算法有关,如进 程等待时间、进程已运行时间等。
- 等待事件是指进程由运行状态转变为等待状态时所等待发生的事件,即等待原因。
(3)现场信息(处理器状态信息)
现场信息是用于保留进程存放在处理器中的各种信息,主要由处理器中的各个寄存器的内容组成。尤其是当进程暂停运行时,这些寄存器内的信息将被保存在PCB里,当该进程重新运行时,能从上次停止的地方继续运行。
- 通用寄存器。其中的内容可以被用户程序访问,用于暂存信息。
- 指令计数器。用于存放要访问的下一条指令的地址。
- 程序状态字。用于保存当前处理器的状态信息,如运行方式、中断屏蔽标志等。
- 用户栈指针。每个用户进程都有一个或若干个与之相关的关系栈,用于存放过程和系统调用参数及调用地址,栈指针指向堆栈的栈顶。
(4)管理信息(进程控制信息)
管理信息包括进程资源、控制机制等一些进程运行所需要的信息。
- 程序和数据的地址。它是指该进程的程序和数据所在的主存和外存地址,以便该进程再次运行时,能够找到程序和数据。
- 进程同步和通信机制。它是指实现进程同步和进程通信时所采用的机制,如消息队列指针、信号量等。
- 资源清单。该清单中存放有除CPU以外,进程所需的全部资源和已经分配到的资源。
- 链接指针。它将指向该进程所在队列的下一个进程的PCB的首地址。
(5)进程控制块的组织方式
(1)链接方式
把具有相同状态的PCB用链接指针链接成队列,如就绪队列、等待队列和空闲队列等。就绪队列中的PCB将按照相应的进程调度算法进行排序。而等待队列也可以根据等待原因的不同,将处于等待状态的进程的PCB排成等待I/O队列、等待主存队列等多个队列。
(2)索引方式
系统根据各个进程的状态建立不同的索引表,如就绪索引表、等待索引表等,并把各个索引表在主存的首地址记录在主存中的专用单元里,也可以称为表指针。在每个索引表的表目中,记录着具有相同状态的各个PCB在表中的地址。
(6)进程控制原语
原语是指具有特定功能的不被中断的过程。它主要用于实现操作系统的一些专门控制操作。用于进程控制的原语有:
- (1)创建原语 用于为一个进程分配工作区和建立PCB,置该进程为就绪状态。
- (2)撤销原语 用于一个进程工作结束后,收回它的工作区和PCB。
- (3)等待原语 用于进程在运行过程中发生等待事件时,把进程的状态改为等待状态。
- (4)唤醒原语 用于当进程等待的事件结束时,把进程的状态改为就绪状态。
三、进程控制
(一)操作系统内核
核心态:又称管态、系统态,是操作系统管理程序执行时计算机所处的状态。这种状态具有较高的特权,能执行一切指令,访问所有的寄存器和存储器。
用户态:又称目态,是用户执行程序时计算机所处的状态。这种状态具有较低的特权,只有执行规定的指令,访问指定的寄存器和存储器。
用户态和内核态是操作系统中的两种不同的运行级别。用户态是指应用程序运行时所处的状态,而内核态是指操作系统运行时所处的状态。在用户态下,应用程序可以访问自己的内存空间和一些受限制的系统资源,但不能直接访问硬件设备和操作系统的核心功能。而在内核态下,操作系统可以访问所有的系统资源和硬件设备,并且可以执行所有的核心功能。
用户态和内核态之间的切换是通过系统调用、异常和外围设备中断来实现的。当应用程序需要访问受限制的系统资源或执行核心功能时,它会发起一个系统调用,这时操作系统会将应用程序的状态切换到内核态,执行相应的操作,然后将状态切换回用户态,继续执行应用程序。
用户态和内核态之间的切换是有开销的,因为需要保存和恢复现场、复制参数和代码等操作。这也是为什么说用户态和内核态切换的开销大的原因。
特权指令和非特权指令
在计算机体系结构中,存在两种主要类型的指令:特权指令和非特权指令。它们在处理器的执行权限方面有所区别。
特权指令
特权指令:系统态下运行的指令(相当于系统指令),对内存的访问不受限制,可以访问用户空间和系统空间,不允许应用程序使用。
特权指令是那些需要较高执行权限的指令,通常由操作系统或内核执行。这些指令涉及到对系统资源的管理和控制,如内存管理、I/O 操作、中断处理等。只有在特殊的特权级别下才能执行这些指令,一般用户程序无法直接执行它们。这有助于确保系统的安全性和稳定性。
常见的特权指令包括:
1. 操作系统调用指令
2. 修改页表的指令
3. 中断和异常处理指令
4. I/O 操作相关指令
5. 修改控制寄存器的指令
非特权指令
非特权指令:在用户态运行的指令,应用程序所使用的所有指令,访问内存受限,只允许访问用户空间,不能对系统中的软件和硬件直接访问。
非特权指令是那些可以由普通用户程序直接执行的指令。它们通常涉及到一般的计算、数据传输和逻辑运算等基本操作。非特权指令执行时不会对系统的关键资源产生直接影响,因此可以由用户程序自由使用。
常见的非特权指令包括:
1. 数据移动指令(如MOV)
2. 算术运算指令(如ADD、SUB)
3. 逻辑运算指令(如AND、OR)
4. 条件分支指令(如JUMP)
5. 栈操作指令(如PUSH、POP)
通过将特权指令和非特权指令分开,计算机体系结构可以实现更好的安全性和系统稳定性,确保只有授权的代码可以执行对系统关键资源的敏感操作。
(二)、进程创建
在系统中,只有进程才能得到运行。因此,程序要想运行,就必须为之创建进程。进程运行结束,还必须撤销它。
(1)用户登录:在分时系统中,用户键入登录命令后,如果是合法用户,系统将为该终端用户建立一个进程,并把它放入就绪队列。
(2)作业调度:在批处理系统中,当作业调度程序调度某个作业时,便将该作业装入主存,为其分配必要的资源,并为之创建进程,放入就绪队列。
(3)提供服务:当运行中的用户进程提出某种请求后,系统将专门创建一个进程来提供用户所需要的服务。
(4)应用请求:基于应用进程自己的需要,由它自己创建一个新进程,这个新进程也称为该进程的子进程。
进程创建的处理过程
一旦操作系统发现了要求创建进程的事件后,便调用进程创建原语,按照下列步骤创建一个新进程:
① 为新进程分配唯一的进程标识符,并从PCB队列中申请一个空闲的PCB。
② 为新进程的程序和数据,以及用户栈分配相应的主存空间及其他必要的资源。
③ 初始化PCB中的相应信息,如标识信息、处理器信息、进程控制信息等。
④ 如果就绪队列可以接纳新进程,便将新进程加入到就绪队列中。
(三)、进程撤销
(1)进程正常结束 这是指程序运行到最后一条指令后。如在C语言程序的函数调用中,执行函数调用的最后一条指令return后,结束该函数。
(2)进程异常错误 在进程运行期间,由于出现某些错误和故障而使进程被迫中止。例如越界错误、超时故障、非法指令错、运行超时、等待超时、算术运算错、I/O故障等。
(3)进程应外界的请求而终止运行 例如,操作员或操作系统要求父进程干预或父进程结束等。
进程撤销的处理过程, 一旦操作系统发现了要求终止进程的事件后,便调用进程终止原语,按照下列步骤终止指定的进程:
① 根据被终止进程的标识符,从PCB集合中检索该进程的PCB,读出进程状态。
② 若该进程处于运行状态,则立即终止该进程的运行。
③ 若该进程有子孙进程,还要将其子孙进程终止。
④ 将该进程所占用的资源回收,归还给父进程或操作系统。
⑤ 将被终止进程的PCB从所在队列中移出,撤销该进程的PCB,并将其加入到空闲的PCB队列中。
(四)、进程等待(进程阻塞)
(1)请求系统服务 正在运行的进程请求系统提供服务时,例如申请打印机打印,但申请服务资源被另外的进程占有,该进程只能处于等待状态。
(2)启动某种操作 正在运行的进程启动某种操作后,其后续命令必须在该操作完成后才能运行,所以要先等待该进程。
(3)新数据尚未到达 对于相互合作的进程,如果一个进程需要先获得另一个进程提供的数据后才能运行,则只有等待所需要的数据到达。
(4)无新工作可做 系统往往设置一些具有特定功能的系统进程,每当这种进程完成任务后,便把自己阻塞起来等待新任务的到来。
进程等待的处理过程, 一旦操作系统发现了要求等待进程的事件后,便调用进程等待原语,按照下列步骤阻塞指定的进程:
① 立即停止执行该进程。
② 修改进程控制块中的相关信息。把进程控制块中的运行状态由“运行”状态改为“等待”状态,并填入等待的原因,以及进程的各种状态信息。
③ 把进程控制块插入到等待队列。根据等待队列的组织方式,把等待进程的进程控制块插入等待队列中。
④ 转调度程序重新调度,运行就绪队列中的其他进程。
(五)、进程唤醒
(1)请求系统服务得到满足 因请求服务得不到满足的等待队列中的进程,得到相应的服务要求时,处于等待队列中的进程就被唤醒。
(2)启动某种操作完成 处于等待某种操作完成的等待队列中的进程,其等待的操作已经完成,可以执行其后续命令,则必须把它唤醒。
(3)新数据已经到达 对于相互合作的进程,如果一个进程需要另一个进程提供的数据已经到达,则把因此而处于等待的进程唤醒。
(4)有新工作可做 系统中的具有特定功能的系统进程,接收到新的任务时,就必须唤醒它。
进程唤醒的过程 , 一旦操作系统发现了要求唤醒进程的事件后,便调用进程唤醒原语,按照下列步骤唤醒指定的进程。
① 从等待队列中找到该进程。
② 修改该进程控制块中的相关内容,把等待状态改为就绪状态,删除等待原语等。
③ 把进程控制块插入到就绪队列中。按照就绪队列的组织方式,把被唤醒的进程的进程控制块插入到就绪队列中。
四、进程同步
对于相关进程间的同步和互斥,必须进行有效的控制。这种控制涉及几个基本概念,即临界资源、临界区、进程同步和进程互斥。
(一)进程同步的概念
1. 临界资源
在系统中有许多硬件或软件资源,如打印机、公共变量等,这些资源在一段时间内只允许一个进程访问或使用,这种资源称为临界资源。
2. 临界区
作为临界资源,不论是硬件临界资源,还是软件临界资源,多个并发进程都必须互斥地访问或使用,这时把每个进程中访问临界资源的那段代码称为临界区。而这些并发进程中涉及临界资源访问的那些程序段称为相关临界区。
在临界区之前增加一段用于检查的代码,这段代码称为进入区。相应地,在临界区后面也要加入一段代码,称为退出区,用于将临界资源的被访问标志恢复为未被访问标志。
3. 进程同步
进程同步是指多个相关进程在执行次序上的协调,这些进程相互合作,在一些关键点上需要相互等待或相互通信。通过临界区可以协调进程间相互合作的关系,这就是进程同步。
4. 进程互斥
进程互斥是指当一个进程进入临界区使用临界资源时,另一个进程必须等待。当占用临界资源的进程退出临界区后,另一个进程才被允许使用临界资源。通过临界区协调进程间资源共享的关系,就是进程互斥。进程互斥是同步的一种特例。
(二)、进程同步机制应遵循的原则
为了实现进程的同步与互斥,可以利用软件方法,也可以在系统中设置专门的同步机制来协调各个进程。但是,所有的同步机制都必须遵循以下四条原则。
1. 空闲让进:当无进程处于临界区时,临界资源处于空闲状态,可以允许一个请求进入临界区的进程进入自己的临界区,有效地使用临界资源。
2. 忙则等待:已有进程进入自己的临界区时,意味着临界资源正被访问,因而其他试图进入临界区的进程必须等待,以保证进程互斥地使用临界资源。
3. 有限等待: 对要求访问临界资源的进程,应保证该进程在有效的时间内进入自己的临界区,以免陷入“死等”状态。
4. 让权等待:当进程不能进入自己的临界区时,应立即释放处理器,以免陷入“忙等”。
(三)、进程同步机制——锁
1. 锁的概念
在同步机制中,常用一个变量来代表临界资源的状态,称它为锁。通常用“0”表示资源可用,相当于锁打开。用“1”表示资源已被占用,相当于锁闭合。
互斥锁:最简单的一种线程同步方法,会阻塞线程;
自旋锁:避免切换的一种线程同步方法,属于“忙等待” ;
读写锁:为“读多写少”的资源设计的线程同步方法,可以显著提高性能;
条件变量:相对复杂的一种线程同步方法,有更灵活的使用方法。
(四)、进程同步机制——信号量
1. 信号量的概念
信号量是一种特殊变量,它用来表示系统中资源的使用情况。 整型信号量就是一个整型变量。当其值大于“0”时,表示系统中对应可用资源的数目;当其值小于“0”时,其绝对值表示因该类资源而被等待的进程的数目;当其值等于“0”时,表示系统中对应资源已经用完,并且没有因该类资源而被等待的进程。
2. 对信号量的操作
对于整型信号量,仅能通过两个标准的原语操作来访问,这两个操作被称为P操作、V操作,也合称为PV操作。其中P操作在进入临界区前执行,V操作在退出临界区后执行。
利用信号量实现进程同步的方法,使用PV操作的规则
(1)分清哪些是互斥问题(互斥访问临界资源的),哪些是同步问题(具有前后执行顺序要求的)。
(2)对于互斥问题要设置互斥信号量,互斥信号量的个数只与临界资源的种类有关。通常有几类临界资源就设置几个互斥信号量,且初值为1,代表临界资源可用。
(3)对于同步问题要设置同步信号量,通常同步信号量的个数与参与同步的进程种类有关,即同步关系涉及几类进程,就有几个同步信号量。
(4)在每个进程中用于实现互斥的PV操作必须成对出现;用于实现同步的PV操作也必须成对出现,但是它们分别出现在不同的进程中;在某个进程中如果同时存在互斥与同步的P操作,则其顺序不能颠倒,必须先执行对同步信号量的P操作,再执行对互斥信号量的P操作,但是V操作的顺序没有严格要求。
五、进程通信
进程通信是指进程之间的信息交换,其所交换的信息量少则几个字节,多则成千上万个字节,
(一)、共享存储器系统
在共享存储器系统中,相互通信的进程共享某些数据结构或存储区,进程之间能够通过它们进行通信。共享存储器系统又可以分为共享数据结构和共享存储区两种方式。
1. 共享数据结构方式
在这种通信方式下,相互通信的进程共用某些数据结构,并通过这些数据结构交换信息。这种方式与信号量机制相比,并没有发生太大的变化,比较低效、复杂,只适用于传送少量的数据。
2. 共享存储区方式
这种通信方式是在存储器中划出一块共享存储区,相互通信的进程可以通过对共享存储区中的数据进行读或写来实现通信。这种方式效率高,可以传送较多的数据。
(二)、消息传递系统
在消息传递系统中,进程间的数据交换是以消息为单位进行的。用户直接利用系统中提供的一组通信命令(原语)进行通信,大大提高了工作效率,又简化了程序编制的复杂性。因此,消息传递系统成为最常用的高级通信方式。
1. 直接通信方式
发送进程使用发送原语直接将消息发送给接收进程,并将它挂在接收进程的消息缓冲队列上。接收进程使用接收原语从消息缓冲队列中取出消息。
通常,系统提供两条通信原语:
(1)发送原语:Send(Receiver,message);
(2)接收原语:Receive(Sender,message);
2. 间接通信方式
发送进程与接收进程通过中间实体——信箱来完成通信,既可以实现实时通信,又可以实现非实时通信。
(1)信箱通信的操作
① 信箱的创建与撤销 进程可以利用信箱创建原语来建立一个新信箱。创建进程应给出信箱的名字、信箱属性等。当信箱所属进程不再需要该信箱时,可用信箱撤销原语来撤销信箱。
② 消息的发送与接收 相互通信的进程利用系统提供的下述通信原语来实现消息的发送与接收。 Send(mailbox,message):将一个消息发送到指定信箱。 Receive(mailbox,message):从指定信箱中接收一个消息。
信箱可以由操作系统创建,也可以由用户创建。创建者是信箱的拥有者,据此,可以把信箱分为以下三类:
① 私有信箱 用户进程可以为自己建立一个新信箱,并作为进程的一部分。信箱的拥有者有权从信箱中读取消息,其他用户只能将自己的消息发送到该信箱中。
② 公用信箱 它由操作系统创建,并提供给系统中所有核准的用户进程使用。核准的进程既可以把消息发送到该信箱,又可以从信箱中取出发送给自己的消息。
③ 共享信箱 它实际上是某种进程创建的私有信箱。在创建时或创建后,又指明它是可以共享的,同时指出共享进程(用户)的名字,此时就成为共享信箱。
(3)通信进程间的关系
① 一对一关系 在一个发送进程和一个接收进程之间建立一条专用的通信通道,使它们之间的通信不受其他进程的影响。
② 多对一关系 允许提供服务的一个接收进程与多个用户发送进程之间进行通信,也称为客户机/服务器方式。
③ 一对多关系 允许一个发送进程与多个接收进程进行通信,使发送进程可以用广播形式向一组或全部接收者发送消息。
④ 多对多关系 允许建立一个公用信箱,让多个进程既可以把消息发送到该信箱,又可以从信箱中取出发送给自己的消息。
(三)、管道通信系统
所谓管道是指连接读进程和写进程的,用于实现它们之间通信的共享文件。向管道提供输入的发送进程(写进程)以字符流的形式将大量数据送入管道,而接受管道输出的接收进程(读进程)可以从管道中接收数据。由于发送进程和接收进程是利用管道进行通信的,故称为管道通信方式。这种方式首创于UNIX系统,因为它能传送大量的数据,又非常有效,所以又被引入到许多操作系统中。
六、处理机调度
一、进程调度算法的选取原则
1. 面向用户的原则
(1)周转时间短
(2)响应时间快
(3)截止时间有保证
(4)优先权原则
2. 面向系统的原则
(1)系统吞吐量高
(2)处理器利用率高
(3)各类资源的平衡利用
二、常用的进程调度算法
衡量调度算法优劣的标准是比较不同算法下的周转时间(或带权周转时间)和平均周转时间(或平均带权周转时间)。平均周转时间短或平均带权周转时间短的就是好算法。
1.先来先服务调度算法(FCFS)
先来先服务调度算法是一种最简单的调度算法,系统开销最少。 当系统采用这种调度算法时,系统从就绪队列中选择一个最先进入就绪队列的进程,把处理器分配给该进程,使之得到执行。进程一旦占有了处理器,就一直运行下去,直到完成或因发生某种事件而等待,才退出处理器。
先来先服务调度算法的裁决模式是非抢占式的,优先权函数=花费在系统中的实际时间,仲裁规则是随机的。这种调度算法有利于长进程,而不利于短进程
2.短进程优先调度算法(SPF)
短进程优先调度算法是从就绪队列中选择一个运行时间最短的进程,将处理器分配给该进程,使之占有处理器并运行。直到该进程完成或因发生某种事件而等待,才退出处理器。
短进程优先调度算法的裁决模式是非抢占式的,优先权函数=-运行时间,仲裁规则是按照时间先后顺序或随机方式。这种调度算法照顾到了系统中的短进程,有效地降低了进程的平均等待时间,提高了系统的吞吐量。但是,这种算法对长进程不利。
虽然短进程优先调度算法对短进程很好,但是也存在不容忽视的缺点:
- 该算法对长进程非常不利。
- 该算法和先来先服务调度算法一样,不能保证紧急进程得到及时的处理。
- 进程调度的依据是用户提供的估计运行时间,致使该算法不一定能真正做到短进程优先调度。
3.最短剩余时间优先调度算法(SRT)
最短剩余时间优先调度算法是短进程优先调度算法的抢占式的动态版本。它将CPU分配给需要最少时间来完成的进程。
最短剩余时间优先调度算法的裁决模式是抢占式的,优先权函数是动态的,随着进程运行和完成时间的减少而增加,仲裁规则是按照时间先后顺序或随机方式。这种调度算法充分照顾到了剩余运行时间短的进程。
4.时间片轮转调度算法(RR)
在该算法中,系统将所有的就绪进程按照进入就绪队列的先后次序排列。每次调度时把CPU分配给队首进程,让其运行一个时间片。当时间片用完,由计时器发出时钟中断,调度程序暂停该进程的运行,使其退出处理器,并将它送到就绪队列的末尾,等待下一轮调度运行。然后,把CPU分配给就绪队列中新的队首进程,同时也让它运行一个时间片。这样就可以保证就绪队列中的所有进程在一定的时间(可以接受的等待时间)内均能获得一个时间片的运行时间。
时间片轮转调度算法的裁决模式是面向时间片的,所有就绪进程的优先权函数值相同,仲裁规则是轮转规则。这种调度算法适用于交互进程的调度。
在时间片轮转调度算法中,时间片的大小对系统的性能有很大影响。因此,时间片的大小要适当,通常要考虑到以下几个因素:
① 系统对响应时间的要求 作为分时系统首先必须满足系统对响应时间的要求。响应时间与进程数目和时间片成正比。
② 就绪队列中进程的数目 在分时系统中,就绪队列上的进程数目是随着在终端上机的用户数目而改变的。时间片的大小应反比于分时系统所配置的终端数目。
③ 系统的处理能力 系统的处理能力是必须保证用户键入的常用命令能在一个时间片内处理完毕,否则将无法取得满意的响应时间。
5.优先权调度算法
为了使紧迫型进程获得优先处理,引入了优先权调度算法,也称为外部优先权调度算法。它是从就绪队列中选择一个优先权最高的进程,让其获得处理器并运行。
优先权调度算法的裁决模式是抢占式的或非抢占式的,优先权函数是用户或系统赋给它的优先权,仲裁规则是随机的或先进先出的。
对于优先权调度算法,其关键在于是采用静态优先权,还是动态优先权,以及如何确定进程的优先权。
6.响应比高者优先调度算法(HRRN)
响应比高者优先调度算法是一个比较折中的算法,它是从就绪队列中选择一个响应比最高的进程,让其获得处理器并运行,直到该进程完成或因等待某种事件而退出处理器为止。
响应比=响应时间/要求服务时间=等待时间/要求服务时间
响应比高者优先调度算法的裁决模式是非抢占式的,优先权函数=响应比,仲裁规则是随机或按照先后次序。这种调度算法既照顾了短进程,又考虑了进程到达的先后次序,也不会使长进程长时间得不到服务。因此,它是一个考虑比较全面的算法。但是每次进行调度时,它都需要对各个进程计算响应比,所以系统开销很大,比较复杂。
三、常用的作业调度算法
① 先来先服务调度算法 按作业到达系统的先后次序进行的调度。该算法优先考虑在系统中等待时间最长的作业。这种算法容易实现,但效率比较低,而且没有考虑到紧迫作业和短作业。
② 短作业优先调度算法 从作业的后备队列中挑选运行时间最短的作业作为下一个调度运行对象。这种算法容易实现,且效率较高,但未考虑长作业的利益。
③ 响应比高者优先调度算法 为了更有效地提高系统的利用率,可以采用响应比高者优先调度算法。响应比高者优先调度算法既照顾到了短作业和长作业,又照顾到等待时间长的作业,但对要求运行紧迫的作业,没有充分考虑到。
④ 优先权调度算法 优先权调度算法是根据作业确定的优先权来选取作业,每次总是选取优先权最高的作业。在优先权调度算法中,为了照顾紧迫作业的运行,可能使某些系统资源闲置,系统资源的利用率没有充分地发挥。
⑤ 分类调度算法 分类调度算法是根据系统运行情况和作业属性将作业分类,作业调度时轮流从这些不同的作业类中挑选作业。分类调度算法虽然可以均衡使用各类资源,但是需要为不同类型的作业设置队列,增加了系统开销。
(1)先来先服务算法。作业的执行情况如下表所示:
作业 |
提交时间 |
运行时间 |
开始时间 |
完成时间 |
周转时间 |
带权周转时间 |
J1 |
8:00 |
1.0 |
8:00 |
9:00 |
1.0 |
1.0 |
J2 |
8:50 |
0.50 |
9:00 |
9:30 |
0.67 |
1.34 |
J3 |
9:00 |
0.20 |
9:30 |
9:42 |
0.7 |
3.5 |
J4 |
9:10 |
0.10 |
9:42 |
9:48 |
0.63 |
6.3 |
作业的执行顺序为:J1,J2,J3,J4。 平均周转时间=(1.0+0.67+0.7+0.63)/4=0.75小时 平均带权周转时间=(1.0+1.34+3.5+6.3)/4=3.035小时
(2)短作业优先算法。作业的执行情况如下表所示:
作业 |
提交时间 |
运行时间 |
开始时间 |
完成时间 |
周转时间 |
带权周转时间 |
J1 |
8:00 |
1.0 |
8:00 |
9:00 |
1.0 |
1.0 |
J2 |
8:50 |
0.50 |
9:18 |
9:48 |
0.97 |
1.94 |
J3 |
9:00 |
0.20 |
9:00 |
9:12 |
0.2 |
1.0 |
J4 |
9:10 |
0.10 |
9:12 |
9:18 |
0.13 |
1.3 |
作业的执行顺序为:J1,J3,J4,J2。 平均周转时间=(1.0+0.97+0.2+0.13)/4 = 0.575小时 平均带权周转时间=(1.0+1.94+1.0+1.3)/4 = 1.31小时
(3)响应比高者优先算法。作业的执行情况如下表所示:
作业 |
提交时间 |
运行时间 |
开始时间 |
完成时间 |
周转时间 |
带权周转时间 |
J1 |
8:00 |
1.0 |
8:00 |
9:00 |
1.0 |
1.0 |
J2 |
8:50 |
0.50 |
9:18 |
9:48 |
0.97 |
1.94 |
J3 |
9:00 |
0.20 |
9:00 |
9:12 |
0.2 |
1.0 |
J4 |
9:10 |
0.10 |
9:12 |
9:18 |
0.13 |
1.3 |
作业的执行顺序为:J1,J2,J4,J3。 平均周转时间=(1.0+0.67+0.8+0.43)/4=0.725小时 平均带权周转时间=(1.0+1.34+4+4.3)/4=2.66小时
四、死锁的基本概念
1. 死锁的概念
死锁是指多个进程因竞争资源而造成的一种僵局现象,若无外力的作用,这些进程都不能继续运行。
2. 死锁的原因
(1)竞争资源 当系统中供多个进程共享的资源不足以同时满足它们的需求时,引起它们对资源的竞争而产生死锁。
(2)进程推进顺序非法 进程在运行过程中如果请求和释放资源的顺序不当,也可能会导致进程死锁。
3. 产生死锁的必要条件
死锁并不一定都会出现,如果一旦产生死锁,一定会满足下述四个必要条件。
(1)互斥条件:进程对分配到的资源进行排他性、独占性使用,即在一段时间内某资源只能由一个进程占用
(2)请求和保持条件:进程已经拥有并保持了至少一个资源,但是,又请求新的资源,而新请求的资源又被其他进程占有,此时请求进程被等待,但对已获得的资源保持不放。
(3)不可剥夺条件:进程所占有的资源在结束之前不能被剥夺,只能在运行结束后由自己释放。
(4)环路等待条件:在发生死锁时,必然存在一个“进程—资源”的环形链。
4. 处理死锁的基本方法
死锁并不一定都会出现,如果一旦产生死锁,一定会满足下述四个必要条件。
(1)预防死锁 预防死锁是在进行资源分配之前,通过设置某些资源分配的限制条件,来破坏产生死锁的四个必要条件的一个或几个。
(2)避免死锁 避免死锁是在资源分配前不设置限制条件,在进行资源分配的过程中,用某种方法对每次资源分配进行管理,以避免某次分配使系统进入不安全状态,以至产生死锁。
(3)检测和解除死锁 该方法首先是通过系统的检测过程及时地检查系统是否出现死锁,并确定与死锁有关的进程和资源,然后通过撤销或挂起一些死锁中的进程回收相应的资源,进行资源的再次分配,从而将进程死锁状态解除。
七、线程技术
1. 线程的概念
线程是进程中的一个实体,是被系统独立调度和运行的基本单位。线程自己基本上不拥有系统资源,只拥有少量在运行中必不可少的资源(如程序计数器、一组寄存器和栈),但是它可以与同属于一个进程的其他线程共享进程所拥有的全部资源。一个线程可以创建和撤销另一个线程,同一进程中的多个线程之间可以并发运行。线程之间也会相互制约,使其在运行中呈现异步性。因此,线程同样具有就绪、运行、等待三种基本状态。
2. 线程与进程的比较
3. 线程的类型
(1)系统级线程
系统级线程是依赖于系统控制的,即无论是用户进程中的线程,还是系统进程中的线程,它们的创建、撤销与切换都是由系统控制实现的。在系统中保留了一张线程控制块,系统根据该线程控制块来感知线程的存在,并对线程进行控制。
(2)用户级线程
用户级线程是由用户控制的,对于用户级线程的创建、撤销与切换,都与系统控制无关,完全由用户自己管理。简单来说就是系统并不知道有用户级线程的存在,在系统中各种控制仍然是基于进程的。 文章来源:https://www.toymoban.com/news/detail-815412.html
文章来源地址https://www.toymoban.com/news/detail-815412.html
到了这里,关于操作系统(第二章-进程管理)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!