进程控制、进程间通信、进程调度

进程控制

进程控制:是对系统中的所有进程实施有效管理,它具有创建新进程,撤销已有进程,实现进程转换等功能。
简单的说就是实现进程之间的状态转换。
进程控制是用原语来实现的,原语用开/关中断来实现,原语是一种特殊的程序,原语的执行必须一气呵成,具有原子性,中间执行的过程不能被中断。
在关中断指令和开中断指令之间的原语代码不受到外部中断信号的影响,也就是在此期间会忽略中断信号。
开中断、关中断指令的权限非常大,必然是只允许在核心态下执行的特权指令。

原语所做的事情

  1. 更新PCB中的信息(如修改进程状态标志、将运行环境保存在PCB,从PCB恢复运行环境)
    1. 所有的进程控制原语一定都会修改进程状态
    2. 剥夺当前运行进程的CPU使用权限,必然需要保存他的运行环境
    3. 某进程开始运行前必然要恢复运行环境
  2. 将PCB插入正确的队列中
  3. 分配或回收资源

进程创建时发生了哪些事?

创建原语,申请空白PCB,为新进程分配所需资源,将PCB插入就绪队列中

用户登录成功时,系统会为用户新建一个进程
作业调度:多道批处理系统中,有新作业放入内存中,也会为其创建一个新进程
提供服务:用户向操作系统发出某个请求时,会新建一个进程处理请求
应用请求:由用户进程主动请求创建一个子进程。

进程终止时发生了哪些事?

撤销原语:从PCB集合中找出终止进程的PCB,如果进程正在运行,那就剥夺他的CPU执行权,将CPU分配给其它进程。终止所有子进程,将该进程拥有的所有资源换归还给父进程或操作系统。
可能引起进程终止的事件:进程正常结束,异常结束,外界干扰。

进程的阻塞和唤醒状态时执行的原语

阻塞原语:找到要阻塞的进程对应的PCB,保护进程运行的环境,将PCB状态信息设置为阻塞,展厅或停止进程运行。将PCB插入阻塞队列中。
引起阻塞的事件:需要等待系统分配某种资源,需要等待相互合作的其他进程完成工作。
唤醒原语:在事件等待队列中找到PCB,将PCB从等待队列移除,设置进程为就绪态,将PCB插入就绪队列,等待被调度。
引起进程唤醒的事件:等待事件的发生
阻塞原语唤醒原语必须成对出现。

进程通信

进程间的信息交流
进程是资源分配和调度的单位,因此各个进程拥有的内存地址空间相互独立
为了保证安全,一个进程是不能直接访问另外一个进程的地址空间的。但是进程间的信息交换又是必须的。为了实现进程间通信,操作系统提供了一些方法。
共享存储,消息传递,管道通信

共享存储

两个进程提供共享空间来进行彼此之间的交流。前提是两个进程对共享空间的访问必须是互斥的(互斥访问通过操作系统提供的工具实现)操作系统只负责提供共享空间和同步互斥工具(P,V操作);
共享存储又分为基于数据结构的共享基于存储区的共享

基于数据结构的共享

比如共享空间里面只能放一个长度为10 的数组。这种共享方式速度慢、显示多、是一种低级通信方式。

基于存储区的共享

在内存中划出一块共享存储区,数据的形式、存放的位置都是由进程控制而不是操作系统。相比之下,这种共享方式速度更快,是一种高级通信方式。

消息传递

进程间数据交换是以格式化的消息为单位。进程通过操作系统提供的“发送消息/接收消息”两个原语进行数据交换。
消息主要由消息头和消息体组成;消息头包括:发送进程ID、接收进程ID,消息长度等格式化信息(类似于计算机网络中发送的“报文”);消息体就是主要发送的内容。

消息传递分为直接通信方式和间接通信方式;
直接通信方式
消息直接挂到接收进程的消息缓冲队列中
间接通信方式
消息要发送到中间实体中,因此也称为“信箱通信方式”
进程1向进程2发送消息,使用间接通信的方式就是,进程1先发送原语,将消息发送到信箱中,然后进程2会通过接受原语取走进程1的消息。

管道通信

管道是指用于连接读写进程的一个共享文件,又名pipe文件。其实就是在内存中开辟一个大小固定的缓冲区。

一个进程从管道中写数据,另个进程从里面读数据。

  1. 管道只能采用半双工通信,某一时间段内只能实现单向的传输。如果要实现双向同时通信,则需要设置两个管道。
  2. 各个进程要互斥地访问管道。
  3. 数据以字符流的形式写入管道,当管道写满时,写进程的write()系统调用将被阻塞,等待读进程将数据取走;当读进程将数据全部取走后,管道变空,此时读进程的read()系统调用将被阻塞。
  4. 如果管道还未被写满,是不允许读的,如果管道还没被读空,是不允许写的。
  5. 一旦数据被读出,就在管道中被抛弃,再也找不回来了,这就意味着读进程最多只能有一个,否则可能会读错数据的情况。

