栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

大话操作系统(7)进程的状态和控制结构

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

大话操作系统(7)进程的状态和控制结构

文章目录

进程基础知识

概念

并发和并⾏有什么区别?进程与程序的关系 进程的状态进程的控制结构

PCB 具体包含什么信息呢?每个 PCB 是如何组织的呢?

进程基础知识 概念

我们编写的代码只是⼀个存储在硬盘的静态⽂件,通过编译后就会⽣成⼆进制可执⾏⽂件,当我们运⾏这个可执⾏⽂件后,它会被装载到内存中,接着 CPU 会执⾏程序中的每⼀条指令,那么这个运⾏中的程序,就被称为「进程」(Process)。

现在我们考虑有⼀个会读取硬盘⽂件数据的程序被执⾏了,那么当运⾏到读取⽂件的指令时,就会去从硬盘读取数据,但是硬盘的读写速度是⾮常慢的,那么在这个时候,如果 CPU 傻傻的等硬盘返回数据的话,那 CPU 的利⽤率是⾮常低的。

所以,当进程要从硬盘读取数据时,CPU 不需要阻塞等待数据的返回,⽽是去执⾏另外的进程。当硬盘数据返回时,CPU 会收到个中断,于是 CPU 再继续运⾏这个进程。

这种多个程序、交替执⾏的思想,就有 CPU 管理多个进程的初步想法。
对于⼀个⽀持多进程的系统,CPU 会从⼀个进程快速切换⾄另⼀个进程,其间每个进程各运⾏⼏⼗或⼏百个毫秒。

虽然单核的 CPU 在某⼀个瞬间,只能运⾏⼀个进程。但在 1 秒钟期间,它可能会运⾏多个进程,这样就产⽣并⾏的错觉,实际上这是并发。

并发和并⾏有什么区别?

进程与程序的关系

CPU 可以从⼀个进程切换到另外⼀个进程,在切换前必须要记录当前进程中运⾏的状态信息,以备下次切换回来的时候可以恢复执⾏。
所以,可以发现进程有着「运⾏ - 暂停 - 运⾏」的活动规律。

进程的状态

在上⾯,我们知道了进程有着「运⾏ - 暂停 - 运⾏」的活动规律。⼀般说来,⼀个进程并不是⾃始⾄终连续不停地运⾏的,它与并发执⾏中的其他进程的执⾏是相互制约的。
它有时处于运⾏状态,有时⼜由于某种原因⽽暂停运⾏处于等待状态,当使它暂停的原因消失后,它⼜进⼊准备运⾏状态。

所以,在⼀个进程的活动期间⾄少具备三种基本状态,即运⾏状态、就绪状态、阻塞状态。

图中各个状态的意义:
运⾏状态(Runing):该时刻进程占⽤ CPU;
就绪状态(Ready):可运⾏,由于其他进程处于运⾏状态⽽暂时停⽌运⾏;
阻塞状态(Blocked):该进程正在等待某⼀事件发⽣(如等待输⼊/输出操作的完成)⽽暂时停⽌运⾏,这时,即使给它CPU控制权,它也⽆法运⾏;

当然,进程还有另外两个基本状态:
创建状态(new):进程正在被创建时的状态;
结束状态(Exit):进程正在从系统中消失时的状态;

于是,⼀个完整的进程状态的变迁如下图:

再来详细说明⼀下进程的状态变迁:
NULL -> 创建状态 :⼀个新进程被创建时的第⼀个状态;
创建状态 -> 就绪状态 :当进程被创建完成并初始化后,⼀切就绪准备运⾏时,变为就绪状态,这个过程是很快的;
就绪态 -> 运⾏状态 :处于就绪状态的进程被操作系统的进程调度器选中后,就分配给 CPU 正式运⾏该进程;
运⾏状态 -> 结束状态 :当进程已经运⾏完成或出错时,会被操作系统作结束状态处理;
运⾏状态 -> 就绪状态 :处于运⾏状态的进程在运⾏过程中,由于分配给它的运⾏时间⽚⽤完,操作系统会把该进程变为就绪态,接着从就绪态选中另外⼀个进程运⾏;
运⾏状态 -> 阻塞状态 :当进程请求某个事件且必须等待时,例如请求 I/O 事件;
阻塞状态 -> 就绪状态 :当进程要等待的事件完成时,它从阻塞状态变到就绪状态;

