1、进程(Process)
1.1、什么是进程?
一个程序,运行起来(跑起来),在操作系统中就会出现一个相应的进程。即进程,就是一个跑起来的应用程序.
若想要一个程序运行,就必须得给这个进程分配系统资源。如图显示,若要Microsoft Edge运行,该进程所占用的系统资源。
结论:进程是操作系统对一个正在运行的程序的一种抽象。换言之,可以把进程看做程序的一次运行过程;
同时,在操作系统内部,进程又是操作系统进行资源分配的基本单位(即操作系统是以进程为单位分配资源的)。
2、进程控制块(PCB Process Control Block)
2.1、什么是进程控制块(PCB)?
在操作系统上,包含了很多进程,东西一旦多了,就需要考虑管理,即操作系统要管理这些进程,对于“管理”这件事情,通用做法就是先描述,再组织
先描述:通过一些结构体/类,把一个进程的核心信息抽象提取出来,并进行表示。
再组织:通过一定的数据结构,把多个这样的结构体/类的对象串起来,方便进一步的增删改查。
结论:计算机内部要管理任何现实事物,都需要将其抽象成一组有关联的、互为一体的数据。在 Java 语言中,我们可以通过类/对象来描述这一特征。这样,每一个 PCB 对象,就代表着一个实实在在运行着的程序,也就是进程。操作系统再通过这种数据结构,例如线性表、搜索树等将 PCB 对象组织起来,方便管理时进行增删查改的操作。
2.2、进程控制块(PCB)三大要素
①pid
进程的id或进程的标识符。
同一个机器,同一时刻,进程的id一定是不同的。
②内存指针
进程运行时,需要消耗一定的硬件资源,内存就是这样一个关键的资源。
③文件描述符
一个进程运行的时候,会操作一些文件,就通过一个叫“顺序表”这样的数据结构,记录下当前这个进程,都打开了那些文件。
3、进程调度(Process Scheduling)
3.1、为什么要进程调度
在当前计算机中,CPU内存是有限的,但进程数量是比较多的,经常会出现“进程多、而核心数少”的情况,而操作系统要做的,就是尽可能公平的让每一个进程都有运行的机会,这就需要进程调度。
3.2、什么是进程调度
像现在的计算机是8核16线程,有16个逻辑处理器,当面对100个进程时,就需要进程调度来负责,即采用“分时复用”技术。
操作系统对CPU资源的分配,采用的是时间模式 —— 不同的进程在不同的时间段去使用 CPU 资源。
3.3、进程调度的基本过程
①并行执行
一个核心,同一时刻,只能运行一个进程。
当有16个核心,同一时刻,就可以同时运行16个进程。
这种微观时间上,完全同时执行的操作:并行执行
②并发执行
CPU把总的执行时间,切换成若干个小的片段,每个片段执行一个进程,每个片段被称为“时间片”。
由于时间片比较短,CPU切换进程的速度极快,普通人无法感知到,所以在人看来,这若干个进程在同时进行,
这种宏观时间上,同时执行,微观时间上,串行执行的操作:并发执行。
“并行”和“并发”统称为“并发”,把编写解决并发问题的程序又称为“并发程序”。
操作系统会按照 并行 + 并发 相互搭配的形式,运行所有进程。