【操作系统】进程管理——进程控制和进程通信(个人笔记)

学习日期:2024.6.30

内容摘要:进程控制的概念,进程控制相关的“原语”,进程通信


进程控制

原语

进程控制用“原语”实现。原语是一种特殊的程序,它的执行具有原子性,也就是说,这段程序的执行必须一气呵成,不能中断。

Q:为什么进程控制(状态转换)的过程必须一气呵成?

如果不能一气呵成,可能会出现某些进程的关键数据结构信息不统一的情况,会影响操作系统进行别的管理工作。

Q:原子性是如何实现的?

利用了“关中断指令”和“开中断指令”两个特权指令来实现原子性,CPU执行了关中断指令后,就不会再例行检查中断信号,直到执行开中断指令之后才会恢复检查,从而达到独占CPU的目的。

进程的创建

创建原语(操作系统创建一个进程时使用的原语)会申请空白PCB,为新进程分配所需资源,初始化PCB,将PCB插入就绪队列(创建态->就绪态)

引起进程创建的事件:

①用户登录:分时系统中,用户登陆成功,系统会为其建立一个新的进程。

②作业调度:多道批处理系统中,有新的作业放入内存时,会为其建立新进程。

③提供服务:用户向操作系统提出请求时,会新建一个进程处理请求。

④应用请求:由用户进程主动请求创建一个子进程。

进程的终止

撤销原语(操作系统终止一个进程时所使用的原语)会从PCB集合中找到终止进程的PCB,若进程正在运行,立刻剥夺CPU,同时将CPU分配给其它进程。终止其所有子进程,将该进程所拥有的所有资源归还给父进程或操作系统,最后删除PCB

引起进程终止的事件:

①正常结束:进程自己请求终止。

②异常结束:整数除以0,非法使用特权指令被操作系统强行杀死。

③外界干预:出于某种原因,用户使用任务管理器等方式杀死进程。

进程的阻塞

阻塞原语可以让进程从运行态变为阻塞态。阻塞原语会找到要阻塞的进程对应的PCB,保护进程运行现场,将PCB状态信息设置为“阻塞态”,暂时停止进程运行,最后将PCB插入相应事件的等待队列。

引起进程阻塞的事件:

①等待:需要等待系统分配某种资源,或需要等待互相合作的其它进程完成工作

进程的唤醒

唤醒原语可以让进程从就绪他转换为运行态,唤醒原语会在等待队列中找到待唤醒进程的PCB,将PCB从等待队列移除,设置进程为就绪态,将PCB插入就绪队列,等待被调度

引起进程唤醒的事件:

①进程因何事被阻塞,就应当由何事被唤醒,阻塞原语和唤醒原语必须是成对使用的

进程的切换

切换原语会让进程在运行态和就绪态之间切换。切换原语会将进程的运行环境信息存入PCB,然后将PCB移入相应队列(就绪/运行),选择另一个进程执行,并更新其PCB,根据PCB恢复新进程所需的运行环境。

引起进程切换的事件:

①当前进程的时间片到。 ②有更高优先级的进程到达。③当前进程主动阻塞。④当前进程终止。

共性

无论是哪个进程控制原语,要做的无非是三类事情:

①更新PCB中的信息(修改进程状态,保护/恢复运行环境)。

②将PCB插入合适的队列。

③分配/回收资源。

什么叫“进程的运行环境”?

我们在前面提到过很多次“保存运行环境”,其实就是保存寄存器中的指令和值,在进程切换时,先在PCB中保存这个进程的运行环境(保存如PC,IR,通用寄存器等信息)然后当原来的进程再次运行时,可以通过PCB快速的恢复它的运行环境。


进程通信

进程间通信(IPC,Inter-Process Communication)是指两个进程之间产生数据交互。

你在刷b站的过程中看到一个有意思的视频,想把它分享给你的好朋友,会点击视频下面的转发按钮,然后选择你的微信好友,视频就发出去了,但是正在运行的bilibili和微信显然不是同一个进程,那是怎么发出去的呢?这就是进程之间发生了通信

为什么进程的通信需要操作系统支持?

进程是分配系统资源的单位(包括内存地址空间),因此各进程拥有的内存地址空间相互独立

如果两个进程P和Q之间需要通信,显然进程P是不能直接把数据写到Q的地址空间的,所以需要借助操作系统的帮助。下面介绍共享存储、消息传输、管道通信三种进程通信方式。

共享存储

共享存储的原理是,进程可以申请一片共享存储区,这片共享存储区其它的进程也可以访问,所有要进行交换的数据就可以放在这片区域,从而完成进程间通信。通过增加页表项/段表项即可将同一片共享内存区域映射到各个进程的地址空间当中。

为避免写覆盖,各个进程对共享空间的访问应该是互斥的。(避免P正在该区域写,此时Q也在同一区域写,覆盖了P写的内容)

