文章目录
- 💐什么叫做进程
- 💐进程在系统中是如何进行管理的
- 💐PCB中一些比较重要的属性
- 💐进程持有的CPU资源——进程调度
- 💐内存分配——内存管理
💐什么叫做进程
进程概念:一个已经跑起来的程序就叫做进程;比如你正在使用微信聊天,微信正在运行,这就是一个进程,一个单一的软件不能称为进程
每个进程要想运行,就会消耗一定的系统资源,有的会消耗cpu,有的会消耗内存,有的会消耗磁盘….等等;
每一个进程在执行时,操作系统都会为每一个进程分配资源,而每一个进程所持有的资源都是独立的,不会产生多个进程共享资源的情况;举个例子:
比如:我们去银行办理个人业务时,每个人都会有一个专属的业务员为你服务,你就可以进行取钱等等一系列的操作,这就相当于一个人就是一个进程,每个专属的业务员就是分配的资源;所以就不会出现一个业务员同时为两个人服务的情况,这样,你自己的个人隐私不久全都曝光了么,这样就像多个进程不会共享同一个份资源一样
所以,每一个进程都是系统资源分配的基本单位,什么意思呢?就像在疫情期间,政府为每个家庭发放蔬菜,每个家庭所得到的蔬菜都是一样的,而资源就像是蔬菜,需要给每一个进程分配;在打开一台电脑后,并不是只有几个进程,而是会有上百个进程在运行,那么,既然有这么多进程,操作系统是如何管理的呢?
💐进程在系统中是如何进行管理的
只有某个东西非常多时才会进行管理,如果只有一个两个东西,那么也就不会去考虑管理了,而管理主要从两个角度进行:
1.描述:使用类或结构体,把被管理的一个对象的各个属性都表示出来; 意思就是:你要管理某一个对象,肯定是要管理这个对象里的具体东西,所以就需要把被管理对象中的各个部分给描述出来;
2.组织:使用数据结构把这些表示出来的对象串接起来,为了后序的增删查改
既然要先进行描述,那么在操作系统中会有一个专门的结构体
描述进程的属性,这里为什么要作结构体而不叫做类呢?因为操作系统的内核是由C/C++写的,这个结构体称为“进程控制块”PCB;
使用PCB表述进程属性:一个进程可以使用一个或多个PCB表示 ,系统中会使用类似于双向链表这样的数据结构来组织多个PCB,而创建新的进程就是创建PCB,并且插入到链表中,销毁进程就是把PCB从链表中删除,展示进程列表就相当于遍历链表中的每一个节点;
既然PCB是用来描述进程的许多属性,那么下面就介绍几种比较重要的属性:
💐PCB中一些比较重要的属性
**1.pid:**进程的身份标识,每个进程都会有一个pid,同一时刻,不同进程间的pid是不同的;
2.内存指针(进程持有的内存资源)
因为在程序运行时,会产生大量的的数据,而这些数据都需要保存起来,所以每一个进程在运行的时候,都会分配一定的内存空间,但是这个进程的内存空间具体是在哪里?以及分配的内存空间中都保存了哪些部分?每一个部分都是干啥的?此时就会有一组指针进行区分;
比如:在进程的内存空间中,需要有一部分区域存储要执行的指令,一部分区域存储指令依赖的数据,一部分区域存储一些运行时产生的临时数据;所以就会有一组内存指针来区分;
3.文件描述符表(进程持有的硬盘资源)
因为文件都是存储在硬盘上面的,而我们对硬盘的操作时并不是直接操作硬盘的,在代码方面,我们其实是通过操作文件来使用硬盘的,在硬件方面就称为了操作硬盘。
一个进程也需要涉及到硬盘,所以就需要按照文件的方式向硬盘中写入和读出,所以当前进程关联了哪些文件,都能操作哪些文件,就是通过文件描述符表,近而就描述了进程持有了哪些“硬盘资源”
💐进程持有的CPU资源——进程调度
首先,先理解什么是进程的调度?
早期的操作系统,是一个“单任务操作系统”(单核CPU),同一时刻只能有一个进程运行,如果想要运行下一个进程,就需要先退出上一个进程,,而进程要执行,就是需要CPU来执行上面的指令,但是对于单核CPU来说,一个CPU核心,同一时刻只能执行同一个进程的指令,这里也可以进行一个比喻,把CPU核心比喻一个舞台,进程比喻成一个演员,指令比喻成剧本,一个演员在讲台上讲课时,其他演员不能去干扰;这样就导致了一个舞台只能有一个演员;
但是,在这种情况下想要让多个任务同时执行该怎么办呢?就有了分时复用(并发)
分时复用**(并发)**:分时复用是站在了时间的维度上进行的,比如在剧本中有很多的“幕”,就像老舍先生的茶馆,一个演员演一幕,让所有的演员轮流上台表演,只要轮流的速度足够快,这也就看起来好像同时在表演一样,
可以打开我们自己的资源管理器看一下:
3.74GHz可以大概理解成每秒执行3亿多条指令,调度的速度也已经够快了,足够许多进程进行调度了,因为这里的速度够快,所以人感知不到这里调度之间的时间差;
所以,站在宏观的的角度上看,两个进度好像是“同时执行”的,但是,在微观的角度上,两个进程是轮流调度执行的;
现在电脑的CPU都已经是多核心的,就相当于有很多个舞台,就像我这台电脑就是有4个
所以,两个进程可以在两个或着多个CPU核心上同时执行,在微观的角度,两个进程是同时执行的,这种情况称为“并行”
相比之下,多个进程在一个CPU核心上快速的轮流调度执行,在宏观上,它们是“同时执行的”, 在微观上,有先后顺序,这种情况称为“并发”
上述的并发 和 并行 在程序员写代码的时候是感知不到的,都是系统内部在执行,底层是并行还是并发,对代码都没有什么区别的影响,所以程序员不用去区分那么细,一般只要没有什么特殊的说明的话,就会将并行+并发 统称为并发;
在目前多核CPU的时代,并发编程是非常重要的,而为了完成进程的调度,PCB中引入了一些属性来支持操作系统实现进程调度的效果,以下有四个重要属性:
1. 进程的状态
进程的状态这里主要针对两种重要的状态进行讲解分别是:就绪状态、阻塞状态
1、就绪状态:
这里给大家举一个例子:假设我是一个妹子,现在呢有三个同学正在追我,分别是 A同学:有钱、B同学:长得帅、C同学:会舔,但是呢,这三个人都有各自的优点,而我都想要,所以呢,我就同时脚踏三只船,周一、周二和A同学约会,周三、周四和B同学约会,周五和C同学约会,而且,默认情况下这三个同学都是随叫随到,呼之即来挥之即去;这种情况称为“就绪状态”,进程时刻准备好,去CPU上执行;
就绪状态,具体有两种情况:
1进程正在CPU上执行(今天周一,我正在和A约会)
2.虽然进程没在CPU上执行,但是时刻准备着去CPU上执行(今天周一,我没和B约会,但是只要我召唤B,B也会马上来)
2、阻塞状态
某个进程由于某种条件不具备(比如在等待用户输入等),就导致这个进程暂时无法参与CPU的调度执行;
例如:有一天A要去出差一个月,显然这段时间A同学没办法和我约会,此时A就处于“阻塞状态”
2.进程的优先级
操作系统在调度很多的进程时,并不是一视同仁的,而是有些进程会给更高的优先级,优先调度,假如 我现在正在玩英雄联盟和运行着QQ,那么,英雄联盟的优先级要高于QQ,因为对于游戏来讲,我们需要一个系统实时的快速响应,但是QQ呢,只需要将它挂在后台收消息即可,晚收个一两秒也没什么关系,但是,如果打游戏放技能晚个一两秒,那么这游戏就没办法玩了;
3.进程的上下文
进程从CPU上离开之前,需要保存现场,把当前CPU中各中寄存器的状态都记录到内存中,等到下次进程回到CPU上执行的时候,此时就会把内存中这些保存的只恢复回去,进程就会沿着上次执行到的位置继续往后执行,其实也就像我们玩单机游戏时的存档、读档
4.进程的记账信息
通过优先级机制,对不同的进程分配了不同权重的资源,但是,有可能出现极端的情况,所有的资源都给了某一个进程,其他的进程一点也没得到,所以就会有记账信息来记录当前进程持有的CPU的情况(在CPU执行了多久)就可以作为操作系统调度进程的参考依据,如果监测到某个进程所持有的CPU资源较少,操作系统就会进行调整,防止某个进程出现卡死情况;
以上只是PCB中一些重要的属性,但是PCB中的属性远不止这些,以上四种属性主要是为了完成进程的调度;
💐内存分配——内存管理
在早期的系统上,程序运行时分配的内存是”物理内存“;
物理内存就可以理解成由几个宿舍楼组成,每个宿舍楼都有一个编号,每个编号就是一个内存地址,所谓的分配内存就是直接从物理内存上直接分配,但是就会导致一个问题—内存访问越界问题:
为了避免上述情况,操作系统就引入了 **“虚拟地址空间”**的概念,操作系统不是直接分配物理内存了,而先分配了虚拟的内存空间,这就相当于系统对内存进行了一层抽象,什么意思呢?就比如:进程在操作硬盘时,并不能直接对硬盘进行操作,而是通过对文件的操作变成对硬盘的操作,而文件就是对硬盘这种硬件设备的一种抽象;
同理,使用虚拟地址空间对物理空间进行了一层抽象,通过对虚拟地址空间的操作从而转变成对物理空间的操作,而中间的转变步骤大致如下:
所以,借助于这种机制,就有效的避免了内存越界访问的情况;
通过上述方式,把进程之间给隔离开了,进程之间就无法互相访问,交互数据,但是,如果某个需求中,需要多个进程之间相互配合,那该怎么办呢?
此处就需要引入一个新的机制,来实现进程之间的相互通信,核心思想就是,借助一个公共的空间,完成数据的交互,就比如在疫情时,我们要买菜,通常给老板发一个微信,然后老板就把菜放到指定的区域,并不会直接送到家里,这个指定的区域就是一个公共的空间;