操作系统(5)-----操作系统进程相关

目录

一.进程的组成

1.PCB(进程控制块)

2.程序段与数据段

二.进程的特征

三.进程的状态以及状态的转换

四.进程的组织

1.链接方式

2.索引方式

五.进程控制

六.进程控制相关原语

1.创建原语

2.撤销原语

3.阻塞原语

4.唤醒原语

5.切换原语

七.进程间的通信

1.共享存储

2.消息传递

(1)直接通信方式

(2)间接通信方式

3.管道通信


一.进程的组成

进程的组合如下所示:

1.PCB(进程控制块)

PCB是进程存在的唯一标志,当进程被创建时,操作系统为其创建PGB,当进程结束时,会回收其PCB。操作系统对进程进行管理工作所需的信息都存在PCB中。

(1)进程描述信息

进程描述信息包括进程标识符PID以及用户表示符UID,PID为进程ID,当进程被创建时,操作系统会为该进程分配一个唯一的、不重复的“身份证号”,即PID,例如:区别下面三个进程的就是PID。

(2)进程控制和管理信息

例如CPU,磁盘,网络流量使用情况,以及进程当前状态:就绪态/阻塞态/运行态,从任务管理前期我们就能看到进程相关信息

(3)资源分配清单

资源分配清单指的是系统正在使用哪些文件,内存区域或者I/O设备

(4)处理机相关信息

2.程序段与数据段

PCB是给操作系统使用的,程序段与数据段是给进程自己用的,与进程自身的运行逻辑有关。

程序运行过程如下:

高级程序会形成可执行文件,程序运行前,会将其从硬盘读入内存中,一个程序开始运行前,需要创建对应的进程,也就要创建相应的PCB,除了PCB,还需要读入一系列的指令序列,这一系列的指令序列就是程序段CPU会从内存中取出指令,并且执行这些指令。在执行指令时,会产生中间数据,例如中间变量等,这些数据就存放在数据段

注:其实这里的进程更准确地说是进程实体(进程映像),因为进程是动态的,而进程实体是静态的。进程运行过程中,进程实体是在不断变化的,例如x=1,运行x++后,x=2

进程与进程实体的关系:

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

二.进程的特征

程序是静态的,进程是动态的,相比于程序,进程拥有以下特征:

三.进程的状态以及状态的转换

进程的状态包括三种基本状态就绪态,运行态,阻塞态,创建态和终止态。

状态的转换过程如下:

1.进程正在被创建时,它的状态是“创建态”,在这个阶段操作系统会为进程分配资源、初始化PCB。

2.当进程创建完成后,便进入“就绪态”,处于就绪态的进程已经具备运行条件,但由于没有空闲CPU,也就是处理机,就暂时不能运行。

3.系统中可能会有很多个进程都处于就绪态,当CPU空闲时,操作系统就会选择一个就绪进程,
让它上处理机运行,若一个进程此时在CPU上运行,也就是CPU会执行该进程对应的程序(执行指令序列),那么这个进程处于"运行态"。

4.在进程运行的过程中,可能会请求等待某个事件的发生(如等待某种系统资源的分配,或者等待其他进程的响应),在这个事件发生之前,进程无法继续往下执行,此时操作系统会让这个进程下CPU,并让它进入“阻塞态”。当CPU空闲时,又会选择另一个“就绪态”进程上CPU运行。

5.一个进程可以执行 exit 系统调用,请求操作系统终止该进程。此时该进程会进入“终止态”操作系统会让该进程下CPU,并回收内存空间等资源,最后还要回收该进程的PCB。

进程状态转换图如下:

运行态-->阻塞态是一种进程自身做出的主动行为

阻塞态-->就绪态不是进程自身能控制的,是一种被动行为

注:

进程不能由阻塞态直接转换为运行态也不能由就绪态直接转换为阻塞态 (因为进入阻塞态是进程主动请求的,必然需要进程在运行时才能发出这种请求,而不能从就绪态到阻塞态)

运行态可以转化为就绪态:时间片到,或处理机被抢占。

 