如果有⼤量处于阻塞状态的进程,进程可能会占⽤着物理内存空间,显然不是我们所希望的,毕竟物理内存空间是有限的,被阻塞状态的进程占⽤着物理内存就⼀种浪费物理内存的⾏为。

所以,在虚拟内存管理的操作系统中,通常会把阻塞状态的进程的物理内存空间换出到硬盘,等需要再次运⾏的时候,再从硬盘换⼊到物理内存。

那么,就需要⼀个新的状态,来描述进程没有占⽤实际的物理内存空间的情况,这个状态就是挂起状态。
这跟阻塞状态是不⼀样,阻塞状态是等待某个事件的返回。

另外,挂起状态可以分为两种:
阻塞挂起状态:进程在外存(硬盘)并等待某个事件的出现;
就绪挂起状态:进程在外存(硬盘),但只要进⼊内存,即刻⽴刻运⾏;

这两种挂起状态加上前⾯的五种状态,就变成了七种状态变迁,⻅如下图:

导致进程挂起的原因不只是因为进程所使⽤的内存空间不在物理内存,还包括如下情况:
通过 sleep 让进程间歇性挂起,其⼯作原理是设置⼀个定时器,到期后唤醒进程。
⽤户希望挂起⼀个程序的执⾏,⽐如在 Linux 中⽤ Ctrl+Z 挂起进程;

进程的控制结构

在操作系统中,是⽤进程控制块(process control block , PCB)数据结构来描述进程的。
PCB 是进程存在的唯⼀标识,这意味着⼀个进程的存在,必然会有⼀个 PCB,如果进程消失了,那么PCB 也会随之消失。

PCB 具体包含什么信息呢?

进程描述信息:

进程标识符:
标识各个进程,每个进程都有⼀个并且唯⼀的标识符;
⽤户标识符:进程归属的⽤户,⽤户标识符主要为共享和保护服务;进程控制和管理信息:
进程当前状态,如 new、ready、running、waiting 或 blocked 等;
进程优先级:进程抢占 CPU 时的优先级;资源分配清单:
有关内存地址空间或虚拟地址空间的信息,所打开⽂件的列表和所使⽤的 I/O 设备信息。CPU 相关信息:
CPU 中各个寄存器的值,当进程被切换时,CPU 的状态信息都会被保存在相应的 PCB 中,以便进程重新执⾏时,能从断点处继续执⾏。

可⻅,PCB 包含信息还是⽐较多的。

每个 PCB 是如何组织的呢?

通常是通过链表的⽅式进⾏组织,把具有相同状态的进程链在⼀起,组成各种队列。⽐如:
将所有处于就绪状态的进程链在⼀起,称为就绪队列;
把所有因等待某事件⽽处于等待状态的进程链在⼀起就组成各种阻塞队列;
另外,对于运⾏队列在单核 CPU 系统中则只有⼀个运⾏指针了,因为单核 CPU 在某个时间,只能运⾏⼀个程序。

那么,就绪队列和阻塞队列链表的组织形式如下图:

除了链接的组织⽅式,还有索引⽅式,它的⼯作原理:将同⼀状态的进程组织在⼀个索引表中,索引表项指向相应的 PCB,不同状态对应不同的索引表。

⼀般会选择链表,因为可能⾯临进程创建,销毁等调度导致进程状态发⽣变化,所以链表能够更加灵活的插⼊和删除。

学自小林coding,侵删

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/747052.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号