编辑推荐: |
本文主要介绍了linux操作系统:进程切换 进程调度 PCB 进程队列 中断过程相关内容。
希望对你的学习有帮助。
本文来自于微信公众号Linux开发架构之路,由火龙果软件Linda编辑、推荐。 |
|
并发的进程切换
要了解并发进程的切换,首先要清楚知道什么是并发的进程!!
并发的进程最主要的特点就是走走停停的状态,从运行的开始到结束不是一步运行到底的,是走走,然后cup被调度走就停停,等到需要进程继续执行的时候,又可以被分配到cpu资源,然后走走;如此反复,知道进程运行结束!
(单cpu的讨论)如上图的两个进程process1和process2,虚线部分表示进程停止,实线部分表示进程运行,当process1停的时候,process2就运行,此时这个过程就是进程切换。
我们需要关注的两个问题:
1.是什么导致了进程切换?
中断。
2.进程切换要做什么?
进程切换的时机有主动和被动离开cpu;
主动:比如:IO语句,系统调用;
被动:比如:高优先级进程,时间片到期;
进程切换就是和中断很基本一样的方式,而进程之所以能够被切换,也是有中断处理程序在执行,让进程能够切换,所以说中断处理程序也是一个很特殊的中断,它能够让进程发生切换。
总的来说:进程切换就是要执行中断处理程序咯,还有做的事情和中断做的事情。
中断技术
理解上面的图:
当发生某个事件时,意味着进程不能继续执行了,那么cpu就不会为进程服务了;然后引起中断的事件,也就是使得进程不能继续运行的事件,它就会被执行;当中断事件执行完毕后,会返回原程序继续执行,也就是回到进程继续执行;
运行的进程在用户态,而进行中断的事件是在内核态;而中断的过程就是一种陷阱机制,也就是说,从用户态陷入内核态执行内核态的进程,当执行完毕中断事件后,又会回到用户态继续执行原进程。
中断源
进程发生中断的原因是来自什么?
中断分为两种:
一种是外中断(我们通常叫为interruption);外中断特点是异步中断,就是随机中断,它的中断源是不可预知的,即对于进程来说是不知道什么时候会发生中断;
一种是内中断(也就是异常exception);内中断时同步中断,指程序执行过程中发生的中断,不是外部引起的,是程序自身引起的这两种都是中断;
中断的过程
中断的过程:
是从用户态陷入内核态的一个过程:在从用户态陷入内核态之前:会先保存进程上下文的内存信息;
然后再进入内核态,进入内核态要知道中断源是什么,然后处理中断源;
然后处理中断程序结束后,就会选择进程来恢复上下文信息,就继续执行恢复后的进程;
什么是进程上下文的信息呢?
就是该进程的对cpu使用的时间,进程的计算结果等其他和进程的关键的信息,由于这个信息很多,所以用一个抽象的说法,上下文信息,主要是为了中断事件结束后,还能回到原来中断时候的地方继续执行进程。举个例子:比如你家里写作业,有5到题要写,写着一半,你妈妈突然喊你曲吃饭,此时,你就需要去吃饭,而在你的大脑中,会记住你作业做到哪里的位置,这样等吃完饭回来后,你还可以从上次没写完的那个地方开始写作业。你记住写作业写到哪里的位置就是上下文信息啦。
特权指令和非特权指令
特权指令:就是运行在内核态的一些指令:
常见的特权指令有:如下图的;其中我们要讲的进程切换也是运行在内核态的特权指令
cpu怎么知道要执行的指令是特权指令还是非特权指令?
靠的是硬件来完成:硬件中有个个双模式dual mode的bit位:0 表示内核模式,1表示用户模式;
用户态和内核态的模式切换:
中断是从用户态切换到内核态的唯一途径!!!
一旦发生中断,就会有模式切换的过程,就是用户态到内核态的切换!!!
下图:从中断的时刻开始,到中断处理程序的过程的开始中:就是模式切换的过程
进程的切换
一个进程要被切换,肯定是处于运行状态才有资格被切换,进程被切换了意味着进程要离开cpu,离开cup的原因就有两种:一种是主动离开,一种是被动离开;比如主动离开的是执行IO设备啊等其他原因,被动离开的是进程时间片到了等其他原因;那么进程离开cpu就去哪了呢?进程离开cpu就会到等待状态,或者就绪状态。
进程切换和中断有什么关系呢?
进程控制块–PCB
每个进程都有一个PCB,这个PCB我们成为进程控制块,其实就是一个数据结构的代码。这个数据结构的代码保存了进程的控制信息;
对于一个完整的进程来说:是包含PCB和进程的实体(进程实体就是进程运行时候所需要的数据,代码,变量等信息)。
进程在物理内存的存放
进程在物理内存存放并不是连续的存放的,是离散的存放的。
比如一个进程1:包含PCB和stack heap data text等信息,都是离散的在内存存放的;
而离散存放的目的为了减少连续存放带来内存碎片等问题;
同时离散存放也带来的问题是:必须要有一个表来记录这些进程离散的信息,来找到一个进程的实体;(者都是内存管理的问题,以后再讲)
进程队列
操作系统是如何管理进程呢?
是通过进程队列的数据结构管理的,进程队列会有就绪态的队列,和等待态的队列,一般来说,等待态的队列分为很多种,这是为方便管理每种不同的设备而设置的。
对于进程队列来说:管理的进程都是进程的PCB,而不是整个进程的上下文(PCB+进程实体),
这是因为进程的PCB已经包含了进程的其他信息,可以通过PCB找到进程实体的信息,而且进程的PCB相对进程实体来说,也比较小,而进程实体可能会很大,频繁的入队出队,会消耗大量的cpu资源管理,这样并不好。
进程调度
进程调度,简单的说就是进程在各个进程队列中跑来跑去,被操作系统调去就绪队列呀,或者等待队列,或者运行态,或者运行结束!
比如一个新创建的进程,一开始就会被调度到就绪队列中,然后cpu就会在某个时间调度该进程进入运行态,如果是一直运行结束就结束进程了,如果是发生中断那么又会被调度到等待队列或者就绪队列中。
|