四.进程的组织

为了对同一个状态下的各个进程进行统一的管理,操作系统会将各个进程的PCB组织起来。

1.链接方式

链接方式表示操作系统按照进程状态将PCB分为很多队列,操作系统持有指向各个队列的指针,每个队列都会指向相应状态进程的PCB

很多操作系统还会根据阻塞原因不同,再分为多个阻塞队列

2.索引方式

操作系统会根据进程状态不同,为进程建立索引表,操作系统持有指向各个索引表的指针,每个索引表的表项会指向相应的PCB

五.进程控制

进程控制的主要功能是对系统中的所有进程实施有效的管理,也就是说进程控制就是要实现进程状态转换,它具有创建新进程、撤销已有进程、实现进程状态转换等功能。

如何实现进程控制:

进程控制的实现是通过原语实现的:

原语在操作系统的内核中,原语是一种特殊的程序,它的执行具有原子性。也就是说,这段程序的运行必须一气呵成,不可中断。也就是进程控制(进程转换)是不可中断的

假设PCB中的变量state 表示进程当前所处状态,1表示就绪态,2表示阻塞态。此时进程2等待的事件发生,则操作系统中,负责进程控制的内核程序至少需要做这样两件事:

①将PCB2的state 设为1

②将PCB2从阻塞队列放到就绪队列

若完成了第一步后收到中断信号,那么PCB2的state=1,但是它却被放在阻塞队列里,如下图所示:

所以如果不能“一气呵成”地执行完进程,就有可能导致操作系统中的某些关键数据结构信息不统一的情况,这会影响操作系统进行别的管理工作。所以需要用“原语”来实现。

如何实现原语的“原子性”

原语可以用“关中断指令”和“开中断指令”这两个特权指令实现原子性。

注:普通的用户程序不能使用这两个指令,所以其为特权指令,只能运行在操作系统的内核中。

在正常情况下,CPU每执行完一条指令都会例行检查是否有中断信号需要处理,如果有,则暂停运行当前这段程序,转而执行相应的中断处理程序。若CPU执行了关中断指令之后,就不再例行检查中断信号,直到执行开中断指令之后才会恢复检查。

例如此时指令a后有外部中断信号,CPU不会响应这一中断信号,会继续往下处理,直到CPU执行了开中断指令后,才会恢复检查。这样,关中断、开中断 之间的这些指令序列就是不可被中断的,这就实现了“原子

六.进程控制相关原语

1.创建原语

操作系统创建一个进程时,会使用创建原语。

1.申请空白PCB   2.为新进程分配所需资源   3.初始化PCB   4.将PCB插入就绪队列中

所以创建原语使进程从创建态--->就绪态

引起进程创建的事件:

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

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

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

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

2.撤销原语

撤销原语可以使程序从某种状态转为终止态,最终从进程中消失

1.从PCB集合中找到终止进程的PCB   

2.若进程正在运行,立即剥夺CPU,将CPU分配给其它进程   

3.终止其所有子进程(进程间的关系是树形结构,PID为0,1的进程是祖先进程,这两个进程又创建了其他子进程)   

4.将该进程拥有的所有资源归还给父进程或操作系统   

5.删除PCB

引起进程终止的事件:

•正常结束:进程自己请求终止(exit系统调用)

•异常结束:整数除以0,非法使用特权指令,然后被操作系统强行杀掉

•外界干预:Ctrl+Alt+delete,用户选择杀掉进程

3.阻塞原语

某个进程从运行状态到阻塞状态,就会用到阻塞原语

1.找到要阻塞的进程对应的PCB

2.保护进程运行现场,将PCB状态信息设置为"阻塞态",暂时停止进程运行

3.将PCB插入相应事件的等待队列

引起进程阻塞的事件:

•需要等待系统分配某种资源

•需要等待相互合作的其他进程完成工作

4.唤醒原语

某个进程从阻塞态到就绪态,就会用到唤醒原语

