进程(Process)是计算机中正在执行的一个程序实例。进程是操作系统进行资源分配和调度的基本单位,每个进程都拥有独立的内存空间、程序计数器、栈、寄存器和其他系统资源,它们之间互相独立,互不干扰。一个进程可以包含多个线程,这些线程共享进程的资源。
在操作系统中,进程的创建、撤销、调度和同步等操作都由操作系统内核负责。当操作系统启动一个程序时,会为其创建一个进程,并为该进程分配一定的系统资源。进程可以处于运行、就绪、阻塞等不同的状态,操作系统根据进程的状态和优先级来调度进程的执行,保证系统资源的合理利用和各个进程的公平竞争。进程还可以通过进程间通信机制进行数据交换和协作.
如果我们觉得进程不好解释的话,我们就换个思路来说,大家都玩过电脑吧,大家都在电脑上打过游戏之类的吧,你打开的每一个游戏,或者说,每一个应用就是一个进程.
当然了,我们打开应用的时候,自然这个进程会有啥特征,这也是在所难免的,接下来我们可以来介绍一下这些特征,这可能有些枯燥,但是大家可以先看看,别太担心,其实没有什么大不了的.
针对进程的特征,有一个特征,我们得好好的去解释解释,就是并发性,为什么我们要去讨论一下并发呢?因为还有另外一个词语并行.
并行:
同一时刻,两个核心,同时执行两个进程.此时这俩进程就是并行执行的~~
并发:
一个核心,先执行进程1,执行一会之后,再去执行进程2,再执行一会之后,再去执行进程.此时只要这里的切换速度足够快,看起来,进程123就是“同时”执行
此时,虽然咱们只有16个核心,也可以同时执行142个任务了通过并发+并行的方式来完成
我还是举个例子:
假设有一个园丁在花园里工作。他有多个任务需要完成,如修剪草坪、浇水、除草等等。这个园丁可以采用两种方式来完成这些任务:并行和并发。
如果园丁采用并行的方式,他会同时进行多项任务。比如,他可以在修剪草坪的同时浇水或者除草,这样可以更快地完成任务。这就好比园丁拥有多双手,能够同时处理多个任务,从而提高效率。这就是并行。
如果园丁采用并发的方式,他会交替地执行多项任务。比如,他可以先修剪草坪,然后浇水,再去除草。虽然这些任务不能同时进行,但是园丁可以在不同任务之间快速切换,以达到同时处理多个任务的效果。这就好比园丁只有一双手,但是能够快速地在多个任务之间切换,从而提高效率。这就是并发。
因此,可以将并行理解为同时进行多个任务,而并发则是交替执行多个任务。在实际的计算机系统中,这两种方式也有类似的应用。例如,多核处理器可以同时执行多个任务来提高效率,这就是并行;而单核处理器也可以采用时间片轮转的方式交替执行多个任务,实现并发。
就绪态(Ready):指进程已经准备好运行,但是还未分配到CPU资源。就绪态的进程会排队等待CPU调度。
运行态(Running):指进程正在执行,占用CPU资源。在同一时刻,只能有一个进程处于运行态。
阻塞态(Blocked):指进程因为某些原因,如等待I/O操作完成或等待资源的分配等,暂时不能继续执行,需要等待某些事件的发生。阻塞态的进程会被放入阻塞队列中,等待事件发生后再重新进入就绪态
其实我们这里对进程的了解不是很深,只是简单的出入了解一下,所为进程的管理,自然就是进程多了,我们就需要进行管理,我们把进程的管理,简单的分为了俩个步骤:
1.描述一个进程:使用及结构体类,把一个进程有哪些信息表述出来.
2.组织这些进程:使用数据结构,把这些结构体对象放到一起.
这就是进程的管理的大概思路,不过为了尽可能的描述进程管理,我们就要引入另外一个定义,PCB,大家看到这个东西,是不是又很懵逼了,不过不要着急,我们为了更系统的描述进程的管理的描述,操作系统专门定义了一个数据结构,自然就是PCB了.接下来就让我们来看看这个数据结构是个怎么回事,我们肯定是介绍不完的,我们大概介绍一下,就行了.
PCB 存储了操作系统对进程的管理和控制所需的所有信息,包括进程的标识符、状态、优先级、内存地址、寄存器、资源需求、父子关系等。每个进程都有一个对应的 PCB,在进程创建时由操作系统分配和初始化。
当操作系统需要对进程进行管理和控制时,通过 PCB 来访问进程的相关信息。例如,当进程从就绪态转换到运行态时,操作系统需要从就绪队列中选择一个进程,将其对应的 PCB 加载到 CPU 中,并恢复进程的上下文信息,使其可以继续执行。
PCB 的使用使得操作系统能够高效地管理和控制多个进程的运行,实现资源的合理分配和公平竞争。同时,PCB 的信息也为调试、监视和统计进程提供了必要的支持。
这个东西是什么呢,进程标识符号,简单来说,我们每一个人都有一个身份,自然每一个进程就有个标识符.
这个东西就是展示进程使用的是内存的哪一个地方.
比如,我拿文件举个例子
文件:比如硬盘上存储的数据,往往就是以文件为单位进行整理的~ 进程每次打开一个文件,就会产生一个“文件描述符”(标识了这个被打开的文件)一个进程可能会打开很多文件,对应了一组文件描述符.把这些文件描述符放到一个顺序表这样的结构里,就构成文件描述符表.
a)进程状态
记录进程当前的状态,例如就绪态、运行态、阻塞态等。
如果,你不好理解的话,我们可以举个例子,假设哈,这里有个人叫小明,他认识了很男生,每周给这三个小哥哥,安排,时间表假设,
A给我说,他要出差一个月
默认情况下,这三个小哥哥都是随叫随到,
我在排时间的时候就非常灵活.
于是A就相当于阻塞状态.B和C就是就绪状态
周一到周四,和B
周五周六和C周天继续放假
我这么举例子,大家就明白了吧,
b)进程的优先级
进程之间一定还是有先后顺序的,进程之间的调度也就不是公平的,我这里还是给大家用故事的形式,去给大家讲解,进程优先级.
在某个时刻,由于一些原因,工作量突然变得非常紧急,工厂的管理人员需要尽快完成这个任务,以便及时交付给客户。此时,管理人员要求工人 A 和 B 尽快完成这个任务,但是由于工人 B 技能不如 A,他的工作速度相对较慢,可能需要更长的时间来完成任务。
为了解决这个问题,管理人员可以通过提高工人 A 的优先级来确保他的工作被更快地执行。例如,管理人员可以让工人 A 的任务优先级比工人 B 更高,这样在资源紧张的情况下,系统会优先分配给工人 A 更多的资源(例如 CPU 时间),以确保他的工作能够及时完成。
通过提高进程优先级来分配更多的系统资源,可以确保重要的任务能够得到优先处理,同时也能够提高系统的性能和效率。但是,在设置进程优先级时,需要权衡不同进程的相对重要性和优先级,以避免低优先级进程被永久忽略。
c)进程的上下文
上下文,就是描述了当前进程执行到哪里这样的“存档记录"进程在离开CPU的时候就要把当前运行的中间结果,“存档”.
等到下次进程回来CPU上,再恢复之前的“存档",从上次的结果继续往后执行
我说完以后,如果还是理解的话,其实我们还是可以通过故事的方式去理解这个问题.
如果说,有一天,你认识了三个小哥哥,有一天,小哥哥A,说我带你去海南岛玩,然后你回答他,我准备一套性感的泳衣
小哥B给你讲,他妈妈最近要过生日了,你回答他说,那你准备一部手机给妈妈当做礼物.
但是过了一段时间以后,小哥哥A来问你准备好了吗?你回答我买好手机了,小哥哥B来问你,你准备好了吗?你回答说,你买了一套性感的泳衣,一旦这样回答,其实就是牛头不对马嘴.
为了避免上述穿帮的情况,我就需要在排时间表本本上记录一下:和他们都做了啥样的事情,有啥是需要进一步完成的
这个时候,我们就引入了进程上下文.,再来深入的理解什么是进程上下文.
所谓的上下文具体指就是进程运行过程中, CPU内部的一系列寄存器的值.
寄存器有很多种
其中最典型的作用
就是保存当前进程执行的中间结果
包括进程运行到哪一条指令
d)进程的记账信息
简单的解释就是下面这种解释.
统计了每个进程,在CPU上执行了多久了,可以作为调度的参考依据
我再来举个故事的例子,大家可以参考再考
比如,按照之前的优先级,每周只给C排一天时间
过了几个月之后,我就发现,C对我的态度逐渐冷淡了舔的也力不从心的~~
此时排查之前的时间表原来个C的时间太少了难怪感情就淡了
接下来的时间里给C多排点时间多给他尝点甜头,由不得他舔的不卖力[暂时]