CHS_01.2.1.1+2.1.3+进程的概念、组成、特征

CHS_01.2.1.1+2.1.3+进程的概念、组成、特征

从这个小节开始 我们会正式进入第二章处理机管理相关的内容

那么在这个小节当中 我们会首先来认识一个很重要的概念 叫做进程 在第一章的讲解当中 我们经常会说系统当中正在运行的程序怎么怎么地 怎么怎么地 偶尔也会提到进程这个术语

进程

进程和程序这两个概念其实是比较容易混淆不易理解的

那这个一会我们会介绍 接下来我们还会介绍一个进程 有哪些部分组成 有什么重要的特征

那首先来看第一个部分进程的概念

进程的概念

我们这次采用一个更贴近大家生活经验的一种方式来进行讲解

首先来看一下 我在我自己的windows电脑里打开了任务管理器 那任务管理器当中就可以看到此时系统当中正在运行的进程有这么多

那此时如果我想要使用qq的话 那我打开我的qq程序 于是我的这个qq程序就开始运行

那相应的 在进程这一栏里 我会看到一个和qq相关的这样的一个条目信息

而如果说此时我想要同时登录两个甚至三个qq号 那我可以再打开两次qq程序

那在这个时候 会发现进程这一栏里qq相关的条目出现了三条

也就是说 在系统当中 此时有三个qq进程正在运行

虽然说这三次我打开的都是qq.exe这个程序 但是这个程序的三次执行会对应三个不同的进程

如果大家的电脑现在就在身边的话 就可以自己动手看一下是不是这样的情况 所以 其实所谓的程序 它是一种静态的

存放在磁盘里的可执行文件 在windows电脑里就是qq.exe那么这个可执行文件其实就是一系列的指令集合

而指令的概念 我们在第一章当中讲解过 而所谓的进程 它是动态的

是程序的一次执行过程 也就是说 即使是同一个程序 它多次执行
那么每一次的执行都会对应一个不同的进程
就像我们在这个地方所看到的这样

所以用这个界面 大家应该能够很直观的体会到进程和程序他们的一个区别

进程的组成------PCB

那么接下来问题产生了 既然这三个进程执行的都是同一个程序
那么操作系统在背后要怎么区分这三个进程呢
不能把它们都叫做腾讯qq进程吧

所以 其实为了解决这个问题 操作系统在创建一个进程的时候 会给这个进程分配一个唯一的

不重复的id叫做p i d 也就是进程i d 它就相当于我们人类世界的身份证号 我们每个人的身份证号都是唯一的不重复的

而p i d就是进程的身份证号 那还是让大家看一个直观的例子 我现在正在录制视频 使用的是苹果的电脑

那苹果的电脑有一个叫做活动监视器的一个小工具 它和windows的那个

任务管理器其实是一样的 可以用这个小工具来看一下现在在我的

系统上正在运行的进程有哪些 那这些就是现在正在运行的进程

在这一溜可以看下有一个叫做pid 也就是进程id的一个属性

我们让这些进程根据p i d的递减的次序来排列 那可以看到各个进程的p i d 他们都是不重复的

那此时我来打开一个叫做typal的一个应用程序 当我打开这个应用程序之后

大家注意 观察这个地方 出现了和他相对应的一个进程的信息

它的p i d是2641那此时我再把这个

应用程序给退出 然后再一次打开

有没有发现他的p i d变成了2642

刚才是2641现在变成了2642所以这就能很好的说明一个问题

我们每一次新建一个进程 都会给他分配一个不重复的 唯一的id

在很多操作系统当中 pid的分配都是每一次加一这样的一个很简单的策略

哎 可以看到 现在系统在背后 他又自己创建了一个新的进程 虽然我不知道这个进程是干嘛的

但是他的p i d依然是递增的 所以其实回到刚才的这个图 虽然说这些进程 他们的进程的名称都叫腾讯qq32位

但是他们在背后都有各自的p i d 他们的p i d肯定是不重复的

那细心的同学可能会发现 除了pid之外 操作系统还会记录各个进程其他的一些信息

比如说他使用了多久的cpu时间 它是由哪个用户所创建的

还有一些各个进程对内存的使用信息 比如这个进程使用了745 7兆字节的

内存 另外 操作系统还会统计各个进程对磁盘的一个访问的情况

比如说这个进程 他向磁盘写入了3 45gb这么多的数据 而其他的进程对磁盘写入和读取的数据会少很多

那这些信息其实在我们的进程管理当中都是很有必要的 像这个进程 他经常往磁盘里写数据 所以这个进程肯定是一个需要经常访问磁盘的一个进程

那操作系统在对这些进程进行管理的时候 都可以根据这些进程的各自的特性来制定相应的策略

那还有 像最后的这一列 它是列出了各个进程的一个对网络流量的使用情况

所以 其实操作系统在背后 他不只是记录了各个进程的p i d

除了p i d之外 他还记录了各个进程的其他的一些信息 比如说刚才我们所看到的

他所属的用户id或者简称u i d 那操作系统可以根据pid uid这些基本的进程描述信息