1.在事件等待队列中找到PCB
2.将PCB从等待队列移除,设置进程为就绪态
3.将PCB插入就绪队列,等待被调度

引起进程唤醒的事件:

•等待的事件发生,一个进程被什么事件阻塞,就应该被这一事件唤醒,所以阻塞原语与唤醒原语是成对存在

5.切换原语

使一个处在运行态的进程,下处理机,回到就绪队列,并且使一个处在就绪态的进程,上处理机,切换为运行态。

1.将运行环境信息存入PCB
2.PCB移入相应队列
3.选择另一个进程执行,并更新其PCB
4.根据PCB恢复新进程所需的运行环境

引起进程切换的事件:

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

补充:这里的恢复运行环境是什么意思呢

程序指令会存放在CPU的寄存器中,当指令依次执行,寄存器的数据可能会更新覆盖,当操作系统想要使另外一个进程上CPU时,另一个进程也要使用到这些寄存器,此时,可以将这些寄存器中必要的内容保存到PCB中,然后切换为别的进程。当之前的进程想要重新上CPU时,操作系统就可以根据PCB保留的信息,恢复运行环境,接着执行该程序没有执行的指令

所以:运行环境或者说是进程上下文,就是进程运行中,进程产生的中间结果,当进程需要下CPU时,需要将运行环境存储到PCB中,当进程需要上CPU时,可以根据PCB恢复进程所需的运行环境。

七.进程间的通信

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

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

进程是分配系统资源的单位(包括内存地址空间),因此各进程拥有的内存地址空间相互独立,由于进程不能直接访问其他进程的空间,所以若两个进程需要进行进程通信,就需要通过操作系统进行进程间的通信。

进程通信有三种方式:

1.共享存储

某个进程可以申请一片共享存储区,这片共享存储区可以被其他进程共享,所以P想要向Q传递数据,就可以先写到共享存储区,然后由Q将共享内存区映射到自己的地址空间中。

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

也可以是基于数据结构的共享,比如共享空间里只能放一个长度为10的数组。这种共享方式速度慢、限制多,是一种低级通信方式。

注:通过“增加页表项/段表项”即可将同一片共享内存区映射到各个进程的地址空间中

为避免出错,各个进程对共享空间的访问应该是互斥的。各个进程可使用操作系统内核提供的同步斥工具(如P、V操作)

2.消息传递

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

格式化的消息由两个部分组成:消息头,消息体

消息头:发送进程ID、接受进程ID、消息长度等格式化的信息

消息体:一个进程要传递给另一个进程的数据

(1)直接通信方式

消息发送进程要指明接收进程的ID

直接通信的过程如下:

1.进程P在自己的地址空间中,完善需要发送给Q的消息,并且使用发送原语send(Q,msg),来指明这个消息是要发送给Q进程

2.接下来操作系统内核会接收到这个消息,并且将其挂在进程Q的消息队列中,也就是进程P的用户空间被复制到了内核空间中

3.进程Q会使用接收原语receive(P,&msg),操作系统会检查进程Q的消息,看其中是否有Q想要接收的消息,若有,操作系统内核会将这个消息复制到进程Q的地址空间中。

(2)间接通信方式

通过“信箱”间接地通信,因此又称“信箱通信方式

间接通信过程如下:

1.若进程P与进程Q需要进行通信,那么进程P可以通过系统调用申请一个信箱或多个信箱

2.接着在进程P在自己的地址空间中完善消息的内容

3.用发送原语send(A,msg)来指明我要发送到A信箱(这里是发送到A信箱,并没有指明是哪一个进程)

4.进程Q使用接收原语receive(A,&msg)从信箱A接受消息,它可以指明从哪个进程中接收,这样信箱A的msg就会被复制到进程Q的地址空间中了。

注:可以多个进程往同一个信箱send消息,也可以多个进程从同一个信箱中receive消息 

3.管道通信

管道的意思即从管道的一边写进程,从管道的另一边读进程,数据的流动只能是单向的

 “管道”是一个特殊的共享文件,又名pipe文件。其实就是在内存中开辟一个大小固定的内存缓冲区。