调度

在多道程序系统中,进程的数量往往是多个处理机的个数,这样不可能并行的处理各个过程。处理机调度,就是从就绪队列中按照一定的算法选择一个进程并将处理机分配给他运行,以实现进程的并发执行。

三个层级

高级调度(作业调度)

由于内存空间分配有限,有时无法将用户提交的作业全部放入内存,因此就需要确定某种规则来决定将作业调入内存的顺序。
高级调度:按照一定的原则在外存上从处于后备队列的作业中挑选一个(或多个)作业,给他们分配内存等必要的资源,并建立相对应的进程(建立PCB),以使他们获得处理机的权限。
高级调度主要是指调入的问题,因为只有调入的时机需要操作系统来确定,调出的时机必然是作业运行结束才调出的。

中级调度(内存调度)

引入了虚拟存储技术之后,可将暂时不能运行的进程调至外存等待。等它重新具备了运行条件且内存又稍有空闲时,再重新调入内存。
这么做的目的是为了提高内存利用率和系统吞吐量。
暂时调到外存等待的进程状态为挂起状态。值得注意的是,PCB并不会一起调到外存,而是会常驻内存。PCB中会记录进程数据在外存中的存放位置,进程状态等信息,操作系统通过内存中的PCB来保持对各个进程的监控、管理。被挂起的进程PCB会被放到的挂起队列中。
中级调度(内存调度),就是要决定将哪个处于挂起状态的进程重新调入内存。
一个进程可能会被多次调出、调入内存,因此中级调度发生的频率要比高级调度更高。

挂起态

暂时调到外存等待的进程状态为挂起态;挂起态又分为就绪挂起和阻塞挂起
阻塞和挂起的区别:
虽然两种都是暂时不能获取CPU的服务,但是挂起是将进程的映像调到外存而阻塞态下进程的映像还在内存

低级调度(进程调度)

低级调度(进程调度),其主要仼务是按照某种方法和策略从就绪队列中选取一个进程,将处理机分配给它。
进程调度是操作系统中最基本的一种调度,在一般的操作系统中都必须配置进程调度。
进程调度的频率很高,一般几十毫秒一次。

三层调度的联系与对比

进程调度的时机

进程调度(低级调度)就是按照某种算法从就绪队列中选择一个进程为期分配处理机(CPU)

需要进行进程调度和切换的情况

  1. 当前进程主动放弃处理机
    1. 进程正常终止
    2. 运行过程中发生异常而终止
    3. 进程主动请求阻塞(如等待IO)
  2. 当前进程被动放弃处理机
    1. 分给进程的时间片用完
    2. 有更加紧急的事情需要处理
    3. 有更高优先级的进程进入到就绪队列

不能进程进程调度的情况

  1. 在处理中断过程中。中断处理过程比较复杂,与硬件密切相关,很难做到在中断处理过程中进行进程转换
  2. 进程在操作系统内核程序临界区中
  3. 在原子操作过程中(原语)。原子操作不可中断,要一气呵成

临界资源:一个时间段内只允许一个进程使用的资源。各个进程需要互斥地访问临界资源。
临界区:访问临界资源的那段代码

内核程序临界区: 一般是用来访问某个内核数据结构的,比如进程的就绪队列(由各个就虚进程的PCB组成)

进程的调度方式

非剥夺调度方式

非剥夺调度方式,又称为非抢占方式,对应的就是进程主动放弃处理机。实现简单,系统开销小但是无法及时处理紧急任务,适用于早期的批处理系统。

剥夺调度方式

抢占方式,当一个进程正在处理机上运行时,如果有比他优先级更高的进程需要处理,则暂停当前进程,将处理机分配给优先级高的进程。可以优先处理更加紧急的进程,又可以实现让各个进程按时间片轮流执行功能。适合于分时操作系统,实时操作系统。

进程的切换和过程

狭义的进程调度与进程切换的区别
狭义的进程调度指的是从就绪队列中选中一个要运行的进程。(这个进程可以是刚刚被暂停执行进程,也可以是新的进程,如果是新的进程就需要进行进程的切换)
进程得切换指的是,将旧的进程让出处理机,保存它的状态,另一个新的进程暂用处理机的过程。
广义的进程切换包含进程的转换和选取进程这两个过程。

进程间的切换主要完成了:
1、对原来运行进程各种数据的保存
2、对新进程各种数据的恢复
注意:进程切换是有代价的,如果进程间的切换太过频繁,那么会导致整个系统的效率下降,系统大部分时间将花在进程切换上,而真正用于执行的时间变少。

常见的进程调度算法

猜你喜欢

转载自blog.csdn.net/qq_43672652/article/details/107677387