进程管理(二[1])
Posted 生命是有光的
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了进程管理(二[1])相关的知识,希望对你有一定的参考价值。
操作系统OS第二章进程管理
1、进程
程序:是静态的,就是个存放在磁盘里的可执行文件(QQ.exe
),就是一系列的指令集合。
进程:是动态的,是程序的一次执行过程。
同一个程序多次执行会对应多个进程,例如下图中我们同一个程序QQ多次执行,每次都会对应不同的进程。
思考:操作系统是怎么区分这三个进程呢?
1.1、进程的组成
1.1.1、PCB
当进程被创建时,操作系统会为该进程分配一个 唯一的、不重复的身份证号:PID(Process ID)
,进程ID
- 操作系统要记录PID、进程所属用户ID(UID)[基本的进程描述信息,可以让操作系统区分各个进程]
- 还要记录给进程分配了哪些资源(如:分配了多少内存、正在使用哪些I/O设备、正在使用哪些文件)[可用于实现操作系统对资源的管理]
- 还要记录进程的运行情况(如:CPU使用时间、磁盘使用情况、网络流量使用情况等)[可用于实现操作系统对进程的控制、调度]
这些信息都被保存在一个数据结构PCB(Oricess Control Block)中,即进程控制块,操作系统需要对各个并发运行的进程进行管理,但凡管理时所需要的信息,都会被放在PCB中。
1.1.2、程序段、数据段
进程的组成有三部分:PCB、程序段、数据段
- PCB是给操作系统用的
- 程序段、数据段是给进程自己用的
如上图,我们通常写的代码最终会被编译为可执行文件(.exe
),当我们运行此程序前会将程序放入内存中,这时操作系统会为这个程序创建对应的PCB,除此之外程序的指令序列也会被存入内存中,这一系列的指令我们称为程序段,CPU会从内存中取出这些指令来执行,在CPU执行的过程中,代码中定义的数据也会被存放在内存中,我们称为数据段。
一个进程实体(进程映像)由PCB、程序段、数据段组成。进程是动态的,**进程实体(进程映像)是静态的。**我们可以把进程实体理解为进程在动态执行过程当中某一时刻的快照,也就是进程实体能够反映进程在某一时刻的状态。
1.2、进程的特征
程序是静态的,进程是动态的,相比于程序,进程拥有以下特征:
- 动态性:进程是程序的一次执行过程,是动态地产生、变化和消亡的。
- 并发性:内存中有多个进程实体,各进程可并发执行。
- 独立性:进程是能独立运行、独立获得资源、独立接收调度的基本单位
- 异步性:各进程是按各自独立的、不可预知的速度向前推进,操作系统要提供"进程同步机制"来解决异步问题。
- 结构性:每个进程都会配置一个PCB。从结构上看,进程由程序段、数据段、PCB组成
- 动态性是进程最基本的特征
- 异步性会导致并发程序执行结果的不确定性
1.3、小结
2、进程的状态
2.1、创建态、就绪态
如下图,当我们在运行.exe
文件时,进程正在被创建,状态是 创建态。当进程创建完成后,就进入了 就绪态。但是由于CPU可能很忙,所以就绪态的进程不能立即运行。所以处于就绪态的进程可能有很多个。
2.2、运行态
- 当CPU空闲时,操作系统就会选择一个就绪进程,让它上处理机运行。如果一个进程此时在CPU上运行,那么这个进程处于"运行态"
- 当进程1在CPU运行时,CPU会执行该进程对应的指令序列,如果某一时刻进程的指令序列发出系统调用,请求使用打印机资源,但是这个时候打印机正在为别的进程服务,那么这个进程1此时无法继续向下执行,操作系统便会让这个进程1下CPU,并让它进入 阻塞态
2.3、阻塞态
-
在进程1运行过程中,可能会请求等待某个事件的的发生(如等待某种系统资源的分配,或者等待其他进程的响应)
-
在这个事件发生之前,进程1无法继续往下执行,此时操作系统会让这个进程1下CPU,并让它进入"阻塞态"
-
当CPU空闲时,又会选择另一个"就绪态"进程2上CPU运行
-
如果某一时刻打印机空闲了,这说明进程1等待的资源有了,这个时候操作系统会将进程1从阻塞态变为就绪态
2.4、终止态
- 进程2可以执行 exit 系统调用,请求操作系统终止进程2。此时进程2会进入"终止态",操作系统会让进程2下CPU,并回收内存空间等资源,最后还要回收进程2的PCB,当终止进程的工作完成之后,这个进程2就彻底消失了。
2.5、进程状态的转换(进程五状态模型)
- 进程运行之前需要被创建,在创建的过程中系统会完成一系列相应的工作,包括新建PCB、给进程分配一系列资源等,如果一个进程正在被创建的话,那么这个进程当前处于 创建态
- 当进程被创建完成就有了上CPU的条件,这个时候进程就处于 就绪态,也就是说处于就绪态的进程只差处理机这种资源,其他资源全部具备
- 处于就绪态的进程被操作系统调度这个进程就可以上处理机运行,当它在处理机上运行的时候它就处于 运行态,也就是说正在处理机上运行的进程既有其他全部资源也有了处理机这种资源
- 有时正在运行的进程可能会等待某种事件的发生,在这个事件发生之前这个进程是没有办法继续向下执行,所以这个进程此时会被剥夺处理机资源以及其他全部资源,这个时候进程就处于 阻塞态
- 若进程等待的事件发生了,那么这个进程就可以从 阻塞态 回到 就绪态
- 处于 运行态的进程可以主动请求运行结束,或者运行过程中遇到不可修复的错误时,会从 运行态转变为 终止态
- 运行态->阻塞态 是一种进程自身做出的主动行为
- 阻塞态->就绪态 不是进程自身能控制的,是一种被动行为。
注意:有的时候进程可以直接从运行态转换为 就绪态,比如说操作系统给进程分配的时间片用完了、或者处理机被更重要的进程抢占了的时候。
注意:不能由阻塞态直接转换为运行态,也不能由就绪态直接转换为阻塞态(因为进入阻塞态是进程主动请求的,必然需要进程在运行时才能发出这种请求)
-
单CPU情况下,同一时刻只能会有一个进程处于运行态,多核CPU情况下,可能有多个进程处于运行态。
-
阻塞态又称等待态、创建态又称新建态,终止态又称结束态
-
进程PCB中,会有一个变量state来表示进程的当前状态。如:1表示创建态、2表示就绪态、3表示运行态等等,为了对同一个状态下的各个进程进行统一的管理,操作系统会将各个进程的PCB组织起来,如何组织呢?
2.6、进程的组织
进程的组织方式分为链接方式和索引方式:
2.6.1、链接方式
链接方式是指操作系统会管理一系列的队列,每个队列都会指向相应状态的PCB,例如下图中阻塞队列指针指向当前处于阻塞态的进程,就绪队列指针指向当前处于就绪态的进程,并且通常会把优先级更高的进程放在队头。很多操作系统还会根据阻塞原因不同再分为多个阻塞队列,例如等待打印机的阻塞队列、等待磁盘的打印队列等等。
2.6.2、索引方式
索引方式:操作系统会给各种状态的进程建立索引表,每个索引表的表项又会指向相应状态的PCB。
2.6.2、小结
2.7、小结
3、进程控制
进程控制的主要功能是对系统中的所有进程实施有效的管理,它具有创建新进程、撤销已有进程、实现进程状态转换等功能。简单理解:反正进程控制就是要实现进程状态转换
3.1、如何实现进程控制
实现进程控制是用原语实现的,原语是一种特殊的程序,它的执行具有原子性,也就是说,这段程序的运行必须是一气呵成,不能中断。
思考:为什么进程控制(状态转换)的过程要"一气呵成"?
如果不能一气呵成,就有可能导致操作系统中的某些关键数据结构信息不统一的情况,这会影响操作系统进行别的管理工作。例如阻塞队列里面有进程1在等待事件的发生,当进程1等待的事件发生后,操作系统要做这样两件事:
- 将进程1的state状态设置为1(就绪态状态对应的数字)
- 将进程1的PCB从阻塞队列放到就绪队列
如果操作系统完成第一步后收到中断信号,那么state=1的进程却被放在了阻塞队列里,这就导致了状态和队列信息对不上,造成信息不统一,系统就出错了。
如上图,此时CPU处于内核态,在执行一条一条的指令,每执行完一次指令都会检查是否有中断信号需要处理,例如执行指令2结束后发现有 关中断指令,那么CPU会暂停当前的程序,转而执行中断处理程序。
- CPU执行了 关中断指令之后,就不再例行检查中断信号,直到执行 开中断指令之后才会恢复检查
- 这样,关中断、开中断之间的指令序列就是不可被中断的,这样就实现了原子性
关中断指令和开中断指令这两个是特权指令,如果是非特权指令,那么用户就想用就用,直接霸占CPU🤡
3.2、进程控制相关的原语
3.2.1、进程创建的原语
3.2.2、进程终止的原语
3.2.3、进程的阻塞和唤醒原语
3.2.4、进程的切换原语
进程的运行环境其实就是进程在执行过程中产生的中间结果,例如数据段,也就是进程在执行过程中产生的中间结果,在进程切换时在PCB中保存这些东西。这样当它再次投入运行时,可以通过PCB恢复它的运行环境。
3.4、小结
学习技巧:进程控制会导致进程状态的转换。无论哪个进程控制原语,要做的无非三类事情:
-
更新PCB中的信息
a. 所有的进程控制原语一定都会修改进程状态标志
b. 剥夺当前运行进程的CPU使用权必然需要保存其运行环境
c. 某进程开始运行前必然要恢复期运行环境
-
将PCB插入合适的队列
-
分配/回收资源
4、进程通信IPC
进程通信(Inter-Process Communication)就是指进程之间的信息交换。
进程是分配系统资源的单位(包括内存地址空间),因此各进程拥有的内存地址空间相互独立。为了保证安全,一个进程不能直接访问另一个进程的地址空间(有些进程请求你手机地址、照片什么的,那不就没隐私了)。但是进程之间的信息交换又是必须实现的,为了保证进程间的安全通信,操作系统提供了一些方法。包括共享存储、管道通信、消息传递
4.1、共享存储
共享存储:虽然进程之间不能直接访问另一个进程的地址空间,但是可以在内存中创建一片共享存储区,这样所有进程都可以对这个共享存储区的内容进行读写操作。
- 两个进程对共享空间的访问必须是互斥的(互斥访问通过操作系统提供的P、V工具实现),当进程1在向共享空间写数据时,进程2是不允许访问共享空间的。
- 操作系统只负责共享空间和同步互斥工具,至于如何互斥、互斥方式是由通信进程自己负责的。
共享存储分为基于数据结构的共享和基于存储区的共享。
- 基于数据结构的共享:比如共享空间里只能放一个长度为10的数组。这种共享方式速度慢,限制多,是一种低级通信方式
- 基于存储区的共享:在内存中画出一块共享存储区,数据的形式、存放位置都由进程控制,而不是操作系统。相比之下,这种共享方式速度更快,是一种高级通信方式。
4.2、管道通信
管道通信:写数据从一边写,读数据从另一边读。数据的传输只能是单向的,要么从左向右,要么从右到左。
- 管道只能采用
半双工通信
,某一时间段内只能实现单向的传输。如果要实现双向同时通信
,则需要设置两个管道
。 - 各进程要
互斥
地访问管道(由操作系统实现) - 当
管道写满
时,写进程
将阻塞
,直到读进程将管道中的数据取走,即可唤醒写进程 - 当
管道读空
时,读进程
将阻塞
,直到写进程往管道中写入数据,即可唤醒读进程 - 数据一旦被读出,就彻底消息,因此当多个进程读同一个管到时,可能会错乱。对此,通常有两种解决方案
- 一个管道允许多个写进程,一个读进程(标准答案,考研以这种方式为准!)
- **一个管道允许多个写进程,多个读进程,但是系统会让各个读进程轮流从管道中读数据(**Linux方案)
- 管道通信和共享存储是有区别的,共享存储随便存随便取,但是管道通信是先进先出的,先写进的数据先被读出。只有把前面的数据读了,才能读后面的数据
- 写进程往管道写数据,即使管道没被写满,只要管道没空,读进程就可以从管道读数据
- 读进程从管道读数据,即使管道没被读空,只要管道没满,写进程就可以往管道写数据
4.3、消息传递
进程间的数据交换以格式化的消息
(Message)为单位。进程通过操作系统提供的"发送消息/接收消息"两个原语
进行数据交换。
格式化的消息由两个部分组成:
- 消息头:消息头包括发送进程ID、接收进程ID、消息长度等格式化的信息
- 消息体
消息传递分为直接通信方式和间接通信方式:
- 直接通信方式:消息发送进程要指明接收进程的ID
- 间接通信方式:通过信箱间接的通信,因此也称"信箱通信方式"。
4.3.1、直接通信方式
进程P给进程Q发送消息,进程P使用发送原语指明发送消息msg给Q,msg会被直接挂在进程Q的消息队列中,当进程Q运行时,会使用接收原语指明接收进程P发送的消息msg,操作系统会检查进程Q的消息队列,找到msg,就会从内核区将msg复制到进程Q的地址空间。
直接通信方式就是点名道姓的进行消息传递
4.3.2、间接通信方式
如上图,进程P向操作系统申请了两个信箱空间,进程P使用发送原语向信箱A发送信息,进程Q使用接收原语从A信箱收到消息,这样操作系统就会将信息复制到进程Q的地址空间。
多个进程可以向同一个信箱里面发送消息,也可以多个进程从同一个信箱中接收消息。
间接通信方式:以信箱作为中间实体进行消息传递
4.4、小结
5、多线程模型
5.1、什么是线程
有的进程可能需要同时做很多事,而传统的进程只能串行地执行一系列程序。为此,引入了线程来增加并发度。**传统的进程是程序执行流的最小单位,引入线程后,线程成为了程序执行流的最小单位。**简单理解:QQ是一个进程,QQ发送文件、视频聊天这就是两个线程
-
可以把线程理解为轻量级进程,线程是一个基本的CPU执行单元,也是程序执行流的最小单位。
-
引入线程之后,不仅是进程之间可以并发,进程内的各线程之间也可以并发,从而进一步提升了系统的并发度,使得一个进程内也可以并发处理各种任务(如QQ视频、文字聊天、传文件),引入线程后,进程只作为除CPU之外的系统资源的分配单元(如打印机、内存地址空间等都是分配给进程的,而不是分配给线程),线程则作为处理机的分配单元。
5.2、引入线程的变化
- 进程是资源分配的基本单位,线程是调度的基本单位
5.3、线程的属性
- 线程是处理机调度的基本单位,而资源分配是分配给进程的,所以说线程几乎不拥有系统资源。同一个进程的不同进程之间是可以共享进程的资源,即同一个进程的线程共享内存地址空间,所以同一个进程间的通信不需要系统的干预
- 同一个进程中的线程切换,不会引起进程切换。不同进程中的线程切换,会引起进程切换,切换同进程内的线程,系统的开销很小,而切换进程,系统开销较大
6、线程的实现方式
6.1、用户级线程
早期的操作系统(如:早期Unix)只支持进程,不支持线程。当时的"线程"是由线程库实现的。也就是说在操作系统的视角下看到的依然只有进程,而程序员可以创建线程库来使得多个逻辑上的线程并发的运行。
-
用户级线程由应用程序通过线程库实现,所有的
线程管理工作
都由应用程序负责
(包括线程切换),并不需要操作系统管理干预。 -
用户级线程中,
线程切换
可以在用户态
下即可完成,无需操作系统干预,CPU并不需要变态。 -
在用户看来,是有多个线程,但是在操作系统内核看来,并意识不到线程的存在。“用户级线程"就是"从用户视角能看到的线程”。
-
优缺点:
-
优点:用户级线程的切换在用户空间即可完成,不需要切换到核心态,线程管理的系统开销小,效率高
-
缺点:
- 当一个用户及线程被阻塞后,整个进程都会被阻塞,并发度不高。
- 多个进程不可在多核处理机上并行运行。因为在这种情况下,只是引入了逻辑上的线程,进程依然是系统调度的基本单位,因此即便我们的电脑是多核处理机,我们的进程还是只能被分配一个核心,所以多个进程不能在多核处理机上并行运行。
-
6.2、内核级线程
内核级线程:又称内核支持的线程,由操作系统支持的线程。
-
内核级线程的管理工作
由操作系统内核
完成。 -
线程调度、切换等工作都由内核负责,因此
内核级线程的切换
必然需要在核心态
下才能完成。 -
操作系统会为每个内核级线程建立相应的TCB(Thread Control Block,线程控制块),通过TCB对线程进行管理。“
内核级线程
"就是"从操作系统内核视角能看到的线程
” -
优缺点
优点:当一个线程被阻塞后,别的线程还可以继续执行,并发能力强。多线程可在多核处理机上并行执行。
缺点::一个用户进程可能会占用多个内核级线程,线程切换由操作系统内核完成,需要切换到核心态,因此线程管理的成本高,开销大。
6.3、多线程模型
在支持内核级线程的系统中,根据用户级线程和内核级线程的映射关系,可以划分为几种多线程模型。
6.3.1、一对一模型
- 一对一模型:一个用户级线程映射到一个内核级线程。每个用户进程有与用户级线程同数量的内核级线程。
- 优点:当一个线程被阻塞后,别的线程还可以继续执行,并发能力强。多线程可在多核处理机上并行执行。
- 缺点:一个用户进程会占用多个内核级线程,线程切换由操作系统内核完成,需要切换到核心态,因此线程管理的成本高,开销大。
6.3.2、多对一模型
- 多对一模型:多个用户级线程映射到一个内核级线程。且一个进程只被分配一个内核级线程。
- 优点:用户级线程的切换在用户空间即可完成,不需要切换到核心态,线程管理的系统开销小,效率高
- 缺点:当一个用户级线程被阻塞后,整个进程都会被阻塞,并发度不高。多个线程不可在多核处理机上并行运行
重点:操作系统只"看得见"内核级线程,因此只有
内核级线程才是处理机分配的单位
,所以多个线程不可以在多核处理机上并行运行
6.3.3、多对多模型
-
多对多模型:n个用户级线程映射到m个内核级线程(n>=m)。每个用户级进程对应m个内核级进程
-
优点:克服了多对一模型并发度不高的缺点(一个阻塞全体阻塞),又克服了一对一模型中一个用户进程占用太多内核级线程,开销太大的缺点。
-
我们可以将用户级线程看成是代码逻辑的载体,例如上图中3个用户级线程分别对应视频聊天、文字聊天、文件传输的代码运行,将内核级线程看成是运行机会的载体,只有获得了运行机会代码逻辑才能被执行,因为操作系统在分配CPU资源的时候,是以内核级线程为单位进行分配的,所以虽然有3个用户级线程,但是最多只会被分配两个CPU核心。
-
内核级线程中可以运行任意个用户级线程,例如某一时刻视频聊天所需资源较多,那么可以让一个内核级线程专门运行视频聊天,而另一个内核级线程运行文字聊天、文件传输。只有当两个内核级线程中正在运行的代码逻辑都阻塞时,这个进程才会被阻塞。
6.4、小结
7、进程调度
7.1、调度的基本概念
当有一堆任务要处理,但由于资源有限,这些事情没法同时处理。这就需要确定某种规则来决定处理这些任务的顺序,这就是"调度"研究的问题。
7.2、调度的三个层次
7.2.1、高级调度
高级调度(作业调度):启动程序时会将程序从外存放入内存,但是内存空间是有限的,有时无法将用户提交的作业全部放入内存,这个时候操作系统就可以进行高级调度:按一定的原则从外存的作业后备队列中挑选一个作业调入内存,并创建进程。每个作业只调入一次,调出一次。作业调入时会创建PCB,调出时才撤销PCB。
简化理解:好几个程序需要启动,到底先启动哪个。作业可以理解为一个具体的任务,用户向系统提交一个作业相当于用户让操作系统启动一个程序(来处理一个具体的任务)
7.2.2、低级调度
低级调度(进程调度/处理机调度):按照某种策略从就绪队列中选取一个进程,将处理机分配给它。进程调度是操作系统中最基本的一种调度,在一般的操作系统中都必须配置进程调度。进程调度的频率高,一般几十毫秒一次。只有这种高频率的保证才能使得各个进程轮流上CPU很快速的运行,这样才可以让用户在宏观上看好像各个进程是同时执行的一样。
7.2.3、中级调度
内存不够时,可将某些进程的数据从内存调出外存。等内存空闲或者进程需要运行时再重新调入内存。暂时调到外存等待的进程状态为挂起状态
。被挂起的进程PCB会被组织成挂起队列
中级调度(内存调度):按照某种策略决定将哪个处于挂起状态
的进程重新调入内存。一个进程可能会被多次调出、调入内存,因此中级调度发生的频率要比高级调度更高。我们生活中手机进行app之间的切换时,如果出现卡顿现象,其实就是在发生中级调度。
7.3、七状态模型
暂时调到外存等待的进程状态为"挂起状态(挂起态)",挂起态又可以进一步细分为就绪挂起、阻塞挂起两种状态。五状态一般408考,七状态一般自主命题考。
- 处于就绪态的进程在内存不够时也会可能会被暂时调到外存当中,这个进程就进入了一个就绪挂起的状态,一直到内存空间空闲或者这个进程必须执行时,这个进程就会被激活重新回到就绪态。处于 阻塞态的进程也可以被挂起,称为 阻塞挂起。处于阻塞挂起的进程,当它等待的事件发生的时候,这个 进程会直接进入到就绪挂起的状态,当再次被激活是直接回到就绪态,而不是阻塞态
- 有时候进程运行结束的时候,可能也会直接进入就绪挂起的状态
- 有时候创建态的进程由于内存不够而不能进入就绪态,也会直接进入就绪挂起的状态
挂起和阻塞的区别:
- 两种状态都是暂时不能获得CPU的服务,但挂起态是将进程映像调到外存去了,而阻塞态下进程映像还在内存中。
- 有的操作系统会把就绪挂起、阻塞挂起分为两个挂起队列,甚至会根据阻塞原因再把阻塞挂起进程进一步细分为多个队列。
7.4、三层调度的联系
要做什么 | 调度发生在 | 发生频率 | 对进程状态的影响 | |
---|---|---|---|---|
高级调度 (作业调度) | 按照某种规则,从后备队列中选择合适的作业将其调入内存,并为其创建进程 | 外存->内存 (面向作业) | 最低 | 无->创建态->就绪态 |
中级调度 (内存调度) | 按照某种规则,从挂起队列中选择合适的进程将其数据调回内存 | 外存->内存 (面向进程) | 中等 | 挂起态->就绪态(阻塞挂起->阻塞态) |
低级调度 (进程调度) | 按照某种规则,从就绪队列中选择一个进程为其分配处理机 | 内存->CPU | 最高 | 就绪态->运行态 |
7.5、小结
7.6、进程调度的时机
进程调度(低级调度):就是按照某种算法从就绪队列中选择一个进程为其分配处理机。
需要进行进程调度与切换的情况如下图:
- 当前运行的进程主动放弃处理机,例如进程中止、进程运行过程中发生异常而终止、进程主动请求阻塞(当等待某些资源时)
- 当前运行的进程被动放弃处理机,例如分给进程的时间片用完了、有更紧急的进程需要上处理机、有优先级更高的进程进入就绪队列
不能进行进程调度与切换的情况如下图:
-
在处理机中断的过程中不能进行进程调度与切换。
-
进程在 操作系统内核程序临界区中不能进行进程调度与切换。
-
在原子操作过程中不能进行进程调度与切换。
-
进程在
操作系统内核程序临界区
中不能
进行调度与切换。 (√) -
进程处于
临界区
时不能
进行处理机调度。(×)
-
临界资源:一个时间段内只允许一个进程使用的资源,各进程需要
互斥地
访问临界资源。 -
临界区:访问临界资源的那段代码。因此各个进程也只能
互斥地
进入临界区,互斥地执行访问临界资源的代码 -
内核程序临界区
一般是用来访问某种内核数据结构
的,比如进程的就绪队列(由各就绪进程的PCB组成)- 当一个进程处于内核程序临界区,并且这个临界区是要访问就绪队列的话,在访问之前它会将就绪队列上锁,如果这个进程还没有退出 内核程序临界区 的话,也就是就绪队列还没有被解锁就进行进程调度,进程调度的相关程序也需要访问就绪队列,但此时就绪队列被锁住了,因此又无法顺利进行进程调度
- 所以对于内核程序临界区访问的临界资源如果不尽快释放的话(也就是被锁住),极有可能影响到操作系统内核的其他管理工作。因此在访问内核程序临界区间不能进行调度与切换。
- 假如这个进程访问的是普通的临界资源,比如说是打印机资源,在访问之前会将打印机上锁,在打印机打印完成之前,临界资源不会解锁,但打印机又是慢速设备,此时如果一直不允许进程调度的话就会导致CPU一直空闲。(进程一直等待打印机,同时又霸占了CPU,但是进程又没法向下执行)
- 所以对于普通临界区访问的临界资源不会直接影响操作系统内核的管理工作。因此在访问普通临界区时可以进行调度与切换。
- 当一个进程处于内核程序临界区,并且这个临界区是要访问就绪队列的话,在访问之前它会将就绪队列上锁,如果这个进程还没有退出 内核程序临界区 的话,也就是就绪队列还没有被解锁就进行进程调度,进程调度的相关程序也需要访问就绪队列,但此时就绪队列被锁住了,因此又无法顺利进行进程调度
有的系统中,只允许进程主动放弃处理机,有的系统中,进程可以主动放弃处理机,当有更紧急的任务需要处理时,也会强行剥夺处理机(被动放弃),这样就引出了两种进程调度的方式:
- 非剥夺调度方式
- 剥夺调度方式
7.7、进程调度的方式
非剥夺调度方式
,又称非抢占方式
。即,只允许进程主动放弃处理机。在运行过程中即便有更紧迫的任务到达,当前进程依然会继续使用处理机,直到该进程终止或主动要求进入阻塞态。- 实现简单,系统开销小但是无法及时处理紧急任务,适合于早期的批处理系统
剥夺调度方式
,又称抢占方式
。当一个进程正在处理机上执行时,如果有一个更重要或更紧迫的进程需要使用处理机,则立即暂停正在执行的进程,将处理机分配给更重要紧迫的那个进程。- 可以优先处理更紧急的进程,也可实现让各进程按时间片轮流执行的功能(通过时钟中断)。适合于分时操作系统、实时操作系统。
7.8、进程的切换与过程
“狭义的进程调度”与“进程切换”的区别:
狭义的进程调度
指的是从就绪队列中选中一个要运行的进程。(这个进程可以是刚刚被暂停执行的进程,也可能是另一个进程
,后一种情况就需要进程切换)进程切换
是指一个进程让出处理机,由另一个进程占用处理机的过程。
有些题目中出现的进程调度,指的是广义的进程调度
包含了选择一个进程和进程切换两个步骤。(也就是上面的两个步骤)
进程切换的过程主要完成了:
- 对原来运行进程各种数据的保存
- 对新的进程各种数据的恢复(如:程序计数器、程序状态字、各种数据寄存器等处理机现场信息,这些信息一般保存在进程控制块)
注意:进程切换是有代价的
,因此如果过于频繁
的进行进程调度、切换
,必然会使整个系统的效率降低
,使系统大部分时间都花在了进程切换上,而真正用于执行进程的时间减少。
所以不能说进程切换越频繁,系统的并发度越高
7.9、小结
8、调度算法的评价指标
8.1、CPU利用率
由于早期的CPU造价极其昂贵,因此人们会希望让CPU尽可能多地工作
CPU利用率
: 指CPU “忙碌”的时间占总时间的比例。 利用率 = (忙碌的时间)/(总时间)
利
用
率
=
忙
碌
的
时
间
总
时
间
\\\\[10pt] 利用率 = \\frac忙碌的时间总时间
利用率=总时间忙碌的时间
有的题目还会让算某种设备的利用率:
8.2、系统吞吐量
对于计算机来说,希望能用尽可能少的时间处理完尽可能多的作业
系统吞吐量
:单位时间内完成作业的数量。系统吞吐量 = (总共完成了多少道作业)/总共花了多少时间
系 统 吞 吐 量 = 总 共 完 成 了 多 少 道 作 业 总 共 花 了 多 少 时 间 \\\\[10pt] 系统吞吐量 = \\frac总共完成了多少道作业总共花了多少时间 系统吞吐量=总共花了多少时间总共完成了多少道作业
8.3、周转时间
对于计算机的用户来说,他很关心自己的作业从提交到完成花了多少时间。一般周转时间肯定是越少越好。
周转时间
:指从作业被提交给系统开始,到作业完成为止的这段时间间隔。它包括四个部分
- 作业在外存后备队列上等待作业调度(高级调度)的时间
- 进程在就绪队列上等待进程调度(低级调度)的时间
- 进程在CPU上执行的时间(进程处于运行态的时间)
- 进程等待I/O操作完成的时间(进程处于阻塞态的时间)
后三项在一个作业的整个处理过程中,可能发生多次。因为整个作业中只会有一次作业调度(高级调度)。
周转时间
= 作业完成时间 - 作业提交时间。[对于用户来说,更关心自己的单个作业的周转时间]
平均周转时间
= (各作业周转时间之和)/作业数。[对于操作系统来说,更关心系统的整体表现,因此更关心所有作业周转时间的平均值]
有的作业运行时间短,有的作业运行时间长,因此在周转时间相同的情况下,运行时间不同的作业,给用户的感觉肯定是不一样的,所以提出了带权周转时间
周 转 时 间 = 作 业 完 成 时 间 − 作 业 提 交 时 间 平 均 周 转 时 间 = 各 作 业 周 转 时 间 之 和 作 业 数 周转时间 = 作业完成时间-作业提交时间\\\\[15pt] 平均周转时间 = \\frac各作业周转时间之和作业数 周转时间=作业完成时间−作业提交时间平均周转时间=作业数各作业周转时间之和
带
权
周
转
时
间
=
作
业
周
转
时
间
以上是关于进程管理(二[1])的主要内容,如果未能解决你的问题,请参考以下文章 操作系统 王道考研2019 第二章:进程管理 -- 进程同步进程互斥(临界资源)实现临界区互斥的基本方法(软(单/双 标志Peterson )硬件(中断屏蔽TSSwap))饥饿