若两个进程需要用管道通信,进程P通过系统调用的方式向系统申请一个管道文件,操作系统会新建一个管道文件,实质上就是开辟一个大小固定的内存缓冲区。并且从管道中写数据或读数据,并且数据是先进先出(FIFO)的。

注:固定大小的缓冲区本质是一个循环队列。

1.由于只能单向,所以管道只能采用半双工通信,某一时间段内只能实现单向的传输。如果要实现双向同时通信,则需要设置两个管道。

2.各进程要互斥地访问管道(由操作系统实现)

3.当管道写满时,写进程将阻塞,直到读进程将管道中的数据取走,即可唤醒写进程。

4.当管道读空时,读进程将阻塞,直到写进程往管道中写入数据,即可唤醒读进程

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

①一个管道允许多个写进程,一个读进程。

②允许有多个写进程,多个读进程,但系统会让各个读进程轮流从管道中读数据 (Linux 的方案)。

管道通信与共享存储的区别在于:

对于共享存储,进程P,Q都可以从共享区域中读写数据,没有限制

但是对于管道通信而言,首先数据的流动是单向的,例如,P写数据,Q读数据,或者反过来。其次数据是先进先出的,也就是Q不是任意读取管道的数据,而是P先写进来的数据,Q才能读

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Elasticsearch8.11集群部署

集群就是多个node统一对外提供服务,避免单机故障带来的服务中断,保证了服务的高可用,也因为多台节点协同运作,提高了集群服务的计算能力和吞吐量。ES是一个去中心化的集群,操作一个节点和操作一个集群是一样的&#xf…

【Linux】-同步互斥的另一种办法-信号量

💖作者:小树苗渴望变成参天大树🎈 🎉作者宣言:认真写好每一篇博客💤 🎊作者gitee:gitee✨ 💞作者专栏:C语言,数据结构初阶,Linux,C 动态规划算法🎄 如 果 你 …

JVM系列——基础知识

Java运行区域 程序计数器(Program Counter Register) 程序计数器是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器。在Java虚拟机的概念模型里[1],字节码解释器工作时就是通过改变这个计数器的值来选取下一…

PCIE 4.0 Equalizaiton(LTSSM 均衡流程)

