目录
进程的定义
基本概念
进程实体与进程
PCB的组成
进程的组织
链接方式
索引方式
进程的特征
进程的状态
进程的三种基本状态
进程的另外两种状态
进程状态的转换
进程控制
何谓进程控制
如何实现进程控制
原语
进程通信
共享存储
共享存储的分类
管道通信
消息传递
消息传递的方式
直接通信方式
间接通信方式
线程
何谓线程
引入线程后的变化
线程属性
线程的实现方式
用户级线程
内核级线程
重要:
多线程模型
多对一模型
一对一模型
多对多模型
处理机调度
处理机调度的基本概念
高级调度
中级调度
低级调度
三种调度的联系和对比
编辑
挂起状态与七状态模型
进程调度
进程调度的时机
进程调度与切换的情况
不能进行进程调度的情况
临界区与临界资源
进程调度的方式
进程的切换
进程切换的过程
调度算法的评价指标
CPU利用率
系统吞吐量
周转时间
等待时间
响应时间
调度算法
先来先服务算法(first come first serve)
短作业优先(shortest job first)
高响应比优先算法(Highest Response Ratio Next)
时间片轮转(Round-Robin)
优先级调度算法
多级反馈队列算法
算法总结
进程同步与互斥
概念
对临界资源的互斥访问逻辑上可以分为如下四部分
为了实现对临界资源访问,同时保证整体性能,须遵循以下原则
进程互斥的软件实现方法
单标志法
双标志检验法
双标志后检查法
peterson算法
进程互斥的硬件实现方法
中断屏蔽方法
TestAndSet指令
Swap指令
注意:
进程实体:由PCB、程序段、数据段这三部分构成,其也称进程映像,一般来说我们可以把进程实体简称为进程。所谓的创建进程,实质上是创建进程实体中的PCB;而撤销进程,实质上就是撤销进程实体中的PCB
进程:其是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位(正在运行的程序)
注意:
前言:在一个系统中,通常有数10、数百、乃至数千个PCB。为了能够对他们加以有效的管理,应该用适当的方式把这些PCB组织起来。
理解:按照进程状态将PCB分为多个队列,操作系统持有指向各个队列的指针
理解:根据进程状态不同建立几张索引表;操作系统持有指向各个索引表的指针
注意:动态性是进程最基本的特征。
前言:进程是程序的一次执行。在这个执行过程中,有时进程正在被CPU处理,有时又需要等待CPU服务,可见,进程的状态会有各种变化。为了方便对各个进程的管理,操作系统需要将进程划分为几种状态
注意:
含义:进程控制的主要功能是对系统中的所有进程实施有效的管理,它具有创建新进程、撤销已有进程、实现进程状态转换等功能
简单理解:实现进程状态之间的转换
过程:
注意:进程状态的切换中间需要做的内容是比较复杂的,我们需要修改PCB内容并把PCB放到相应的队列;假如某一个进程把他的PCB从一个队列放到了另一个队列,但是我们并没有把PCB中相应的标志位修改,那么这种情况很危险,极有可能导致系统错误;为了防止这个问题的发生,于是就使用了原语来实现进程的控制。
前言:原语的特点是执行期间不允许间断,只能一气呵成,这种不可以被中断的操作被称为原子操作
注意:
原语要做的事
前言:
含义:进程通信就是指进程之间的信息交换
注意:仅管一个进程不能直接访问另一个进程的地址空间,但是进程之间的信息交换又是必须实现的。为了保证进程间的安全通信,操作系统提供了进程通信一些方法(共享存储、消息传递、管道通信)
含义:由于两个进程他们不能直接访问对方的地址空间,所以操作系统会为两个进程分配一个共享空间;两个进程之间的通信就可以通过共享空间来完成
注意:
注意:
前言:进程间的数据交换以格式化消息为单位。进程通过操作系统提供的“发送消息/接收消息”两个原语进行数据交换
注意:一个格式化的消息会分为消息头和消息体两个部分
理解:每一个进程会有一个消息缓冲队列,若有另外一个进程想给该进程发送消息的时候,那么另外一个进程会先创建好格式化的消息体,然后这个消息会通过发送原语发送给该消息;然后这个消息就会挂到该进程消息缓冲队列的队尾,然后该进程会通过接收原语依次把队列中的这些消息一个个的取走进行处理
理解:系统会为各个通信的进程管理一个信箱,这个信箱中可能会有各种各样的消息;并且这个消息可能是不同进程之间通信的一些消息;具体是由那个进程发,那个进程收这些都会包含在消息头里;若一个进程想给另一个进程发送消息,这个消息会用发送原语发送到中间实体信箱当中,之后读进程会用接收原语从信箱当中取走消息。
前言:有的进程需要同时处理很多事情的,而传统的进程只能串行的执行一系列程序。为此,引入了线程来增加并发度
线程:线程是程序执行流的最小单位,它包含在进程之中,是进程的实际运作单位
注意:
注意:
注意:
前言:在同时支持用户级线程和内核级线程的系统中,由几个用户级线程映射到几个内核级线程的问题引出了多线程模型的问题
含义:多个用户级线程映射到一个内核级线程。每个用户级进程只对应一个内核级线程
优缺点
含义:一个用户级线程映射到一个内核级线程。每个用户进程有与用户级线程同数量的内核级线程
优缺点
含义:n个用户级线程映射到m个内核级线程(n>=m)每个用户进程对应m个内核级线程
优点:克服了多对一模型的并发度不高的缺点,又克服了一对一模型中一个用户进程占用太多内核级线程,开销太大的缺点
调度:当有一堆任务要处理,但由于资源有限,有些事情没法同时处理。这就需要确定某种规则来决定处理这些任务的顺序,这就是“调度”研究的问题
处理机调度:在多道程序系统中,进程的数量往往是多于处理机个数的,这样不可能同时并行的处理各个进程。处理机调度就是从就绪队列中按照一定的算法选择一个进程并将处理机分配给它运行,以实现进程的并发执行
前言:由于内存空间有限,有时无法将用户提交的作业全部放入内存,因此就需要确定某种规则来决定将作业调入内存的顺序
高级调度(作业调度):指按照一定的原则从外存上处于后背队列的作业中挑选一个(或多个)作业,给他们分配内存等必要资源,并建立相应的进程(建立PCB),以使他们获得竞争处理机的权利
注意:高级调度是辅存(外存)与内存之间的调度。每个作业只调入一次,只调出一次。作业调入时会建立相应的PCB,作业调出时会撤销PCB。高级调度主要是指调入的问题,因为只有调入的时机需要操作系统来确定,但调出的时机必然是作业运行结束才调出
前言:引入虚拟存储技术之后,可以将暂时不能运行的进程调至外存等待。等他重新具备了运行条件且内存又稍有空闲的时候,再重新调入内存;这么做的目的是为了提高内存利用率和系统吞吐量
中级调度(内存调度):就是要决定将那个处于挂起状态的进程重新调入内存
注意:
低级调度(进程调度):其主要任务是按照某种方法和策略从就绪队列中选取一个进程,将处理机资源分配给他
注意:
前言:暂时调到外存等待的进程状态为挂起状态,挂起状态又可以分为就绪挂起、阻塞挂起两种状态
就绪挂起:一个处于就绪状态的进程若此时这个系统的负载比较高,内存空间已经不够用了;那么他就有可能会把一个处于就绪态的进程暂时调到外存当中,此时该进程就进入了一个就绪挂起的状态;一直到内存空间空闲,或者该进程需要继续执行,那么这个进程将会被激活,把他相应的数据又会挪回内存,这样一个就绪挂起的进程又回到了就绪态
阻塞挂起:一个处于阻塞状态的进程也可以被阻塞,也可以重新的被调入内存,重新被激活回到阻塞态
注意:
进程调度(作业调度):就是按照某种算法从就绪队列中选择一个进程为其分配处理机
含义:一个进程让出处理机,由另一个进程占用处理及的过程
注意:进程切换是有代价的,因此过于频繁的进行进程的调度、切换,必然会使整个系统的效率降低,使系统大部分时间都花在进程切换上,而真正用于执行进程的时间减少。
含义:是指CPU忙碌时间占总时间的比例
公式:CPU利用率=CPU忙碌时间/总时间
前言:对于计算机来说,希望能用尽可能少的时间处理完尽可能多的作业
系统吞吐量:单位时间内完成作业的数量
公式:系统吞吐量=总共完成作业的数量/总共花了多少时间
前言:对于计算机来说,它很关心自己的作业从提交到完成花了多少时间
周转时间:是指从作业被提交给系统开始,到作业完成为止的这段时间间隔
公式:
- 周转时间=作业的完成时间-作业提交时间
- 平均周转时间=各作业周转时间之和/作业数
- 带权周转时间=作业周转时间/作业实际运行的时间
- 平均带权周转时间=各作业带权周转时间之和/作业数
注意:
含义:指进程/作业处于等待处理机状态的时间之和,等待时间越长,用户满意度越低
注意:
含义:指用户从提出请求到首次产生响应所用的时间
最短剩余时间优先算法:每当有进程加入到就绪队列改变时就需要调度,若新到达的进程剩余时间比当前运行的进程剩余时间更短,则由新进程抢占处理机,当前运行进程重新回到就绪队列。
注意:短作业优先调度算法为每次调度时选择当前已到达且运行时间最短的作业/进程
时间片轮转算法:轮流让就绪队列中的进程依次执行一个时间片(每次选择的都是排在就绪队列队头的进程)
注意:若时间片太大,使得每个进程都可以在一个时间片内完成,则时间片轮转算法就会退化为先来先服务算法,并且会增大进程响应时间,因此时间片不能太大;另一方面,进程调度、切换是有时间代价的(保存、恢复运行环境)因此若时间片太小,会导致进程切换过于频繁,系统会花大量时间来处理进程切换,从而导致实际用于进程执行的时间比例减少。可见时间片也不能太小
抢占式优先级调度算法:每次调度时选择当前已经到达且优先级最高的进程。当前进程主动放弃处理机时发生调度。另外,当就绪队列发生变化时也需要检查是否会发生抢占
注意:
过程:
同步:同步亦称直接制约关系,他是指为了完成某种任务而建立的两个或多个进程,这些进程因为需要在某些位置上协调他们的工作次序而产生的制约关系;进程间的直接制约关系就是源于他们之间的相互合作
进程互斥:对于临界资源的访问,必须互斥的进行。互斥,亦称间接制约关系。进程互斥指当一个进程访问某临界资源时,另一个要访问该临界资源的进程必须等待。当前访问临界资源的进程访问结束,释放资源之后,另一个进程才能去访问临界资源
算法思想:两个进程在访问临界区后会把使用临界区的权限转交给另一个进程。也就是说每个进程进入临界区的权限只能被另一个进程赋予(两个进程交替使用临界区)
理解:由上可知,turn=0表示开始只允许P0进程进入临界区,若P1进入则会导致一直while循环检查,直到P1的时间片用完后切换P0上场;P0进入临界区后访问完毕后才可以让P1上场(turn=1),如此循环往复;
问题:刚开始访问临界区的是P0,若P0进程一直不访问临界区的话,那么turn的值一直不变,P1就一直无法访问临界区;临界区空闲,不满足空闲让进
算法思想:设置一个标志位flag[],数组中各元素用来标记各进程想进入临界区的意愿,比如“flag[0]=true”意味着0号进程p0现在想要进入临界区。每个进程在进入临界区之前先检验当前有没有别的进程想要进入临界区,若没有,则把自身对应的标志flag[i]设为true,之后开始访问临界区
理解:若P0想进入临界区,他先检查P1是否想进,P1不想进则它将自己的意愿改为想进后进入临界区;此时P1又想进了,那么检查P0是否想进,因为P0想进P1便一直循环检查,直到P0出临界区后将自己的意愿改为不想进后才可以进入临界区,如此循环往复
问题:若P0和P1一起检查对方想没想进入临界区(1526),那么发现对方都没想进;最终P0和P1会一起进入临界区(两个标志位都为true);违背忙则等待
算法思想:双标志先检查法的改版。前一个算法是先检查后上锁,但这两个操作又是无法一气呵成,因此导致了两个进程同时进入临界区的问题。因此,人们又想到先上锁,后检查的方法来避免上述问题
理解:P0想进入临界区,那么他先将自己的意愿改为想去,再检查P1是否想进,看见P1不想进,那么自己进,此时P1想进,那么先将自己的意愿改为想进后看见P0也想进,就会一直循环直到P0放锁,如此循环往复
问题:P0和P1均想进临界区(flag[0]=flag[1]=true)之后都开始检查,发现对方都想进临界区,但是谁也进不去只能干着急,违反空闲让进、有限等待
算法思想:双标志后检查法中,两个进程都争着想进入临界区,但是谁也不让谁,最后谁都无法进入临界区。peterson想到了一种方法,若双方都争着想进入临界区,那么可以让进程尝试孔融让梨,主动让对方先进入临界区
理解:P0想进临界区,但是他让P1进,然后他检查P1是否想进,看见P1不想进,那么自己就进去了;此时P1想进,但是他让P0进后看到P0想进,那么就会一直循环等待,直到P0进去完了修改自己的意愿改为不想进
分析并发:P0和P1都想进临界区,那么P0表示他让P1进入临界区;此时P0循环直到时间片用完后P1执行到7该执行8后发现P0也想进,同时自己也让P0进去了,然后就开始循环直到时间片用完,此时运行到P0了,由于P1谦让了(turn的值变为0);那么P0进程在进行while检查时发现P1让自己进,然后就进临界区了
含义:利用“开/关中断指令”实现(与原语的实现思想相同,即在某进程开始访问临界区到结束访问为止都不允许被中断,也就不能发生进程切换,因此也不可能发生两个同时访问临界区的情况)
优缺点
含义:简称TS指令,有的地方也称TestAndSetLock指令或TLS指令
注意:TSL指令是用硬件指令实现的,执行的过程不允许被中断,只能一气呵成
理解:线程进入临界区前while循环检查是否被上锁,若上锁则一直循环等待,直到另一个进程放了锁
优缺点
前言:swap指令使用硬件实现的,执行过程中不允许被中断,只能一气呵成
注意:swap指令和TestAndSet指令类似(lock为false就是没锁,lock为true就是有锁,访问时lock=true,old=false——因为已经交换了,下一个进程想访问临界区看到old=lock=true就没法进去,除非上一个进程放锁)