基于存储区的共享

操作系统在内存中划出一块共享存储区域,数据的形式、存放的位置都由通信进程控制,而不是操作系统,这种共享方式速度很快,是一种高级通信方式。

基于数据结构的共享

比如说共享空间内只能放一个长度为100的数组,这个数组能在各个进程之间共享访问,这种共享方式速度慢限制多,是一种低级通信方式。

消息传递

进程间的数据交换以格式化的消息(Message)为单位,进程通过操作系统提供的“发送消息/接收消息”两个原语进行数据交换。

直接通信方式

在操作系统的内核区域中,进程Q的PCB中会有一个进程Q的消息队列。进程P给进程Q发送消息时,进程P在自己的区域中初始化消息,然后使用发送原语,send(Q,msg),这会使得操作系统接收到了这个消息,把这个消息复制到进程Q的消息队列当中。进程Q在运行时,可以使用接收原语,receive(P,&msg),操作系统查找Q的消息队列,发现P发来的信息,再把消息队列当中的msg放到进程Q的地址空间当中。

间接通信方式

进程可以向操作系统申请一个(或多个)邮箱,保存在操作系统内核地址空间当中。当进程P准备给Q发送信息时,进程P首先在自己的地址空间内给自己要发送的消息赋值(好比先写好信),然后使用发送原语(A,msg)往信箱A发送消息msg。注意!此时与直接通信方式的区别是,不声明自己消息要发给谁,而是发送给信箱,以信箱作为中间实体进行传递。

之后,进程Q通过接收原语,receive(A,&msg)从信箱A接受消息。

同现实中的信箱一样,多个进程可以在同一个信箱send或receive消息。

管道通信

水管当中的水流一定是单向的,管道通信也是如此,我们只能从一端写数据,一端读数据。

“管道”(pipe)是一个特殊的共享文件,其实就是在内存中开辟一个大小固定的内存缓冲区,其与共享存储的根本区别是:共享内存的P、Q进程都可以在共享存储区当中自由读写数据,但管道是单向的,P只能向管道里写数据,Q只能读数据,且管道中的数据满足先进先出的特征,Q不是想读哪个就读哪个,而是按照P发送的顺序来读。

①管道只能采用半双工通信,某一时间段内只能实现单向的传输(管道可以倒过来,但是不能同时来回传)。如果需要双向同时通信(全双工通信),则需要建立两个管道。

②各个进程要互斥的访问管道(由操作系统实现)

③因为管道的大小是固定的,当管道写满时,写进程将阻塞,直到读进程将管道中的数据取走,即可唤醒写进程。同理,当管道读空时,读进程将堵塞,直到写进程往管道中写入数据。

④管道中的数据一旦被读出,就彻底消失,因此当多个进程读同一个管道时,可能会错乱。对此,通常有两种解决方案:

1.一个管道允许多个写进程,但是只能有一个读进程(多个进水口,一个出水口)

2.允许有多个写进程和多个读进程,但是系统会让各个读进程轮流读数据(多个出水口,但不准同时打开)(Linux的方案)


 内容总结自王道计算机考研《操作系统》 和 人民邮电出版社《操作系统导论》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/759148.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

计算机网络原理及应用

第一章 计算机网络概述 【1】局域网 局域网是指在某一区域内由多台计算机互联而成的计算机通信网络。 【1】互通 两个网络之间可以交换数据。 第二章 计算机网络的体系结构 【1】语义 何时发出何种控制信息,完成何种动作以及做出何种响应。 【2】简述网络协…

【Linux】性能分析器 perf 详解(一):简介、安装、stat命令演示

1、简介 perf 是由 Linux 官方提供的系统性能分析工具 。它包含两部分: perf_events ,Linux 内核中的一个子系统perf 命令,用户空间的应用程序内核子系统 perf_events 提供了性能计数器(hardware performance counters)和性能事件的支持,它以事件驱动型的方式工作,通过…

DarkGPT:基于GPT-4-200k设计的人工智能OSINT助手

关于DarkGPT DarkGPT是一款功能强大的人工智能安全助手,该工具基于GPT-4-200k设计并实现其功能,可以帮助广大研究人员针对泄露数据库进行安全分析和数据查询相关的OSINT操作。 工具要求 openai1.13.3 requests python-dotenv pydantic1.10.12 工具安装 …

【机器学习】在【Pycharm】中的应用:【线性回归模型】进行【房价预测】

专栏:机器学习笔记 pycharm专业版免费激活教程见资源,私信我给你发 python相关库的安装:pandas,numpy,matplotlib,statsmodels 1. 引言 线性回归(Linear Regression)是一种常见的统计方法和机器学习算法&a…

miniconda 弹出黑窗

etc\conda\activate.d 和 envs 中不同环境中的 etc\conda\activated.d,只保留下图中的三个文件即可。

