【剧前爆米花--爪哇岛寻宝】进程的调度以及并发和并行,以及PCB中属性的详解。

作者:困了电视剧

专栏:《JavaEE初阶》

文章分布:这是关于进程调度、并发并行以及相关属性详解的文章,我会在之后文章中更新有关线程的相关知识,并将其与进程进行对比,希望对你有所帮助。

【剧前爆米花--爪哇岛寻宝】进程的调度以及并发和并行,以及PCB中属性的详解。_第1张图片

 

目录

什么是进程/任务(Process/Task)

进程的并发执行和并行执行

进程的属性和管理

进程控制块抽象

进程状态

进程的优先级

进程的上下文

进程的记账信息

双向链表组织PCB


什么是进程/任务Process/Task

每个应用程序运行于现代操作系统之上时,操作系统会提供一种抽象,好像系统上只有这个程序在运行,所有的硬件资源都被这个程序在使用。这种假象是通过抽象了一个进程的概念来完成的,进程可以说是计算机科学中最重要和最成功的概念之一。
进程是操作系统对一个正在运行的程序的一种抽象,换言之,可以把进程看做程序的一次运行过程;同时,在操作系统内部,进程又是操作系统进行资源分配的基本单位。

只看定义可能有点抽象,我们用实际的例子来进行说明。

一个运行起来的程序就是进程。

 

.exe是一个可执行文件(程序),当双击这个exe,这个程序就会跑起来,于是就在系统中形成了一个进程,我们可以打开我们电脑上的任务管理器观看现在运行的进程有哪些。

 【剧前爆米花--爪哇岛寻宝】进程的调度以及并发和并行,以及PCB中属性的详解。_第2张图片

通过任务管理器我们可以看到,我们的计算机在同一时刻进行着多个进程,进程一多我们就需要对其进行管理,我们可以通过任务管理器直观地看到这些运行的进程,那么在计算机内部,这些进程是如何被管理的呢?

进程的并发执行和并行执行

我们打开我们的任务管理器可以看到我们电脑此时的核心数,这里小编的电脑是八核16线程,什么意思呢?就是我的电脑有8个核心,但每个核心都能顶俩,即8个物理核心,16个逻辑核心,这16个逻辑核心可以将他们看成16个“干活的人”。

【剧前爆米花--爪哇岛寻宝】进程的调度以及并发和并行,以及PCB中属性的详解。_第3张图片

由上上图我们可以看出,此时我的电脑应用有9个,后台进程有122个,也就是说此时我们需要干的活有131个,但我们只有16个干活的人,那这咋整。

这里就需要并发和并行了。

并行就是指这16个核心可以同时干活,也就是说假设每一个核心现在只干一个活,那么一次性就可以干16份活,不过这和我的131份活还差的远呢,此时就需要并发。

并发就是指每个核心——干活的人虽然在同一时刻只能干一份活,但只要我活切换的够快,我就能造成同时干很多活的感觉,就比如,我现在先执行一会进程1,执行一会后再执行进程2,然后进程3,进程4...

如果这个“一会”是很短很短的时间,那我看起来就像是在同时执行进程1,2,3,4...

CPU就通过这两种并发和并行的方式来完成这131个任务。

进程的属性和管理

所谓的管理其实就是分两步:

1.描述一个进程:使用结构体/类,把一个进程有哪些信息表示出来。

2.组织这些进程:使用一定的数据结构,把这些结构体/对象放到一起。

进程控制块抽象

计算机内部要管理任何现实事物,都需要将其抽象成一组有关联的、互为一体的数据。在 Java 语言中, 我们可以通过类/ 对象来描述这一特征。
这个类我们可以将他命名为PCB,这样,每一个PCB对象,就代表着一个实实在在运行着的程序,也就是进程。
这个PCB包含的属性非常多,但以下几个属性最为重要,这些都是CPU为了进程跑起来所分配的硬件资源。 进程的运行,需要从操作系统申请资源,进程是操作系统进行资源分配的基本单位。
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中的值给恢复到寄存器中。

进程的记账信息

统计每个进程在CPU上执行了多久,可以作为调度的参考依据,就比如进度A调度的次数很少,计算机就可能知道我并不是太常用进度A,所以在进行调度的时候就减少调度的次数,节约资源。

双向链表组织PCB

操作系统往往使用双向链表这样的结构来组织PCB,所以,

1.创建一个进程,就是创建一个链表的节点

2.销毁一个进程,就是把链表的节点给删除了

3.遍历进程列表,就是在遍历链表

以上就是本篇博客的全部内容,如有疏漏欢迎指正!

你可能感兴趣的:(JavaEE初阶,windows,java)