作者:困了电视剧
专栏:《JavaEE初阶》
文章分布:这是关于进程调度、并发并行以及相关属性详解的文章,我会在之后文章中更新有关线程的相关知识,并将其与进程进行对比,希望对你有所帮助。
目录
什么是进程/任务(Process/Task)
进程的并发执行和并行执行
进程的属性和管理
进程控制块抽象
进程状态
进程的优先级
进程的上下文
进程的记账信息
双向链表组织PCB
什么是进程/任务(Process/Task)
每个应用程序运行于现代操作系统之上时,操作系统会提供一种抽象,好像系统上只有这个程序在运行,所有的硬件资源都被这个程序在使用。这种假象是通过抽象了一个进程的概念来完成的,进程可以说是计算机科学中最重要和最成功的概念之一。
进程是操作系统对一个正在运行的程序的一种抽象,换言之,可以把进程看做程序的一次运行过程;同时,在操作系统内部,进程又是操作系统进行资源分配的基本单位。
只看定义可能有点抽象,我们用实际的例子来进行说明。
一个运行起来的程序就是进程。
.exe是一个可执行文件(程序),当双击这个exe,这个程序就会跑起来,于是就在系统中形成了一个进程,我们可以打开我们电脑上的任务管理器观看现在运行的进程有哪些。
通过任务管理器我们可以看到,我们的计算机在同一时刻进行着多个进程,进程一多我们就需要对其进行管理,我们可以通过任务管理器直观地看到这些运行的进程,那么在计算机内部,这些进程是如何被管理的呢?
进程的并发执行和并行执行
我们打开我们的任务管理器可以看到我们电脑此时的核心数,这里小编的电脑是八核16线程,什么意思呢?就是我的电脑有8个核心,但每个核心都能顶俩,即8个物理核心,16个逻辑核心,这16个逻辑核心可以将他们看成16个“干活的人”。
由上上图我们可以看出,此时我的电脑应用有9个,后台进程有122个,也就是说此时我们需要干的活有131个,但我们只有16个干活的人,那这咋整。
这里就需要并发和并行了。
并行就是指这16个核心可以同时干活,也就是说假设每一个核心现在只干一个活,那么一次性就可以干16份活,不过这和我的131份活还差的远呢,此时就需要并发。
并发就是指每个核心——干活的人虽然在同一时刻只能干一份活,但只要我活切换的够快,我就能造成同时干很多活的感觉,就比如,我现在先执行一会进程1,执行一会后再执行进程2,然后进程3,进程4...
如果这个“一会”是很短很短的时间,那我看起来就像是在同时执行进程1,2,3,4...
CPU就通过这两种并发和并行的方式来完成这131个任务。
进程的属性和管理
所谓的管理其实就是分两步:
1.描述一个进程:使用结构体/类,把一个进程有哪些信息表示出来。
2.组织这些进程:使用一定的数据结构,把这些结构体/对象放到一起。
进程控制块抽象
1.pid,每个进程都需要有一个唯一的身份标识2.内存指针,当前这个进程使用的内存是哪一部分3.文件描述符表,文件:比如硬盘上存储的数据,往往就是以文件的形式进行处理的。进程每次打开一个文件,就会产生一个文件描述符用来标识这个文件,这个文件描述符会 被存储在顺序表这样的结构里,这个顺序表就是文件描述符表。一个进程在运行的过程中会打开很多个文件,每当打开一个文件的时候都会产生一个文件 描述符,当一个文件关闭时,它对应的相应的文件描述符也会从文件描述表中被移除。4.CPU分配——进程调度所需要的相关属性,具体如下
进程状态
可以简单认为,进程的主要状态是就绪态和阻塞态这两个。
就绪态:该进程已经准备好,随时可以上CPU执行。
阻塞态:该进程暂时无法上CPU执行。
CPU在执行进程的时候,只会考虑什么时候执行处于就绪态的进程,对于阻塞态的进程,CPU并不会执行。
进程的优先级
进程之间的调度不一定是“公平”的,有的进程比较重要或是什么其他因素,就需要对该进程进行优先调度。
举个栗子:假设我有ABC三种临时工作需要做,A的工资待遇最好,B其次,C最差,现在情况是这三种工作都不需要天天 进行,我又想让我一周不闲下来,所以这是我就需要安排相应的工作时间,A由于工资待遇最好所以我优先安排,B其次,C最差就看哪天有空下来的时间哪天再去。
进程的上下文
上下文,就是描述了当前进程执行到哪里这样的“存档记录”,进程在离开CPU的时候就要把当前运行的中间结果进行“存档”,等到下次进程回来CPU上,再恢复之前的“存档”,从上次的结果继续往后执行。
CPU往往需要执行多个进程,这些进程在任意时刻都有可能离开,如果不对这些中间结果进行存档,那当离开的进程又回来时就有可能造成“驴头不对马嘴”的情况,具体到进程,所谓的上下文具体指就是进程运行过程中,CPU内部的一系列寄存器的值。
存档:进程离开CPU,就需要把这些寄存器的值保存到PCB的上下文字段中。
读档:进程下次回来CPU,再把PCB中的值给恢复到寄存器中。
进程的记账信息
双向链表组织PCB
操作系统往往使用双向链表这样的结构来组织PCB,所以,
1.创建一个进程,就是创建一个链表的节点
2.销毁一个进程,就是把链表的节点给删除了
3.遍历进程列表,就是在遍历链表
以上就是本篇博客的全部内容,如有疏漏欢迎指正!