来区分各个进程 还有刚才我们看到的分配了多少内存 正在使用哪些l设备正在使用哪些文件 这些信息的记录可以帮助操作系统

实现对系统资源的一个管理工作 另外呢 还有刚才我们看到的什么cpu使用时间 磁盘使用情况 网络流量使用情况等等

这些信息可以帮助操作系统实现对进程的控制和调度等等一系列的管理策略

进程的组成------PCB

那既然操作系统在背后要记录这么多的信息 那么这些信息都会被统一的放在一个叫做p c b的一个数据结构当中

他的英文缩写是process control block就是进程控制快 总之 操作系统他需要对各个并发运行的进程进行管理

而但凡他在管理这些进程的时候 所需要用到的信息都会放在这个

叫做p c b的数据结构 当中 所以p c b是一个很重要的数据结构

它是进程存在的唯一标志 当一个进程被创建的时候 操作系统也会为它创建相应的pcb

当然 这个p c b当中又包含了进程的p i d uid等等一系列的信息

而当一个进程结束的时候 操作系统就会回收它的p c b 那在p c b当中需要保存的信息大致上可以分为这样的四类

进程描述信息 进程控制和管理相关的信息 还有资源分配的情况
这三种类型的信息刚才我们都已经介绍过 除此之外 还会在pcb当中保留处理机相关的信息

只有在p c b当中保存了处理机相关的信息 才可以实现进程的切换工作

那这个坑我们先留着 之后再来填 接下来让大家看一个令人脑壳疼的东西

我在网上找到了linux的内核源码 然后在一个叫做shed.h这样的文件当中

我们就可以看到 在另一次操作系统当中 他定义的p c b长什么样子

在linux当中 他的pcb的名字叫做taskstruct 有兴趣的同学也可以大家去linux的官网下载一下他的源码来

看一下这个文件 那在这个taskstruct里边 他会记录各种各样的信息 比如说这个字段

state这个字段 它其实就是记录了进程当前的状态 它是处于旧序态呢 运行态呢 还是阻塞才能 等等

那进程的状态 这是我们下一个小节当中会展开介绍的内容 再来看这个字段

feels这个字段 它记录的是当前进程 它打开了哪些文件

然后还有一个叫做iocontact的字段 这个字段它记录的是io管理当中所需要使用的信息

当然 这个数据结构里面定义了好多好多字段 大家可以看一下 光是这个数据结构的定义 他就写了1900多行的代码

这么多代码是让人很抓狂的一个事情 总之呢 我们想要认识pcb当中的所有字段 那是不可能的 我们只需要知道pcb当中存放的都是操作系统

在对进程进行管理的时候所需要的那些信息就可以了 那除了p c b之外呢

进程的组成------程序段、数据段

进程还有两个很重要的组成部分 一个叫做程序段 一个叫做数据段

刚才我们说过pcb 它是给操作系统用的一个数据结构 而程序段和数据段它其实是给进程自己用的

知识滚雪球:程序是如何运行的?

那我们具体来看一个例子 在之前的第一章节当中 我们学到了

这个程序 它在运行之前需要编译成二进制的机器指令

而这个程序执行的过程 其实就是cpu执行这些一条一条的指令的一个过程

那接下来 我们把程序运行的过程再进一步的细化一下 其实我们写完一个程序之后

经过编译 链接等等一系列的步骤 最终会形成一个可执行文件 向大家熟悉的windows电脑里就是点exe的文件

那这个可执行文件平时是存放在硬盘当中的 这个可执行文件当中保存的其实就是我们刚才说的那一系列的指令序列

而当这个程序要运行之前 需要把它从硬盘读入到内存当中

并且操作系统会建立一个与它相对应的进程 那根据刚才我们的分析 我们知道它会建立相对应的pcb

那除了p c b之外 这个程序的那一系列指令序列也需要读到内存当中 那这一系列的指令序列 我们把它称作为程序段

那其实这个程序执行的过程 或者说这个进程 它执行的过程就是

cpu从内存当中读入这些一条一条的指令 然后来执行这些指令 那除了执行这些指令之外 其实在执行指令的过程当中会有一些中间的数据

比如说 我们这定义了一个变量 叫做x 那么这些变量的内容其实也需要放在内存当中 所以还会有另外一个叫做数据段的区域 用来存放这个程序运行过程当中所产生所需要使用的各种数据 就比如说 我们定义了哪些

变量 这些信息就是放在数据段里的 所以一个进程的实体
它由p c b 程序段和数据段这么三个部分组成

进程的组成

我们之前一直在说进程有哪些部分组成 但其实更严格的来说应该是说进程实体 或者说进程印象有哪些部分组成

进程它是动态的 而进程实体进程印象它是静态的 我们可以把进程实体理解为是

这个进程在动态执行过程当中某一时刻的一个快照 一个照片

进程实体能够反映这个进程在某一个时刻的状态 比如说这个进程运行的过程 当中x的值 这个变量的值本来是一但是在进行了加加这个操作之后 x的值就会变成二

所以 在进程的运行过程当中 进程实体 它是在不断变化的 所以准确的说 我们应该说 进程实体由p c b 程序段和数据段这么三个部分组成

