进程的定义
某种程度上,进程代表程序的执行过程,会消耗各种资源(CPU 内存 IO等等)
一个具有一定独立功能的程序在一个数据集合上的一次动态执行过程。
进程的组成
一个进程应该包括
- 程序的代码
- 程序处理的数据
- 程序计数器中的值,表示下一条将运行的指令
- 一组同样的寄存器的当前值,堆,栈
- 一组系统资源(比如打开的文件)
总之,进程包含了正在运行的一个程序的所有状态信息。
进程和程序的联系 - 程序是产生进程的基础
- 程序的每次运行构成不同的进程
- 进程是程序功能的体现
- 通过多次执行,一个程序可对应多个进程,通过调用关系,一个进程可包括多个程序。
进程和程序的区别 - 进程是动态的,程序是静态的;程序是有序代码的集合,进程是程序的执行,进程有核心态和用户态(需要操作系统帮助完成某一功能 比如读取文件,此时向操作系统发送请求,操作系统代表进程执行功能,此时处于核心态)
- 进程是暂时的,程序是永久的。进程是一个状态变化的过程,程序可长久保存
- 进程和程序的组成不同:进程的组成包括程序、数据和进程控制块
进程与程序的关系类比
有一个计算机科学家,想亲手给女儿做一个生日蛋糕。所以它就找了以本有关做蛋糕的食谱,买了一些原料,面粉、鸡蛋、糖、香料等,然后边看边做。
食谱=程序;科学家=CPU;原料=数据;做蛋糕=进程
进一步延展
这时小儿子跑进来,说手被蜜蜂蛰了,科学家只好停下手中的活,他在食谱上做了个标记,把状态信息保存了起来。
然后又去找了一本医疗手册,查到了相关的内容,按照上面的指令一步步执行。当伤口处理完之后,又回到厨房从上次停下的位置继续做蛋糕。
这就好比一个进程执行过程中,CPU要去执行另一个进程,那会记录当前进程的状态信息,当回来继续执行该进程的时候,会reload状态信息,从上一次停止的地方开始执行。
进程的特点
动态性:可动态的创建、结束进程
并发性:进程可以被独立调度并占用CPU运行。
独立性:不同进程的工作不相互影响(操作系统给不同的进程分配不同的页表,保证每个进程在独立的内存空间中运行)
制约性:因访问共享数据/资源或进程间同步而产生制约。
程序=算法+数据结构
描述进程的数据结构:进程控制块(Process Control Block,PCB)
操作系统为每个进程都维护了一个PCB,用来保存与该进程有关的各种状态信息。
进程控制结构
进程控制块:操作系统管理控制进程运行所用的信息集合
操作系统用PCB来描述进程的基本情况以及运行变化的过程
PCB是进程存在的唯一标识
进程的创建:为该进程生成一个PCB
进程的终止:回收它的PCB
进程的组织管理:通过对PCB的组织管理来实现
PCB含有3大类信息
(一)进程标识信息。入本进程的标识,本进程的产生者标识(父进程标识);用户标识
(二)处理机状态信息保存区。保存进行的运行现场信息
- 用户可见寄存器,用户程序可以使用的数据,地址等寄存器
- 控制和状态寄存器,如程序计数器(PC),程序状态字(PSW)
- 栈指针,过程调用/系统调用/中断处理和返回时都需要用到它
(三)进程控制信息 - 调度和状态信息,用于操作系统调度进程并占用处理机使用
- 进程间通信,为支持进程间的与通信相关的各种标识,信号,信件等,这些信息存在接受方的进程控制块中。
- 存储管理信息,包含有指向本进程映像存储空间的数据结构
- 进程所用资源,说明由进程打开,使用的系统资源,如打开的文件
- 有关数据结构连接信息,进程可以连接到一个进程队列中,或连接到相关的其它进程的PCB
PCB的组织方式:链表和索引表 - 链表:同一状态的进程其PCB成一链表,多个状态对应多个不同的链表。各状态的进程形成不同的链表:就绪链表,阻塞链表。
- 索引表:同一状态的进程归入一个index表(由indx指向PCB),多个状态对应多个不同的index表-
进程的生命周期
进程的生命期管理:
进程创建
引起进程创建的3个主要事件:
- 系统初始化时
- 用户请求创建一个新进程
- 正在运行的进程执行了创建进程的系统调用
进程运行
内核选择一个就绪的进程,让它占用处理机执行
进程等待
- 请求并等待系统服务,无法马上完成
- 启动某种操作,无法马上完成
- 需要的数据没有到达。
进程只能自己阻塞自己,因为只有进程自身才能知道何时需要等待某种事件的发生。
进程唤醒
唤醒进程的原因 - 被阻塞进程需要的资源可被满足
- 被阻塞进程等待的事件达到
- 将该进程的PCB插入到就绪队列
进程只能被别的进程或操作系统唤醒。
进程结束 - 正常退出(自愿的)
- 错误退出(自愿的)
- 致命错误(强制性的)
- 被其它进程所杀(强制性的)
进程状态变化模型
三种基本状态:
运行状态(Running):当一个进程正在处理机上运行
就绪状态(Ready):一个进程获得了除处理机之外的一切所需资源,一旦得到处理机即可运行
等待状态(又称阻塞状态 Blocked):一个进程正在等待某一事件而暂停运行时,如等待某资源,等待输入/输出完成。
进程的其它状态:
创建状态(New):一个进程正在被创建,还没有被转到就绪状态之前的状态
结束状态(Exit):一个进程正在从系统中消失时的状态,这是因为进程结束或由于其它原因造成。
进程挂起
进程在挂起状态时,意味着进程没有占用内存空间。处在挂起状态的进程映像在磁盘上。
- 阻塞挂起状态(Blocked-suspend):进程在外存并等待某事件的出现。
- 就绪挂起状态(Ready-suspend):进程在外存,但只要进入内存,即可运行。
解挂/激活(Activie):把一个进程从外存转到内存,可能有以下几种情况
- 就绪挂起到就绪:没有就绪进程或者挂起就绪进程优先级高于就绪进程时,会进行这种转换。
- 阻塞挂起到阻塞:当一个进程释放足够内存时,系统会把一个高优先级阻塞挂起(系统认为会很快出现所等待的事件)进程转换为阻塞进程。
问题:OS怎么通过PCB和定义的进程状态来管理PCB,帮助完成进程的调度过程?
状态队列
- 由操作系统来维护一组队列,用来表示系统当中所有进程的当前状态
- 不同的状态分别用不同的队列来表示(就绪队列、各种类型的阻塞队列)
- 每个进程的PCB都根据它的状态加入到相应的队列中,当一个进程的状态发生变化时,它的PCB从一个状态队列中脱离出来,加入到另一个队列。
上下文切换
停止当前运行进程(从运行状态改变成其它状态)并且调度其它进程(转变为运行状态)
创建进程
Unix进程创建系统调用:fork/exec
fork()把一个进程复制成二个进程
parent(old PID), child(new PID)
exec()用新程序来重写当前进程
PID没有改变
等待和终止进程
wait()系统调用是被父进程用来等待子进程的结束
子进程执行了exit(),但父进程已经先于子进程死亡,此时没有父进程在等待它执行wait(),此时子进程就交给祖宗进程(init进程、root进程)管理,会定期扫描队列中是否有僵尸线程,如果有 会进行回收。