进程:
概念:进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位
PID:当进程被创建时,操作系统会为该进程分配一个唯一的、不重复的“身份证号”
组成:
PCB(进程控制块):
【给操作系统用的】
- 基本的进程描述信息,可以让操作系统区分各个进程:记录PID、进程所属用户(UID)
- 可用于实现操作系统对资源的管理:记录进程分配了哪些资源(如:分配了多少内存、正在使用哪些I/O设备、正在使用哪些文件)
- 可用于实现操作系统对进程的控制、调度:记录进程的运行情况(如:CPU使用时间、磁盘使用情况、网络流量使用情况等)
程序段:程序的代码(指令序列)
【给进程自己用的】
数据段: 运行过程中产生的各种数据(如:程序中定义的变量)
【给进程自己用的】
特征:
动态性:【是进程最进程最基本的特征】进程是程序的一次执行过程,是动态地产生、变化和消亡地
并发性:内存中有多个进程实体,各进程课并发执行
独立性:进程是独立运行、独立获得资源、独立接受调度地基本单位
异步性:各进程按各自独立地、不可预知的速度向前推进,操作系统要提供“进程同步机制”来解决异步问题
结构性:每个进程都会配置一个PCB。结构上看,进程由程序段、数据段、PCB组成
状态:
创建态: 进程正在被创建时,它的状态时“创建态”,在这个阶段操作系统会为进程分配资源、初始化PCB
就绪态:当进程创建完成后,便进入“就绪态”,处于就绪态的进程已经具备运行条件,但由于没有空闲CPU,就暂时不能运行
运行态:如果一个进程此时在CPU上运行,那么这个进程就会处于“运行态”
阻塞态:
-
在进程运行的过程中,可能会请求等待某个事件的发生(如等待某种系统资源的分配,或者等待其他进程的相应)
-
在这个时间发生之前,进程无法继续往下执行,此时操作系统会让这个进程下的CPU,并让它进入“阻塞态”。
-
当CPU空闲时,又会选择另一个“就绪态”进程上CPU运行
终止态:一个进程可以执行exit系统调用,请求操作系统终止该进程。此时该进程会进入“终止态”,操作系统会让该进程下CPU,并回收内存空间等资源,最后还要回收该进程的PCB
状态的转换:
注意:不能由阻塞态直接转换为运行状态,也不能由就绪态直接转换为阻塞态(因为进入阻塞态是进程主动请求的,必然需要进程在运行时才能发出这种请求)
组织:
连接方式
执行指针:
- 指向当前处于运行态(执行态的进程)
- PCB2
- 单CPU计算机中,同一时刻只会有一个进程处于运行状态
就绪队列指针:
- 只想当前处于就绪态的进程
- PCB5->PCB1->PCB4
- 通常会把优先级高的进程放在队头
等待打印的阻塞队列:
- PCB3->PCB7
等待磁盘的阻塞队列:
- 很多操作系统还会根据阻塞原因不同,再分为多个阻塞队列
- PCB6
索引方式:
进程控制
主要功能:对系统中的所有进程实施有效的管理,它具有创新进程、撤销已有进程、实现进程状态转换等功能
原语:是一种特殊的程序,它的执行具有原子性。也就是说,这段程序的运行必须一气呵成,不可中断
进程的创建:
创建原语:
- 申请空白PCB
- 为新进程分配所需资源
- 初始化PCB
- 将PCB插入就绪队列
引起进程创建的事件:
- 用户登录:分时系统中,用户登陆成功,系统会为其建立一个新的进程
- 作业调度:多批道处理系统中,由新的作业放入内存时,会为其建立一个新的进程
- 提供服务:用户向操作系统提出某些请求时,会创建一个进程处理该请求
- 应用请求:由用户进程主动请求创建一个子进程
进程的终止:
撤销原语:【就绪态/阻塞态/运行态->终止态->无】
- 从PCB集合中找到终止进程的PCB
- 若进程正在运行,立即剥夺CPU,将CPU分配给其他进程
- 终止其所有进程(进程间的关系是树状结构)
- 将该进程拥有的所有资源鬼皇给父进程或操作系统
- 删除PCB
引起进程终止的事件:
- 正常结束(自己请求终止如:exit系统调用)
- 异常结束(整数除以0、非法使用特权指令,然后被操作系统强行杀掉)
- 外界干预(Ctrl+Alt+Delete,用户选择杀掉进程)
进程的阻塞和唤醒:
进程的阻塞:
阻塞原语:(运行态->阻塞态)
- 找到阻塞的进程对应的PCB
- 保护进程运行现场,将PCB状态信息设置为“阻塞态”,暂时停止进程运行
- 将PCB插入相应事件的等待队列
引起进程阻塞的事件:
- 需要等待系统分配某种资源
- 需要等待相互合作的其他进程完成工作
进程的唤醒:
唤醒原语:(阻塞态->就绪态)
- 在等待队列中找到PCB
- 将PCB从等待队列移除,设置进程为就绪态
- 将PCB插入就绪队列,等待被调度
引起进程唤醒的事件
- 等待事件的发生
进程的切换:
切换原语:(运行态->就绪态 / 就绪态->运行态)
- 将运行环境信息存入PCB
- PCB移入相应队列
- 选择另一个进程执行,并更新其PCB
- 根据PCB恢复新进程所需的运行环境
引起进程切换的事件:
- 当前进程时间片到
- 有更高优先级的进程到达
- 当前进程主动阻塞
- 当前进程终止
解决办法:在进程切换时先在PCB中保存这个进程的运行环境(保存一些必要的寄存器信息)
注意:另一个进程在运行过程中也会使用各个寄存器
进程通信
进程间通信(IPC):是指两个进程之间产生数据交互
进程通信需要操作系统支持:进程时分配系统资源的单位(包括内存地址空间),因此各进程拥有的内存地址空间相互独立。因此一个进程不能直接访问另一个进程的地址空间
共享存储:
基于存储区的共享:
-
为了避免出错,各个进程对共享空间的访问时互斥的
- 操作系统在内存中划出一块共享存储区,数据的形式,存放位置都由通信进程控制,而不是操作系统。
- 这种共享方式速度很快
- 是一种高级的通信方式
基于数据结构的共享:
- 比如共享空间只能放一个长度为10的数组
- 这种共享方式速度慢、限制多
- 是一种低级的通信方式
消息传递:
概念:进程间的数据交换以格式化的消息为单位。进程通过操作系统提供的“发送消息、接受消息”两个原语进行数据交换
消息头:包括发送进程ID、接受进程ID、消息长度等格式化的信息
直接通信:消息发送进程要指明接受进程的ID(点名道姓的消息传递)
间接通信:通过“信箱”间接地通信。因此又称为“信箱通信方式”(信箱通信方式)
管道通信:
- 管道只能采用半双工通信,某一段时间内只能实现单向的传输。如果要实现双同时通信,则需要设置两个管道
- 各进程要互斥地访问管道(由操作系统实现)
- 当管道写满时,写进程将阻塞,知道读进程将管道数据中的数据取走,即可唤醒进程
- 当管道读空时,读进程将阻塞,知道写进程往管道中写入数据,即可唤醒读进程
- 管道中的数据一旦被读出,就彻底消失。因此当多个进程读同一个管道时,可能会错乱。解决方案有①一个管道允许多个写进程,一个读进程 ②允许有多个写进程,多个读进程,但系统会让各个读进程轮流从管带中读取数据(Linux的方案)