Facebook的投流技巧有哪些?

相信大家都知道Facebook拥有着巨大的用户群体和高转化率,在国外社交推广中的影响不言而喻。但随着Facebook广告的竞争越来越激烈,在Facebook广告上获得高投资回报率也变得越来越困难。IPIDEA代理IP今天就教大家如何在Facebook上投放广告的技巧&#xff0…

p2p、分布式,区块链笔记:试用ZeroTier组网

ZeroTier 是一种用于创建和管理虚拟局域网(Virtual Local Area Network,VLAN)的软件定义网络(SDN)解决方案。它可以通过互联网将多个设备安全地连接在一起,就像它们在同一个本地网络上一样。主要开发语言为…

zfile文件共享系统使用

1.简介 zfile是一款基于java开源的文件共享软件,有两种部署(jar包和war包),非常适合广大的Java开发人员使用(当然其他人员也可使用),或者你也可以称它为网盘,可以在Windows、MacOS、Linux上部署…

【操作系统期末速成】 EP01 | 学习笔记(基于五道口一只鸭)

文章目录 一、前言🚀🚀🚀二、正文:☀️☀️☀️1.1 考点一:操作系统的概率及特征 三、总结:🍓🍓🍓 一、前言🚀🚀🚀 ☀️ 回报不在行动…

javaSE知识点整理总结(下)、MySQL数据库

目录 一、异常 1.常见异常类型 2.异常体系结构 3.异常处理 (1)finally (2)throws 二、JDBC 1.JDBC搭建 2.执行SQL语句两种方法 三、MySQL数据库 1.ddl 2.dml 3.dql (1)字符函数 (…

Unidbg调用-补环境V3-Hook

结合IDA和unidbg,可以在so的执行过程进行Hook,这样可以让我们了解并分析具体的执行步骤。 应用场景:基于unidbg调试执行步骤 或 还原算法(以Hookzz为例)。 1.大姨妈 1.1 0x1DA0 public void hook1() {

Unity之自定义Text组件默认属性值

内容将会持续更新,有错误的地方欢迎指正,谢谢! Unity之自定义Text组件默认属性值 TechX 坚持将创新的科技带给世界! 拥有更好的学习体验 —— 不断努力,不断进步,不断探索 TechX —— 心探索、心进取!…

48 - 按日期分组销售产品(高频 SQL 50 题基础版)

48 - 按日期分组销售产品 -- group_concat 分组拼接selectsell_date,count(distinct product) num_sold,group_concat(distinct product order by product separator ,) products fromActivities group bysell_date;

统计是一门艺术(参数假设检验)

1.参数假设检验 在总体分布已知的情况下,对分布中未知参数的检验。 (1)相关基本概念 零假设/原假设与对立假设/备择假设: 任务:根据样本作出是否接受H0 复合假设与简单假设: 否定域/拒绝域与接受域&…

中霖教育:中级会计师备考误区你中招了吗?

【中霖教育好吗】【中霖教育口碑】 中级会计师考试难度并没有大家想象的那么大,只要掌握正确的备考方法就可以。在准备过程中,部分考生往往会陷入一些备考误区,进而影响复习效率。以下误区看你中招了吗: 一、过度追求数量而非质…

rocketmq简易版搭建

今天真是搭了本人六七个钟,太难了 首先是魔法大战镜像,这波大败而归,连上了,可惜没氪金,永远是没拉完就超时,魔法质量不行,等上班赚点米再改良一下魔法类别,那还得继续linux搭建 1…

ComfyUI高清放大的四种方式(工作流附件在最后)

方式一:Latent放大工作流 1.工作流截图 方式二:ESRGAN(传统模型)放大工作流 方式三:算法放大(后期处理)工作流 方式四:Ultimate SD Upscale工作流 这个方式的优势是对于显存底的用…

49 - 列出指定时间段内所有的下单产品(高频 SQL 50 题基础版)

49 - 列出指定时间段内所有的下单产品 -- 指定2020年2月的方法 -- (1) order_date between 2020-02-01 and 2020-02-29 -- (2) order_date like 2020-02% -- (3) DATE_FORMAT(order_date, "%Y-%m") "2020-02" -- (4) LEFT(order_date, 7) 或 subst…

从零开始三天学会微信小程序开发(三)

看到不少入门的小程序开发者不断的问重复性的问题,我们从实战角度开发了这个课程,希望能够帮助大家了解小程序开发。 课程分三天: 第一天:微信小程序开发入门第二天:给小程序接入云端数据第三天:完善我的…

intellij idea安装R包ggplot2报错问题求解

1、intellij idea安装R包ggplot2问题 在我上次解决图形显示问题后,发现安装ggplot2包时出现了问题,这在之前高版本中并没有出现问题, install.packages(ggplot2) ERROR: lazy loading failed for package lifecycle * removing C:/Users/V…
最新文章