进程基础知识(什么是进程?什么是 pid/内存指针/文件描述符表?以及进程的状态,进程的优先级,进程的记账信息,进程的上下文,虚拟地址空间等等)

💐什么叫做进程

进程概念:一个已经跑起来的程序就叫做进程,比如你正在使用微信聊天,微信正在运行,这就是一个进程,注意:一个单一的软件不能称为进程。

每个进程在运行时运行,就会消耗一定的系统资源,有的会消耗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. 进程的状

进程的状态这里主要针对两种重要的状态进行讲解分别是:就绪状态阻塞状态

就绪状态:

这里给大家举一个例子:假设我是一个妹子,现在呢有三个同学正在追我,分别是 A同学:有钱、B同学:长得帅、C同学:会舔,这三个人都有各自的优点,但是呢我都想要,所以,我就同时脚踏三只船,周一、周二和A同学约会,周三、周四和B同学约会,周五和C同学约会,而且,默认情况下这三个同学都是随叫随到,呼之即来挥之即去;这种情况称为“就绪状态”,进程时刻准备好,去CPU上执行;

就绪状态,具体有两种情况:

  • 进程正在CPU上执行(今天周一,我正在和A约会)
  • 虽然进程没在CPU上执行,但是时刻准备着去CPU上执行(今天周一,我没和B约会,但是只要我召唤B,B也会马上来)

阻塞状态

某个进程由于某种条件不具备(比如在等待用户输入等),就导致这个进程暂时无法参与CPU的调度执行;

例如:有一天A要去出差一个月,显然这段时间A同学没办法和我约会,此时A就处于“阻塞状态”

2.进程的优先级

操作系统在调度很多的进程时,并不是一视同仁的,而是有些进程会给更高的优先级进行优先调度,假如 我现在正在玩英雄联盟和运行着QQ,那么,英雄联盟的优先级要高于QQ,因为对于游戏来讲,我们需要一个系统实时的快速响应,但是QQ呢,只需要将它挂在后台收消息即可,晚收个一两秒也没什么关系,但是,如果打游戏放技能晚个一两秒,那么这游戏就没办法玩了;

3.进程的上下文

进程从CPU上离开之前,需要保存现场,把当前CPU中各中寄存器的状态都记录到内存中等到下次进程回到CPU上执行的时候,此时就会把内存中这些保存的这些记录恢复回去,进程就会沿着上次执行到的位置继续往后执行,其实也就像我们玩单机游戏时的存档、读档

4.进程的记账信息

通过优先级机制,对不同的进程分配了不同权重的资源,但是,有可能出现极端的情况,所有的资源都给了某一个进程,其他的进程一点也没得到,所以就会有记账信息来记录当前进程持有的CPU的情况(在CPU执行了多久)就可以作为操作系统调度进程的参考依据,如果监测到某个进程所持有的CPU资源较少,操作系统就会进行调整,防止某个进程出现卡死情况;

以上只是PCB中一些重要的属性,但是PCB中的属性远不止这些,以上四种属性主要是为了完成进程的调度;

💐内存分配——内存管理

在早期的系统上,程序运行时分配的内存是”物理内存“;

在这里插入图片描述

物理内存就可以理解成由几个宿舍楼组成,每个宿舍楼都有一个编号,每个编号就是一个内存地址,所谓的分配内存就是直接从物理内存上直接分配,但是就会导致一个问题—内存访问越界问题:

在这里插入图片描述

为了避免上述情况,操作系统就引入了 **“虚拟地址空间”**的概念,操作系统不是直接分配物理内存了,而先分配了虚拟的内存空间,这就相当于系统对内存进行了一层抽象,什么意思呢?就比如:进程在操作硬盘时,并不能直接对硬盘进行操作,而是通过对文件的操作变成对硬盘的操作,而文件就是对硬盘这种硬件设备的一种抽象;

同理,使用虚拟地址空间对物理空间进行了一层抽象,通过对虚拟地址空间的操作从而转变成对物理空间的操作,而中间的转变步骤大致如下:

在这里插入图片描述

所以,借助于这种机制,就有效的避免了内存越界访问的情况;

通过上述方式,把进程之间给隔离开了,进程之间就无法互相访问,交互数据,但是,如果某个需求中,需要多个进程之间相互配合,那该怎么办呢?

此处就需要引入一个新的机制,来实现进程之间的相互通信,核心思想就是,借助一个公共的空间,完成数据的交互,就比如在疫情时,我们要买菜,通常给老板发一个微信,然后老板就把菜放到指定的区域,并不会直接送到家里,这个指定的区域就是一个公共的空间;

怎么办呢?

此处就需要引入一个新的机制,来实现进程之间的相互通信,核心思想就是,借助一个公共的空间,完成数据的交互,就比如在疫情时,我们要买菜,通常给老板发一个微信,然后老板就把菜放到指定的区域,并不会直接送到家里,这个指定的区域就是一个公共的空间;

  • 17
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值