进程以及进程调度(超详细)

目录

一 进程

1.1 进程的定义

1.2 电脑中的进程

二 进程与程序的区别和联系

2.1 进程与程序的实例

2.2 进程与程序的区别

2.3 进程与程序的联系

三 进程调度

3.1 进程调度的原因

3.2 进程调度的操作者

3.3 协助进程调度的PCB---进程控制块

(1) PID---进程号

(2) 内存指针

(3) 文件描述符表

(4) 进程状态

(5) 进程的优先级

(6) 进程的上下文

(7) 进程的记账信息

3.4 进程调度的具体方式

(1) 并行 

(2) 并发

四 总结


一 进程

1.1 进程的定义

狭义定义:进程就是一段程序的执行过程
广义定义:进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。它是操作系统动态执行的基本单元。

1.2 电脑中的进程

打开我们电脑中的任务管理器

 任务管理器中的每一行都是一个在我们电脑中正在运行的进程

二 进程与程序的区别和联系

2.1 进程与程序的实例

上图中左侧的每一个文件都是有序代码的集合,都是程序员编写出来的程序.

而当我们的电脑中我们可以双击运行以.exe为后缀的可执行文件,即可在我们的电脑中运行出对应的应用程序,而这每一个运行的应用程序,都是操作系统中的一个进程.

2.2 进程与程序的区别

进程是动态的,程序是静态的: 进程是在我们电脑上正在运行的程序的一种抽象,即进程是可以不断变化的,而程序只是我们代码中存放的代码的集合,在没有运行的时候,只是一堆冰冷的0,1数字,不会变化。

进程是暂时的,程序是永久的: 进程是一个状态变化的过程,在进程运行结束之后即被操作系统销毁;但是程序只是存储在我们电脑中的硬盘上,不会随意改变,长久储存。

2.3 进程与程序的联系

程序是有序代码的集合,进程是程序的执行:  进程的本质就是有序执行程序中的代码,进而成为我们电脑中运行的应用,因此,如果没有程序的支持,就根本就没有进程的存在。

三 进程调度

3.1 进程调度的原因

首先我们观察下图:

 即在我们的任务管理器中我们可以清晰的看到我们现在的电脑中运行的线程数,此时在我的电脑中运行着高达81个线程,而线程均是需要被调度到cpu上才能运行的。而我们观察下图:

 即在任务管理器中的性能里,可以看到小编的电脑cpu内核为6,逻辑内核为12,也就是说小编的电脑如果不进行进程调度的话就只能同时运行12个进程,但是从上面可以知道小编的电脑同时运行了81个进程,因此这就是cpu进行进程调度后的结果。

因此只有进行进程调度,才能够最大化充分发挥我们计算机中cpu的性能,同时也应对了cpu内核少,而进程太多的问题。同时某些任务场景需要“等待IO”,为了让等待的时间能够让cpu去做一些其他的工作,也需要进程的调度。

3.2 进程调度的操作者

进程调度的唯一操纵者就是操作系统。而操作系统想要进行合理的调度每个进程,就必须记录每一个进程的详细信息,这个记录进程的详细信息的就是PCB(Process Control Block)——进程控制块。每一个进程都对应有一个PCB对象,同时操作系统再通过例如链表,搜索树等的数据结构将PCB组织起来,方便管理时进行增删查改以及调度。

3.3 协助进程调度的PCB---进程控制块

每一个PCB为了协助操作系统进行进程调度,必须记录详细的进程信息,因此接下来我们一起了解一下PCB中都有哪些重要属性。

注意:PCB中的属性包括但不仅限于这些属性。

(1) PID---进程号

PID(Process Identification)在操作系统里指进程识别号,也就是进程标识符。操作系统里每打开一个程序都会创建一个进程ID,即PID。这个PID有一下两个特点。

1. 唯一性:这个由操作系统分配的PID在同一时刻是唯一的,不会同时出现两个相同的进程拥有相同的PID,即这个PID在这个进程运行的时候唯一标识这个进程。

2. 暂时性:这个PID在不同的时间可能代表的进程不同,即在一个线程结束后,它的PID会被回收,之后这个PID可以分配给其他进程。

(2) 内存指针

因为进程要跑起来,操作系统就必须要把这个进程相关的操作从外存加载到内存中,即会消耗一定的内存资源,因此PCB中有内存指针用来标识这个进程使用的是哪一部分内存

(3) 文件描述符表

我们应该知道,我们电脑硬盘上面存储的数据,往往都是以文件为单位进行整理的。

上图中文件都是纪录在硬盘中的,而进程的运行需要这些文件的支持,即进程每次打开一个文件,就会产生“文件描述符”(标识了被打开的文件),而一个进程可能会打开很多文件,因此就会产生一组文件描述符,因此将这些文件描述符放到一个顺序表中,即构成了文件描述符表。 

(4) 进程状态

因为进程要进行合理的调度,就必须知道进程此时的状态,了解到该不该将进程加载到CPU上执行。为了方便理解,我们可以简单地认为进程的状态主要为以下两个。(不限于这两个)

1. 就绪态:表明该线程目前已经准备好,随时可以上CPU进行执行

2. 阻塞态:表明该进程当前无法上CPU执行,让CPU先运行别的进程

(5) 进程的优先级

操作系统想要进行合理的进程调度,光知道进程的状态是肯定不行的,因为如果很多个进程都是就绪态,操作系统该先将哪个进程加载带CPU上执行呢?

为了解决这个问题,PCB中引入了进程的优先级,即优先级高的进程会先被加载到CPU上执行

(6) 进程的上下文

上下文指的是当前进程具体执行情况的“存档记录”, 进程在离开CPU的时候就要把当前运行的中间结果“存档”,以便于下次再次将该进程调度到CPU上的时候,可以恢复当前的“存档”,从上次的结果继续往后执行。

对于进程来说,所谓的上下文就是在进程将要被调度下CPU时,CPU内部的一系列寄存器的值。即存档和读档我们可以进一步理解。

存档:进程要离开CPU,将CPU中相关寄存器的值保存到PCB的上下文字段中。

读档:进程下次回来CPU,通过PCB中的上下文字段,恢复CPU中寄存器的值。

(7) 进程的记账信息

进程的记账信息主要记录的是进程在CPU上的执行时间,作为CPU进行进程调度的依据。因为操作系统不可以让一个进程一直在CPU上执行,让其余的线程一直在“等待”,这显然不符合实际。

3.4 进程调度的具体方式

(1) 并行 

简单点来说就是同一时刻,两个核心(CPU),同时执行两个进程,即每个CPU分别执行一个进程,此时这俩进程就是并行执行的。

(2) 并发

简单点来说就是一个核心,先执行进程1,执行一会儿后,开始执行进程2,而在执行一会儿后,又去执行进程3,而因为CPU的切换速度足够快,因此在我们用户看起来就是进程1,2,3是“同时”执行的。

 总体来说,我们操作进程进行进程调度的时候,是通过并行+并发的方式,而对于我们程序员来说是完全透明的,即我们完全感知不到,因此我们在很多时候就把并行+并发的方式统称为并发

四 总结

本篇博客,小编详细解释了进程的定义,以及系统是如何在我们电脑中进行调度的,同时列举出了很多我们电脑中的实例,希望每一位读者都能够搞懂这些知识,同时后续小编也会追加博客,解释线程和进程的区别,同时也会有关于JAVA中多线程编程的博客。

希望各位读者可以点赞,评论,关注一波,支持一下小编,感谢!

猜你喜欢

转载自blog.csdn.net/m0_70322372/article/details/129700177