1. 均衡 在Tx端有FFE(Feed Forward Equalizer,前馈均衡器);在Rx端有:CTLE(Continuous Time Linear Equalizer,连续时间线性均衡器)和DFE(Decision Feedback Equalizer&a…

HarmonyOS 鸿蒙应用开发 (七、HTTP网络组件 axios 介绍及封装使用)

在HarmonyOS应用开发中,通过HTTP访问网络,可以使用官方提供的ohos.net.http模块。但是官方提供的直接使用不太好使用,需要封装下才好。推荐使用前端开发中流行的axios网络客户端库,如果是前端开发者,用 axios也会更加顺…

【GitHub项目推荐--推荐一个开源的任务管理工具(仿X书/X钉)】【转载】

推荐一个开源的任务管理工具,该工具会提供各类文档协作功能、在线思维导图、在线流程图、项目管理、任务分发、即时 IM,文件管理等等。该开源项目使用到 Vue、Element-UI、ECharts 等技术栈。 开源地址:www.github.com/kuaifan/dootask 预览地…

Ribbon 体系架构解析

前面已经介绍了服务治理相关组件,接下来趁热打铁,快速通关Ribbon!前面我们了解了负载均衡的含义,以及客户端和服务端负载均衡模型,接下来我们就来看下SpringCloud 下的客户端负载均衡组件Ribbon 的特点以及工作模型。 …

【Linux】从C语言文件操作 到Linux文件IO | 文件系统调用

文章目录 前言一、C语言文件I/O复习文件操作:打开和关闭文件操作:顺序读写文件操作:随机读写stdin、stdout、stderr 二、承上启下三、Linux系统的文件I/O系统调用接口介绍open()close()read()write()lseek() Linux文件相关重点 复习C文件IO相…

【计算机网络】中小型校园网构建与配置

拓扑图配置文件传送门 Packet Tracer-中小型校园网配置布局文件文件 相关文章 【计算机网络】IP协议及动态路由算法 【计算机网络】Socket通信编程与传输协议分析 【计算机网络】网络应用通信基本原理 原理 1. Network 广域网,WAN Wide Area Network&#xff…

花式沉默Defender

编者注:本文仅供学习研究,严禁从事非法活动,任何后果由使用者本人负责。 前言 总结了一下现在还能用的关闭Defender的方法,部分是原创,一部分借鉴的大佬。觉得字多的同学可以直接跳过思路查看步骤进行实操。 修改注册…

再学http

HTTP状态码 1xx 信息性状态码 websocket upgrade 2xx 成功状态码 200 服务器已成功处理了请求204(没有响应体)206(范围请求 暂停继续下载) 3xx 重定向状态码 301(永久) :请求的页面已永久跳转到新的url302(临时) :允许各种各样的重定向,一般…

自动驾驶和智能座舱软件介绍(二)

作者 / 阿宝 编辑 / 阿宝 出品 / 阿宝1990 自动驾驶软件介绍 自动驾驶底层操作系统及软件架构 底层可以包括多种芯片,以太网通信中间件保证网络通信和不同OS任务分配的确定性 Automotive uC,单片机,如英飞凌AURIX,运行AUTOSARB…

Github 2024-01-28 开源项目日报Top10

根据Github Trendings的统计,今日(2024-01-28统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目3TypeScript项目2Rust项目1HTML项目1JavaScript项目1Cuda项目1C#项目1非开发语言项目1 Nuxt&#…

XSS_Labs靶场通关笔记

每一关的方法不唯一;可以结合源码进行分析后构造payload; 通关技巧(四步): 1.输入内容看源码变化; 2.找到内容插入点; 3.测试是否有过滤; 4.构造payload绕过 第一关 构造paylo…

Redis数据类型及底层实现

文章目录 1.3.1 5种基本数据类型1.3.1.1 总结篇1.3.1.2 底层源码引入篇1.3.1.2.1 redis是字典数据库KV键值对到底是什么1.3.1.2.2 数据类型视角1.3.1.2.3 数据模型解析(重点)1.3.1.2.4 redisObjec1.3.1.2.5 SDS 1.3.1.3 String1.3.1.3.1 底层分析1.3.1.3…

uniCloud 免费版和商用版

概述 uniCloud为每个开发者提供一个免费的服务空间,更低门槛按量付费是serverless的特色,如果没有消耗硬件资源,就完全不用付款serverless比传统的云主机更便宜传统云主机一旦被攻击,高防价格非常昂贵。而uniCloud无需支付高防费…

k8s的图形化工具rancher

1、rancher:是一个开源的企业级多集群的k8s管理平台 2、rancher和k8s的区别 (1)都是为了容器的调度和编排系统 (2)但rancher不仅能够调度,还能管理k8s集群,自带监控(普罗米修斯&a…

【Linux】第三十六站:信号

文章目录 一、信号的概念1.信号概念2.前台与后台进程3.信号的处理4.硬件层面5.信号与我们的代码是异步的 二、信号的产生1.产生的方式2.键盘组合键3.kill命令4.系统调用4.1 kill系统调用4.2 raise4.3 abort 5.异常软件条件5.1 异常产生信号5.2 alarm(软件条件产生信…

【MySQL】学习如何通过DML更新数据库的数据

🌈个人主页: Aileen_0v0 🔥热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​💫个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-QIqURn9fNFMjLD9l {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…

【Go 快速入门】数组 | 切片 | 映射 | 函数 | 结构体 | 方法和接收者

文章目录 数组切片append 函数copy 函数删除元素 映射delete 函数 函数init 特殊的函数defer 语句panic / recover 错误处理 类型结构体内存对齐JSON 序列化与反序列化方法和接收者 项目代码地址:03-ArraySliceMapFuncStruct 数组 基本格式:var 数组变…