目录
一.进程的状态:运行态
1.什么是运行状态?
2.进程进入内存的详细图解:
总结:
二.进程的状态:阻塞态
1.什么是阻塞状态?
三.进程的状态:挂起态
1.什么是挂起态?
2.阻塞与挂起的区别:
通过上一篇博客对进程的讲解,我们了解了进程就是一个个在磁盘中的二进制可执行文件运行时被加载到内存后就成为了进程。其实进程也是分状态的,在很多操作系统的书中提到进程的状态有新建、就绪、运行、挂起、阻塞、死亡、停止...... 进程之所以能被描述出有这么多状态,本质都是用来满足不同的运行场景的。下面我将介绍最重要的三种进程状态
一.进程的状态:运行态
1.什么是运行状态?
当一个进程被调入CPU的运行队列时就是处于运行状态了。
在生活中,我们用的电脑一般情况下都只有一个CPU,而CPU是用来执行和处理进程的,将具体一点就是每一个CPU都会有一个运行队列(runQueue),运行队列的底层实现是一个数据结构链表,它里面的各个节点元素就是各进程的属性task_struct(PCB),所以CPU可以根据运行队列看到各节点进程的状态和数据信息。
2.进程进入内存的详细图解:
如上就是进程运行时在被加载到内存后的详细步骤图,运行队列中存放的是该进程的PCB结构体,根据队列先进先出的原则,CPU会对先加载进来的进程PCB进行代码和数据上的执行处理 。
举一个工作上的例子进行理解:当我们在找工作的过程中,向公司投递了简历,这里的投简历并不是把自己投进了公司,而是把自己的简历做成文件投进去了,那么简历从哪里来呢?是我们自己制作了一份包含了自己的姓名、年龄、电话、性别、技术特长...... 的文档,这就是我之前所提到的:“先描述” 即整理出自己的信息数据!
然后公司收到简历后,便开始筛选,当你通过筛选后,你的简历就会被放在HR的办公桌上,公司会安排你进行下一轮的面试,这时你就相当于是进程,简历相当于是PCB。而运行队列就是HR,面试的过程相当于是你进入了运行队列,这便是后三个字:“再组织” ——HR将一个个人的简历链接起来进行面试。
若你通过了面试,公司的系统(相当于是CPU)则会对你的身份进行入职办理(CPU对进程进行运算处理)。
总结:
1.一个CPU只有一个运行队列。
2.当可执行文件.exe程序运行起来后,便会进入内存成为进程,而操作系统会形成一个PCB去概括该进程的所有属性(Linux下是形成struct task_struct结构体),所谓的进程进入运行队列,本质上是该进程的PCB被操作系统调入了运行队列中。
3.进程的PCB只要处在运行队列中,就表明该进程是在运行状态。
所以“只有该进程的PCB正在被CPU运行处理时才算是运行状态 。”这种想法是错误的,因为CPU的运算速度相当快,是一瞬间的事情,所以只要PCB在队列中就是运行状态!
4.对于上面投简历这个案例,我还想说一点:当我们投简历给公司后,公司经过筛选一部分的简历进入下一轮后,会给这些人打电话说:"恭喜x先生/女士,我们xx公司通过了你的简历,请在未来几天内等候安排面试!",在HR说这句话之前,我们正在忙着自己的事情(可以是睡觉,打游戏,吃饭),而在HR说过这话以后,我们作为进程,就达到了运行状态。
5.不要只以为,进程只会占用CPU的资源,如上图,进程也可能会占用键盘、网卡、显示器、磁盘等硬件资源!那么进程所处的不同状态,就是进程处在CPU和非CPU的队列中,等待着该硬件空闲处理去使用,这就是下面我要提到的进程的第二种状态——阻塞状态!
二.进程的状态:阻塞态
1.什么是阻塞状态?
举个例子理解:当我们上网时,在网上下载一个游戏,找到下载路径开始下载,此时右上方就会出现一个软件下载的进度条,在下载的过程中家里停电了,电脑被迫断网,导致进程停下来了,那么该进程的状态就称为是阻塞状态。
因为该进程是需要占用网卡(硬件资源的),但是CPU等不了那么长时间(网卡的运算传输很慢的),所以该进程就只能被操作系统调出运行队列,放到网卡的队列中等待着网卡处理器的运行中,这时该进程从运行状态就转换到了阻塞状态。
上图中,橙色的框代表着各个硬件资源的老大,相当于是小型的cpu也可以。在这些硬件处理器中,都有各自的等待队列,专门用于存放进程需要占用这些硬件资源的位置,相当于医生给你看病的半中间,让你先去抽血,拍CT,化验等过程,在抽血的过程中也需要进入队列排队,只要进程进入这些硬件处理器的队列,那么这个进程就是处于“阻塞状态”!
上面的例子中提到,进程A由于需要网卡硬件资源,导致CPU停止了该进程A的运行,将其转入了网卡的等待队列,运行态变为阻塞态。此时若是有其他进程B,C,D也正在被网卡执行时,那该进程A就需要在队列中等待,若没有则会立即被网卡执行处理。
注:阻塞态的进程仍处于内存中,进程的代码数据也会移动到相应的所需要的硬件资源存放处。
三.进程的状态:挂起态
1.什么是挂起态?
挂起态和阻塞态息息相关,也就是说进程在进入挂起态之前一定处于阻塞态!
举个例子:当有三个进程1,2,3都需要申请磁盘资源时,操作系统将他们都调入了磁盘的等待队列中,这时它们处于阻塞状态,磁盘处理器开始一个个的运行处理这些调过来的PCB,假如此时磁盘处理进程的空间已经快满了,又有一个进程需要申请磁盘资源,系统需要把它调进磁盘的等待队列,但是该队列已经放不下了,于是系统会将队列中前面还需要等待时间较长的PCB3的代码数据保存下来,然后进程3就可以暂时被磁盘的进程空间给释放掉了,以便于给后面调过来的进程留有空间。
这就是操作系统对于进程的普遍处理,若是某个硬件处理器的运行空间不够,就会将在该硬件处理器等待时间较长的进程资源数据先保存下来,然后暂时释放掉该进程所占的空间,让后来的想要申请该硬件资源的进程也能够进来。
当PCB1,PCB2都被磁盘处理运算完后,轮到PCB3时,系统会再将PCB3的代码资源从之前保存过的磁盘空间唤醒,调回磁盘处理器中开始处理,处理完后PCB3就会被系统再调回CPU的运行队列,由CPU继续从上一次的断点处开始处理。
阻塞不一定挂起,挂起一定阻塞。
2.阻塞与挂起的区别:
阻塞:当进程正在被CPU运算处理时,需要申请CPU以外的资源,系统会将其从运行队列调出,进而调入需要申请资源的task_strucy结构体中(某某处理器)的等待队列,该状态称为阻塞状态。
当该进程被某某处理器处理完后,系统会将其送回CPU的运行队列中,继续被CPU运算处理,该进程从“阻塞状态”----> “运行状态”
挂起:当进程的PCB进入某某资源处理器的等待队列后,由于又有新的进程需要申请进入该资源处理器的等待队列,系统不得不将等待时间长的进程的数据信息保留下来,拿出去以便给后面的新进程腾出空间,这是的进程状态被称为“挂起状态”
当资源处理器能够处理之前被拿出去的进程时,系统会将其唤出,把该进程C的资源再拿回来进行处理,这时该进程从“挂起状态”--->"阻塞状态"
以上就是从宏观层面上对进程的三种重要状态的讲解了。