并发基础(二) 并发概念进程

进程概念

是程序的⼀次执⾏,是系统进⾏资源分配和调度的独⽴单位,每⼀个进程都有它⾃⼰的内存空间和系统资源

进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。程序是指令、数据及其组织形式的描述,进程是程序的实体。

一个进程就是一个正在执行程序的实例,包括程序计数器 寄存器和变量的当前值

1、进程与资源

在操作系统中维护着一张表格(一个结构数组),即进程表

注:任务管理器中的PID(Process Identification)是指进程识别号,也就是进程标识符。操作系统里每打开一个程序都会创建一个进程ID,即PID。

进程主要由三个部分组成:

1)进程控制块 PCB。包含如下几个部分:

  • 进程描述信息
  • 进程控制和管理信息
  • 资源分配清单
  • CPU 相关信息

2)数据段。即进程运行过程中各种数据(比如程序中定义的变量)

3)程序段。就是程序的代码(指令序列)

举个例子:同时挂三个 QQ 号,会对应三个 QQ 进程,它们的 PCB、数据段各不相同,但程序段的内容都是相同的 (都是运行着相同的 QQ 程序)

PCB 是提供给操作系统用的,而程序段、数据段是给进程自己用的。

进程控制块 PCB

每个进程有且仅有一个进程控制块(Process Control Block,PCB),或称进程描述符,它是进程存在的唯一标识 ,是操作系统用来记录和刻画进程状态及环境信息的数据结构,也是操作系统掌握进程的唯一资料结构和管理进程的主要依据。所以说 PCB 是提供给操作系统使用的。

通俗的解释:操作系统需要对各个进程进行管理,但凡管理时所需要的信息,都会被放在 PCB 中,PCB 是进程存在的唯一标志。创建进程和撤销进程等都是指对 PCB 的操作,当进程被创建时,操作系统为其创建 PCB,当进程结束时,会回收其 PCB。

一般来说,PCB 会包含如下四类信息:

1)进程描述信息:用来让操作系统区分各个进程

  • 当进程被创建时,操作系统会为该进程分配一个唯一的、不重复的 "身份证号"--- PID(ProcessID,进程 ID)
  • 另外,进程描述信息还包含进程所属的用户 ID(UID

2)进程控制和管理信息:记录进程的运行情况。比如 CPU 的使用时间、磁盘使用情况、网络流量使用情况等。

3)资源分配清单:记录给进程分配了哪些资源。比如分配了多少内存、正在使用哪些 I/O 设备、正在使用哪些文件等。

4)CPU 相关信息 :进程在让出 CPU 时,必须保存该进程在 CPU 中的各种信息,比如各种寄存器的值。用于实现进程切换,确保这个进程再次运行的时候恢复 CPU 现场,从断点处继续执行。这就是所谓的保存现场信息

2、进程的状态

尽管每一个进程都是独立的实体,有其自己的 PCB 和内部状态,但是进程之间经常需要相互作用。一个进程的输出结果可能是另一个进程的输入。假设进程 A 的输入依赖进程 B 的输出,那么在进程 B 的输出结果没有出来之前,进程 A 就无法执行,它就会被阻塞。这就是进程的阻塞态。

经典的进程三态模型如下:

  • 运行态(running):进程占有 CPU 正在运行。
  • 就绪态(ready):进程具备运行条件,等待系统分配 CPU 以便运行。
  • 阻塞态 / 等待态(wait):进程不具备运行条件,正在等待某个事件的完成。

上图中的时间片用完,可以这样理解:

进程是并发执行的嘛,宏观上在一段时间内能同时运行多个程序,但其实微观上是交替发生的。也就是说 CPU 一般不会让一个进程一次性执行完,为了保证所有进程可以得到公平调度,CPU 时间被划分为一段段的时间片,这些时间片再被轮流分配给各个进程。某个进程的时间片用完后这个进程就会进入就绪态,而其他被分配到时间片的进程就会进入运行态。这个处于就绪态的进程就需要等待进程调度程序的下一次调度,为其分配 CPU 时间片后才能再次恢复运行。

