进程描述和控制
原书《操作系统精髓与设计原理——富兰克林》第三章。
关于进程的一些内容,在之前的笔记浅谈进程、线程和协程中已经提到了,所以该篇笔记只会记录之前没有的内容。
五状态进程模型#
和上篇文章中记录的三状态进程模型没什么区别,只不过划分的更加细致,把新建和退出也加上了。
- 运行态:进程当前正在被CPU执行
- 就绪态:进程在就绪队列中,一旦有机会立即开始执行
- 阻塞态:进程在阻塞队列中等待外部事件发生,如I/O操作完成
- 新建态:进程已经被创建,但还未载入内存,通常是进程控制块已经创建但还没加载到内存
- 退出态:进程被操作系统在可执行进程组中释放
下图是进程的排队模型
提供阻塞态的目的是为了应付类似I/O事件那种需要当前进程进行不可预期的阻塞等待,在单道程序操作系统中,CPU因为等待外部事件,大部分时间都在闲置,所以提供阻塞态可以允许操作系统将这些进程放到一个队列里,转而去执行就绪态的进程。但接下来的问题是,在多道程序操作系统中,万一所有进程都处于阻塞状态,那CPU不又闲置了吗?
这时应该怎么办?如果内存中能够容纳尽可能多的进程,那么这种情况就会很少发生,但是物理内存的大小有限,而且成本过高。
挂起进程#
这时,进程就又有了新的状态——“挂起态”。这是指当系统中没有处于就绪态的进程时,操作系统就把那些等待外部事件的“阻塞态”进程被完全移动到磁盘中,这样,我们就可以向内存中添加新的进程,或者重新取出挂起队列中的一个进程。
不过,将进程移动到磁盘中也是一个IO操作,它也有可能会使问题恶化,只是通常情况下会提高性能。
进入到挂起态的进程最初是阻塞的,但当它等待的外部事件到来时,它就是就绪状态。所以我们还可以将挂起态分的更加细致:
- 阻塞/挂起态:进程在外存中并等待一个事件
- 就绪/挂起态:进程在外存中,但只要被载入内存就可以执行
如果没有这两个态的区分,你也没法确定我们将挂起态的进程拿回内存的操作是否有用,一个进程是因为阻塞才被挂起的,你把它拿回来发现它还是阻塞的,那挺蠢的。
导致进程挂起的几种原因:
进程描述#
进程是对于操作系统“如何在单个CPU上并发运行多个程序”的抽象,这也引出了一些额外的工作。就是操作系统需要管理进程相关的各种信息,比如它的寄存器数据、打开的文件、占用的内存信息、等待的外部事件信息等。一般的操作系统使用4种表来维护这种信息——内存表、IO表、文件表和进程表:
内存表用于保存和进程相关的如下信息:
- 分配给进程的内存
- 分配给进程的外存(可能是挂起或者使用了虚拟内存)
- 内存块或虚拟内存的任何保护属性,比如哪些进程可以访问某些共享内存区域
- 管理虚拟内存所需要的任何信息
I/O表记录了I/O设备当前是空闲或被某个进程使用。
本书的第三章主要描述了进程表
进程控制结构#
其中保存了进程的位置信息、状态以及属性。
进程位置#
一个进程包括程序本身和它所产生的数据、栈信息和它的属性,这些东西的集合称作进程映像。
进程的位置依赖于操作系统使用的内存管理方案,一个进程可能一部分被调入内存中,另一部分在外存中,所以操作系统需要知道每个进程在磁盘中和在内存中的位置。
现代操作系统还可能使用分页硬件来在不连续的物理内存中保存进程,所以进程表中还必须包含每个进程映像中每页的位置。
进程属性#
进程的属性保存在进程控制块(PCB)中,下面的表是一个简单的进程控制块中可能包含的内容,大致分为3类:
- 进程标识信息
- 处理器状态信息
- 进程控制信息
进程控制#
执行模式#
为了保护操作系统的重要信息不被破坏(如进程表),需要提供一定的隔离,即一些功能用户程序无法调用。
大多数处理器提供用户态和内核态来区分一个程序是否能访问某些指令和某些内存区域。进程的状态通常在程序状态字(PSW)中的一位中保存,当它执行在用户模式,一些受保护的命令和内存它无法执行和访问。
当用户程序调用一个操作系统服务或中断触发系统例程的执行时,该位被设置为内核态,当从系统服务返回到用户进程时,该位被设置回用户态。
进程创建#
- 给新进程分配一个唯一的进程标识符
- 给进程分配空间
- 初始化进程控制块
- 设置正确的连接(把进程放到操作系统保存进程的数据结构中,如就绪队列)
- 创建或扩充其他数据结构(比如为每个进程保存用于它性能评估的信息)
进程切换#
何时切换进程#
在任何操作系统从正在运行的进程获得控制权的时候发生,如它已经执行完分配给它的指令周期,等待外部事件或发生了中断。
我们可以把系统中断分为中断和陷阱两种,第一种是由于外部事件的打断,第二种是当前进程产生的错误或异常。对于普通中断,操作系统先把控制权转一个中断处理器做一些辅助工作,然后调用特定类型中断相关的操作系统例程:
- 时钟中断,进程已经运行完操作系统分配给他的时间片,此时它必须中断,转换为就绪态
- I/O中断,如果此I/O活动是一个或多个进程正在等待的事件则操作系统必须将这些正在阻塞的进程转换到就绪态
- 内存失效,运行在虚拟内存系统上的进程访问了一个不在内存中的地址单元时,操作系统必须从外存调入这个页面,这个进程被设置成阻塞态
对于陷阱则是需要操作系统根据当前发生的错误的严重程度来决定是否将进程转换为退出态或者是恢复执行并通知用户。
系统调用也有可能将进程设置为阻塞态,并执行系统中的一个例程,如进行IO访问。
模式切换#
当发生中断时需要进行的操作:
- 把程序计数器置成中断处理程序的开始地址
- 从用户态切换到内核态,以让中断处理程序可以使用一些特权指令
然后被中断进程需要保存以用于稍后恢复执行的信息被保存,下一步做什么取决于中断处理程序和发生的中断类型。
在大多数操作系统中,中断处理程序执行后会恢复刚刚正在执行的进程,而不是另一个进程,所以可以不改变正在运行进程的状态。
操作系统的执行#
无进程的内核#
在所有进程之外执行操作系统内核。当中断或系统调用产生,正在执行进程的状态被保存,控制权交给内核。
操作系统像一个具有特权的独立工作实体。
在用户进程中执行#
在较小的机器的操作系统中常见。即操作系统是公用的、用户程序可以调用的一组例程,在用户进程环境中执行。
当发生系统调用、中断或陷阱时,处理器被置于内核态,保存当前的上下文环境,然后切换到一个操作系统例程,但实际上还是在当前进程中执行。这种切换称为模式切换,如上面所说,它并不用实际切换进程。
基于进程的操作系统#
略
复习#
通常有哪些事件会导致创建一个进程#
- 用户进程创建子进程
- 一个新的批处理作业
- 交互登录
- 操作系统服务
抢占一个进程是什么意思#
处理器为了执行其它的进程而中止当前进程
什么是交换,其目的是什么#
交换就是指将阻塞态的进程从内存中移动到磁盘中,将其转换为挂起态。它的目的是让内存中容纳更多的进程以至于不会产生内存中所有进程都在阻塞,CPU闲置的状态。
对于哪些类信息,操作系统为管理它而维护进程表#
- 文件类
- IO类
- 内存类
- 进程类
列出进程控制块中的三类信息#
- 进程标识
- 处理器状态信息
- 进程控制信息
中断和陷阱的区别#
中断一般是由于外部事件的到来,和当前进程没关系。陷阱则是因为当前进程出现了错误。
举出中断的三个例子#
- 时钟中断
- IO中断
- 内存失效
模式切换和进程切换的区别#
模式切换可不改变当前处于运行态进程的状态。进程切换时,一个正在执行的进程被中断,操作系统指定另一个进程为运行态。进程切换需要保存更多的状态信息。
下面是我的回答,好像理解有误。。。
模式切换发生在进程内,它只修改进程的状态位(用户态或内核态),保存之前的信息,调用系统例程。模式切换不用实际切换进程。当系统例程执行完毕后,如果继续执行原来的进程,则仍旧不用切换进程,如果操作系统决定执行其它进程,才实际的切换进程。
对于一个进程来说,如果它被迫停止时使用的是模式切换,那么当它再次执行时,这其中最少必定经过两进程切换(切走一次,切回一次),而采用模式切换则可能不用。
作者:Yudoge
出处:https://www.cnblogs.com/lilpig/p/15931890.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
欢迎按协议规定转载,方便的话,发个站内信给我嗷~
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
· 零经验选手,Compose 一天开发一款小游戏!