不过除非题目特别考察进程和进程实体进程印象的区别 不然大家也可以认为所谓的进程就是进程实体 没必要去钻这个牛角尖扣这个字眼

那p c b是给管理者 也就是给操作系统使用的 而程序段和数据段里面的内容是给进程自己使用的

和进程自己的运行逻辑有关 所以在引入了进程实体的概念之后 我们可以把进程定义为这样

进程 它是进程实体的一个运行过程 是系统进行资源分配和调度的独立单位

进程是资源分配的独立单位 这一点很好理解 从刚才活动监视器这我们也可以看到

操作系统是以进程为单位 给各个进程来分配这些资源的 比如说内存

所以进程是资源分配的独立单位 那这个地方还涉及到另一个概念 叫做进程的调度

其实所谓的调度 就是指操作系统决定让哪个进程上cpu运行

进程的调度相关的内容 我们会在之后的小节当中有更进一步的学习 总之呢 一个程序运行多次会对应多个进程

如果说我们同时挂三个qq号的话 那么这三个qq进程 他们的p c b和数据段都是各不相同的
他们的pcb不相同 这个很好理解 刚才我们也已经解释过了 而数据段不相同是因为我们登录的三个qq号 他们的信息数据 这些都是存放在数据段当中的 所以三个不同的qq号 他们的数据段肯定是不同的
但是呢 这三个qq进程背后 他们运行的其实是相同的qq程序

也就是他们的程序段内容其实是相同的 那讲到这儿 相信大家对进程和程序的理解

应该会比较直观了

那么之前我们介绍了进程的定义和进程的组成 接下来我们看一下进程有哪些特征

进程的特征

相比于程序 进程拥有以下的一些特征 第一叫做动态性 因为进程是程序的一次执行过程吗 或者说 进程是进程实体的一次执行过程

它是动态的 产生 变化和消亡的 所以动态性很好理解 它 也是进程的一个最基本的特性

第二个特性叫并发性 是指内存当中同时会有多个进程实体

然后各个进程可以并发的执行 那这点在经过第一章的学习相信也很好理解 然后独立性是指进程能够独立运行 独立获得资源 独立接受调度

然后各个并发运行的进程还会有异步性 就是指他们以各自独立的 不可预知的速度向前推进

进程的并发带来的异步性可能会让进程的执行结果不确定 但是有的时候我们又必须让并发执行的进程来相互配合协调着工作 那

具体怎么实现呢 这个我们会在进程同步的小节当中进行学习 这先不展开

最后 进程还拥有结构性 就是指每个进程都会有一个p c b一个程序段数据段

那所有的这些特性大家都只需要理解 不需要死记硬背好的 那么这个小节我们介绍了进程这个很重要的概念

进程 或者说进程实体 由pc b 程序段和数据段这样三个部分组成

p cb是一个很重要 很重要的数据结构 它是进程存在的唯一标志 操作系统就是通过p c b里面记录的这些各种各样的信息来对各个进程进行管理的

所以 但凡是操作系统管理进程所需要的数据 肯定都是放在pcb当中 而进程他自己所需要的数据是放在程序段和数据段当中的

另外呢 需要注意的是 进程的动态性是它最基本的特性 并且还需要注意进程 它是独立获得资源

独立接受调度的一个基本单位 让大家注意这一点的原因是
在引入了线程之后 进程就不再是接受调度的基本单位了

但是进程依然是获得资源的基本单位 这点还会经过后续的小节进行进一步的讲解 这暂时先不展开

知识回顾与重要考点

推荐一个零声学院免费公开课程,个人觉得老师讲得不错,分享给大家:Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK等技术内容,立即学习

相关推荐
WZF-Sang20 小时前
Linux—进程学习-01
linux·服务器·数据库·学习·操作系统·vim·进程
Goboy1 天前
0帧起步:3分钟打造个人博客,让技术成长与职业发展齐头并进
程序员·开源·操作系统
结衣结衣.2 天前
【Linux】Linux管道揭秘:匿名管道如何连接进程世界
linux·运维·c语言·数据库·操作系统
OpenAnolis小助手2 天前
龙蜥副理事长张东:加速推进 AI+OS 深度融合,打造最 AI 的服务器操作系统
ai·开源·操作系统·龙蜥社区·服务器操作系统·anolis os
小蜗的房子3 天前
SQL Server 2022安装要求(硬件、软件、操作系统等)
运维·windows·sql·学习·microsoft·sqlserver·操作系统
邂逅岁月4 天前
【多线程奇妙屋】 Java 的 Thread类必会小技巧,教你如何用多种方式快速创建线程,学并发编程必备(实践篇)
java·开发语言·操作系统·线程·进程·并发编程·javaee
CXDNW6 天前
【系统面试篇】进程和线程类(1)(笔记)——区别、通讯方式、同步、互斥、死锁
笔记·操作系统·线程·进程·互斥·死锁
Anemone_6 天前
MIT 6.S081 Lab3
操作系统
掘了7 天前
持久化内存 | Persistent Memory
c++·架构·操作系统
结衣结衣.8 天前
【Linux】掌握库的艺术:我的动静态库封装之旅
linux·运维·服务器·c语言·操作系统·