需要注意的是:阻塞态是由于缺少需要的资源从而由运行态转换而来,但是该资源不包括 CPU 时间片,缺少 CPU 时间片会从运行态转换为就绪态

很多系统中都增加了新建态(new)和终止态(exit),形成五态模型

  • 新建态(new):进程正在被创建时的状态
  • 终止态(exit):进程正在从系统中消失时的状态

从上图可以发现,只有就绪态和运行态可以相互转换,其它的都是单向转换

这些不同状态的进程操作系统是如何进行管理的呢?上文说过,PCB 是提供给操作系统使用的,是操作系统管理进程的主要依据。没错,操作就是通过 PCB 来管理这些拥有不同状态的进程的。

进程的 PCB 会通过某种方式组织起来,一般来说,操作系统会把处于同一状态的所有进程的 PCB 链接在一起,这种数据结构就称为进程队列(Process Queue)。

3、进程控制

所谓进程控制就是对系统中的所有进程实施有效的管理,实现进程状态转换 功能。包括创建进程、阻塞进程、唤醒进程、终止进程等,这些功能均由原语来实现,操作系统通过原语来完成进程原理,包括进程的同步和互斥、进程的通信和管理。

什么是原语 ?原语是一种特殊的程序,它的执行具有原子性。 也就是说,这段程序的运行必须一气呵成,不可中断。原语是操作系统内核里的一段程序:

思考一下:为什么进程控制(进程状态转换)的过程要一气呵成,不可中断?

答:如果进程状态转换的过程不能一气呵成,就有可能导致操作系统中的某些关键数据结构信息不统一,这会影响操作系统进行别的管理工作。

4、进程的创建

操作系统初始启动时会创建承担系统资源分配和控制管理的一些系统进程,同时还会创建一个所有用户进程的祖先,其他用户进程是在应用程序运行时创建的。

操作系统允许一个进程创建另一个进程,而且允许子进程继承父进程所拥有的资源,当子进程被终止时,其在父进程处继承的资源应当还给父进程。同时,终止父进程时同时也会终止其所有的子进程。

创建进程的过程,也就是创建原语包含的内容如下:

  • 在进程列表中增加一项,从 PCB 池中申请一个空闲的 PCB(PCB 是有限的,若申请失败则创建失败),为新进程分配一个唯一的进程标识符;
  • 为新进程分配地址空间,由进程管理程序确定加载至进程地址空间中的程序;
  • 为新进程分配各种资源;
  • 初始化 PCB,如进程标识符、CPU 初始状态等;
  • 把新进程的状态设置为就绪态,并将其移入就绪队列,等待被调度运行。

什么事件会触发进程的创建呢?有如下四种情况:

  • 用户登录:分时系统中,用户登录成功,系统会为其建立一个新的进程
  • 作业调度:多道批处理系统中,有新的作业放入内存中,会为其建立一个新的进程
  • 提供服务:用户向操作系统提出某些请求时,会新建一个进程处理该请求
  • 应用请求:由用户进程主动请求创建一个子进程

5、进程的终止

进程的终止也称为撤销,进程完成特定工作或出现严重错误后必须被终止。引起进程终止的事件有三种:

  • 正常结束:进程自己请求终止(exit 系统调用)
  • 异常结束:比如整数除 0,非法使用特权指令,然后被操作系统强行终止
  • 外界干预:Ctrl + Alt + delete 打开进程管理器,用户手动杀死进程

终止(撤销)进程的过程,也就是撤销原语包含的内容如下:

  • 从 PCB 集合中找到终止进程的 PCB;
  • 若进程处于运行态,则立即剥夺其 CPU,终止该进程的执行,然后将 CPU 资源分配给其他进程;
  • 如果其还有子进程,则应将其所有子进程终止;
  • 将该进程所拥有的全部资源都归还给父进程或操作系统;
  • 回收 PCB 并将其归还至 PCB 池。

进程的阻塞和唤醒

进程阻塞是指进程让出 CPU 资源转而等待一个事件,如等待资源、等待 I/O 操作完成等。进程通常使用阻塞原语来阻塞自己,所以阻塞是进程的自主行为,是一个同步事件。当等待事件完成时会产生一个中断,激活操作系统,在系统的控制下将被阻塞的进程唤醒,也就是唤醒原语。

