文章目录
- 0.前言
- 3.1进程概念
- 3.1.1 进程
- 3.1.2 进程状态
- 3.1.3 进程控制块(PCB)
- 3.2、进程调度
- 3.2.1 调度队列
- 3.2.2 调度程序
- 3.2.3 上下文切换
- 3.3 进程操作
- 3.3.1 进程创建
- 3.3.2 进程终止
- 3.4 进程间通信
0.前言
早期的计算机一次只能执行一个程序。这种程序完全控制系统,并且访问所有系统资源。
相比之下,现代计算机系统允许加载多个程序到内存,以便并发执行。
这种改进要求:对各种程序提供更严的控制和更好的划分。
这些需求导致了**进程(process)**概念的产生,即进程为执行程序。进程是现代分时操作系统的工作单元。
3.1进程概念
3.1.1 进程
进程包含了程序代码和当前活动(其中当前活动通过程序计数器和处理器寄存器的内容表示)两个部分,进程是执行中的程序。具体有:
- 文本段(代码段)
- 数据段(全局变量)
- 栈(stack)(包含临时数据、函数参数、返回地址、局部变量)
- 堆(heap)(进程运行期间动态分配的内存)
- 程序计数器
注意: 程序本身不是进程,是被动实体,进程是活动实体(其中当前活动通过程序计数器和处理器寄存器的内容表示).两个进程可以与同一程序联系,虽然文本段相同。但是数据段、堆栈段不同。
3.1.2 进程状态
进程有5种状态,包括:
- New(新的):进程正在创建
- Running(运行):指令正在执行
- Waiting(等待):进程等待发生某个实践
- Ready(就绪):进程等待分配处理器
- Terminated(终止):进程已经执行完毕
注意:一次只有一个进程能在一个处理器上运行(Running态),但在处理器上运行的时候,其他进程可以进行IO操作(想一下DMC模式)
3.1.3 进程控制块(PCB)
每一个进程都需要分配一定的信息,这些信息的仓库就叫做PCB,PCB有以下功能:
系统利用PCB 控制 和 管理 进程
PCB是进程存在的唯一标志
操作系统通过PCB感知进程的存在
PCB中包含以下内容(信息)图3-3
进程状态(如下图3-4所述)
程序计数器:表示进程要执行的下个指令的地址
CPU寄存器:与程序计数器一起,在出现中断时状态信息需要保存,使进程能够正确执行
CPU调度信息:包括优先级、调度队列的指针等(见第五章)
内存管理信息:(见第八章)
记账信息:包括CPU时间、实际使用时间、时间界限、记账数据、作业和进程数量等
IO状态信息:分配给进程的IO设备列表,打开的文件列表等
3.2、进程调度
目的:使CPU的利用率最大化,需要优化进程调度的方法
进程调度程序选择一个进程到CPU上执行(一个CPU一个时间段只能执行一个程序,其余程序需要等待CPU空闲重新调度)
3.2.1 调度队列
- 作业(Job)队列:包含了系统中所有的进程
- 就绪(Ready)队列:包含了系统中,驻留在内存中就绪的,准备运行的进程
该队列通常用链表实现,头结点指向第一个和最后一个PCB块的指针,每个PCB块包括指向下一个PCB的指针域 - 设备(Device)队列:包含了等待特定IO设备的进程列表,进程可能会有IO请求,请求时可能IO设备在处理其他请求,所以该进程需要等待。
讨论进程调度的常用方法是队列图
其中包括了就绪队列和设备队列(可能有多个设备队列)
3.2.2 调度程序
通常对于批处理系统,进程更多的是被提交、放到大容量存储设备的缓冲池中,保存在那里以便之后执行,在这之后,需要通过调度程序来选择缓冲池中的进程装入内存,并执行
进程选择由相应的调度程序执行,有两类调度程序:
长期调度程序(long-term schedule) / 作业调度程序(job schedule):负责从缓冲池中选择进程,装入内存以便执行
短期调度程序(short-term schedule) / CPU调度程序(CPU schedule):从执行的进程中选择进程,并为之分配CPU
有的系统,如分时系统,加入了中期调度程序(medium-term schedule),其核心思想是能将进程从内存(或CPU竞争中)移出,从而降低多道程序设计的难度,之后,进程可被重新调入内存,并从中断处执行。通过中期调度程序,进程可换出,并在之后换入,这种方案称为交换
各类进程调度的特点:
- 长期调度程序执行的不频繁(进程创建期间可能间隔数分钟)
- 短期调度程序执行的非常频繁(毫秒级),因此需要程序执行的速度非常快
- 长期调度程序控制多道程序(multiprogramming)设计的程度,在稳定情况下,创建进程的速度应该等于进程离开系统的平均速度
进程的类型:
- IO为主(就是操作主要是IO传输)
- CPU为主(就是操作主要是各种运算)
3.2.3 上下文切换
中断使CPU从当前任务改变为运行内核子程序。当发生一次中断的时候,系统需要保存当前程序的上下文,在恢复程序时需要恢复程序的上下文。
将CPU切换到另一个进程需要保存当前程序的状态并恢复另一个程序的状态,这个任务叫做上下文切换
进程的上下文也就是进程的PCB,上文提到过它的组成。
上下文切换的类型:
状态保存(state save): 保存当前CPU的状态(不论是内核模式还是用户模式)
状态恢复(state restore): 重新开始之前保存的状态
上下文切换是额外开销,切换时系统不能做其他任何有用的工作。其消耗的时间为几毫秒,具体的时间消耗和硬件支持密切相关。
有的操作系统提供了多组寄存器集合,上下文切换只需要简单改变当前寄存器组的指针。
3.3 进程操作
绝大多数系统内的进程能够并发执行,并动态的创建和删除,因此操作系统应该提供一种机制来创建 / 终止进程(即进程操作)
3.3.1 进程创建
进程树:进程在执行过程中,能够继续创建进程(系统调用),创建进程的进程为父进程,被创建的进程是子进程,以此类推,形成了进程树
一般系统都有一个根进程,负责创建其他所有的进程,这样一个系统的进程树只有一棵
进程是需要一定的资源的(CPU时间,内存,文件,IO设备),在一个进程创建子进程的时候,在父进程和子进程之间需要分配 / 共享资源,有以下几种情况:
- 从操作系统哪里获取资源
- 从父进程中获取资源(限制子进程只能从父进程中获取资源能防止创建过多的进程导致系统超载)
在进程创建时,该进程会得到:
- 各种物理和逻辑资源
- 父进程传递来的初始化数据或输入
- 通常子进程会返回给父进程自身的标识符(系统中唯一标识进程身份的id)
在进程执行时,有以下几种情况:
- 父进程和子进程并发执行
- 父进程等待,直到子进程执行完毕
创建的新进程的地址空间有两种可能:
- 子进程是父进程的复制品(有相同的程序和数据)
- 子进程内装入另一个新程序
关于fork()和exec():
fork命令创建一个新的进程
- exec命令在fork命令后执行,用于将新的程序装入进程的内存空间
3.3.2 进程终止
进程终止的时间:
- 执行完最后语句,并使用系统调用exit()请求操作系统删除自身。
- 一个进程通过适当的系统调用终止另一个进程(通常这个进程需要是被终止进程的父进程,并且这需要知道被终止进程的标识符)
父进程终止子进程的原因一般有:
- 子进程使用的资源超过了父进程分配的资源
- 分配给子进程的任务不再需要
- 父进程退出,在这种情况下,操作系统不允许子进程继续.有些系统如果一个进程终止,那么它所有的子进程都终止。这叫做级联终止。通常有操作系统进行
进程终止后:
进程会返回状态值**(通常为整数)到父进程**
所有进程资源会被操作系统释放
如果父进程终止,那么其所有子进程会以init进程作为父进程。因此,子进程仍然有一个父进程来收集状态和执行统计
3.4 进程间通信
并发执行的进程有两类,一类是 独立进程,不能影响其他进程并且不被其他进程影响。
另一类是协作进程,能影响其他进程或被其他进程影响
允许进程协作的优点:
- 信息共享
- 提高运算速度
- 模块化
- 方便
因此协作进程需要一种进程间通信机制(IPC)来允许进程相互交换数据与信息。有共享内存和信息传递两种类型:
共享内存系统
比消息传递更快
只在建立共享内存区时需要系统调用
消息传递:
不需要避免冲突
通常需要系统调用实现,需要更多的内核介入的时间消耗