目录
进程
进程是什么?
在操作系统内部,进程是系统资源分配和调度的基本单位,是程序运行的过程,进程间相互独立。我们也可以认为进程是一个运行中的应用程序,这点我们可以打开任务管理器来观察。
可以看到,每一个进程都对应了一个应用程序,并占据了一定的系统资源,当我们点开带有箭头的线程还能看到进程下有许多线程存在。
进程是如何产生的?
当应用程序(.exe文件)运行后,系统就会生成一个进程,并为它分配所需的系统资源。如内存资源,其内部加载了exe文件中的指令和数据等(程序运行起来就是在执行指令)。
产生的进程会被系统描述并以数据结构进行管理,上面我们在任务管理器中看到的就是其中一部分信息。
系统眼中的进程是什么样的?
计算机想要管理任何事物,都需要将其抽象成一组有关联、互为一体的数据。所以系统对进程的采取的措施是“先描述,再管理”的策略。
其中描述线程的是PCB(进程控制块抽象),PCB囊括了进程的相关信息,是一种结构体。
而后PCB被以数据结构的形式组织起来,从而达到管理的目的,可以认为这种数据结构是一种链表。
进程所分配到的内存资源(其内存储指令、数据等)信息仅仅是PCB的一部分,PCB包含如下几个属性:
1.pid | 进程标识符 |
2.内存指针 | 进程持有的内存资源 |
3.文件描述符表 | 进程持有的硬盘资源 |
4.状态 | 这些用来完成’‘进程调度”, 和进程持有的CPU资源密切相关 |
5.优先级 | |
6.上下文 | |
7.记账信息 |
好了,了解完进程的概念,我们再来回归主题,聊聊进程调度到底是怎么个事吧ヾ(≧▽≦*)o
进程调度
进程调度的原因
从任务管理器界面我们可以看到相当多的进程,而进程的执行是需要消耗CPU资源的。我们常见的CPU很多是8核16线程,通常情况下其数量是无法支撑这么多进程同时执行的,这就需要进程们在CPU上轮流执行(分时复用)。
当然,只要轮流速度够快,进程们在直观上也和同时运行差不多了。
所以进行进程调度的根本原因在于:CPU核心数量太少,进程数量太多。
进程调度的模式
进程调度有两种模式,“并发”和“并行”,系统会将两种模式搭配使用,来执行所有进程。
并发指,进程在CPU上分时复用(时间片),轮番执行,由于执行速度够快,所以看起来和进程同时执行一样。当然,这只是一种直观上的感觉。
并行指,进程并非轮番上阵,一个CPU核心执行,同时只运行一个进程。这种情况下,无论是微观还是宏观上进程都是同时执行的。
无论是并发还是并行,我们肉眼都是无法直接观测出来的,因此,并发和并行往往统称为“并发”,并把编写解决并发问题的程序,称为“并发编程”。
支持进程调度的属性
在并发情况下,我们知道进程是轮番执行的,但每个进程执行多长时间,进程轮流执行的顺序该如何确定又是一个问题。为了解决这点,就有了以下几个支持进程调度的属性来作为进程调度的依据。
状态
线程根据能不能到CPU上去执行可以划分出两种状态,即“就绪状态”和“阻塞状态”。例如偶尔程序会出现等待IO(读写)的时候,这时候IO未完成程序是不会向下执行的,陷入阻塞,这时候让他占用CPU资源是很不合理的。因此,判断进程是否是就绪状态是相当重要的。
就绪状态:进程随时能上CPU上执行,或是已经在CPU上执行。
阻塞状态:进程缺少一定条件,无法上继续执行。
优先级
根据不同需要,决定对那些线程优先进行资源分配。
如我们在玩游戏是,希望对游戏分配更多的系统资源,以获得更好的游戏体验。
上下文
类似于存档。并发执行下,进程在CPU上执行过程中会产生很多“中间结果”,在切换出CPU之前,就需要把这些中间结果(CPU中各种寄存器中的值)保存到PCB的上下文之中(寄存器->内存),方便下次进程回到CPU继续执行(方便恢复)。
(其中有个pc程序计数器就记录了上次执行到了那一条指令)
上下文:用于保存进程执行状态。
记账信息
进程优先级决定了资源的倾斜程度,为避免有些进程一直得不到CPU资源,对记账信息中资源分配少的进程适当的多分配一些。
完……
博主是Java新人,每位同志的支持都会给博主莫大的动力,欢迎留言讨论,如果有任何疑问,或者发现了任何错误,都欢迎大家在评论区交流“ψ(`∇´)ψ