进程的阻塞和唤醒显然是由进程切换来完成的。

进程的阻塞步骤,也就是阻塞原语的内容为:

  • 找到将要被阻塞的进程对应的 PCB;
  • 保护进程运行现场,将 PCB 状态信息设置为阻塞态,暂时停止进程运行;
  • 将该 PCB 插入相应事件的阻塞队列(等待队列)。

进程的唤醒步骤,也就是唤醒原语的内容为:

  • 在该事件的阻塞队列中找到相应进程的 PCB;
  • 将该 PCB 从阻塞队列中移出,并将进程的状态设置为就绪态;
  • 把该 PCB 插入到就绪队列中,等待被调度程序调度。

阻塞原语和唤醒原语的作用正好相反,阻塞原语使得进程从运行态转为阻塞态,而唤醒原语使得进程从阻塞态转为就绪态 。如果某个进程使用阻塞原语来阻塞自己,那么他就必须使用唤醒原语来唤醒自己,因何事阻塞,就由何事唤醒,否则被阻塞的进程将永远处于阻塞态。因此,阻塞原语和唤醒原语是成对出现的

6、进程上下文切换

所谓进程的上下文切换,就是说各个进程之间是共享 CPU 资源的,不可能一个进程永远占用着 CPU 资源,不同的时候进程之间需要切换,使得不同的进程被分配 CPU 资源,这个过程就是进程的上下文切换,一个进程切换到另一个进程运行

因为进程是由内核进行管理和调度的,所以进程的上下文切换一定发生在内核态

进程上下文的切换也是一个原语操作,称为切换原语,其内容如下:

  • 首先,将进程 A 的运行环境信息存入 PCB,这个运行环境信息就是进程的上下文(Context)
  • 然后,将 PCB 移入相应的进程队列;
  • 选择另一个进程 B 进行执行,并更新其 PCB 中的状态为运行态
  • 当进程 A 被恢复运行的时候,根据它的 PCB 恢复进程 A 所需的运行环境

引起进程上下文切换的事件,也就是某个占用 CPU 资源运行的当前进程被赶出 CPU 的原因有如下:

  • 当前进程的时间片到
  • 有更高优先级的进程到达
  • 当前进程主动阻塞
  • 当前进程终止

进程具有的特征:

  • 动态性:进程是程序的一次执行过程,是临时的,有生命期的,是动态产生,动态消亡的
  • 并发性:任何进程都可以同其他进行一起并发执行
  • 独立性:进程是系统进行资源分配和调度的一个独立单位
  • 结构性:进程由程序,数据和进程控制块三部分组成

我们经常使用windows系统,经常会看见.exe后缀的文件,双击这个.exe文件的时候,这个文件中的指令就会被系统加载,那么我们就能得到一个关于这个.exe程序的进程。进程是的,或者说是正在被执行的。

相关推荐
ai小鬼头5 小时前
Ollama+OpenWeb最新版0.42+0.3.35一键安装教程,轻松搞定AI模型部署
后端·架构·github
萧曵 丶6 小时前
Rust 所有权系统:深入浅出指南
开发语言·后端·rust
老任与码6 小时前
Spring AI Alibaba(1)——基本使用
java·人工智能·后端·springaialibaba
华子w9089258597 小时前
基于 SpringBoot+VueJS 的农产品研究报告管理系统设计与实现
vue.js·spring boot·后端
星辰离彬7 小时前
Java 与 MySQL 性能优化:Java应用中MySQL慢SQL诊断与优化实战
java·后端·sql·mysql·性能优化
GetcharZp9 小时前
彻底告别数据焦虑!这款开源神器 RustDesk,让你自建一个比向日葵、ToDesk 更安全的远程桌面
后端·rust
jack_yin10 小时前
Telegram DeepSeek Bot 管理平台 发布啦!
后端
小码编匠10 小时前
C# 上位机开发怎么学?给自动化工程师的建议
后端·c#·.net
库森学长10 小时前
面试官:发生OOM后,JVM还能运行吗?
jvm·后端·面试
转转技术团队10 小时前
二奢仓店的静默打印代理实现
java·后端