OS-进程模型
总结引自清华大学操作系统课程。
进程概念
进程是指一个具有一定独立功能的程序在一个数据集合上的依次动态执行过程。
如下图所示一个程序的执行,需要经历编译和链接生成可执行文件,然后经过 加载到进程地址空间,最右图所示:
程序加载到进程地址空间后的样子:
进程的组成
简单来说,进程包括了正在运行的一个程序的所有状态的信息。具体说来,包括:
代码
数据
状态寄存器,CPU状态CR0,指令指针IP
通用寄存器,AX,BX,CX
进程占用系统资源,比如打开文件,已分配内存。。。
进程的特点
动态性,并发性,独立性,制约性,看下图为进程的执行过程,实际上进程也是某一时刻只有一个进程执行,在宏观上感觉是并发执行的。
进程与程序的联系
联系
- 进程是操作系统处于执行状态对程序的抽象。程序 = 文件(静态的可执行文件);进程 = 执行中的程序 = 程序 + 执行状态
- 同一个程序的多次执行过程对应为不同的进程,如命令 ls 的多次执行对应多个进程。
- 进程执行需要的资源:内存:保存代码和数据;CPU:执行指令
区别
- 进程是动态的,程序时静态的。程序是有序代码的集合,进程是程序的执行,进程有核心态和用户态。
- 进程是暂时的,程序是永久的。
- 进程与程序的组成不同,进程的组成包括程序,数据和进程控制块。
进程控制块
概念(PCB,Process Control Block)
操作系统管理控制进程运行所用的信息集合。操作系统用PCB来描述进程的基本情况以及运行变化的过程,PCB是进程存在的唯一标识,每个进程都在操作系统中有一个对应的PCB。
使用
进程创建时,生成该进程的PCB;进程终止时,回收它的PCB。进程的组织管理都是通过对PCB的组织管理来实现。
组织
- 链表,同一状态的进程其PCB组成一链表,多个状态对用多个不同的链表。
- 索引表,同一状态的进程归入一个索引表,由索引指向PCB,多个状态的对应多个不同的索引表。
进程状态
进程创建
引起进程创建的情况:系统初始化时,用户请求创建一个新进程;正在运行的进程执行了创建进程的系统调用。
进程就绪
进程创建后就排到就绪队里里头,等待中央处理器的调用。
进程由就绪变为运行
在就绪队列中,如果处理机没有其他进程运行,那它直接调度当前创建的进程由就绪变为运行。如果有多个进程在就绪状态,内核如何选择一个就绪的进程呢? 这就需要调度算法,会根据进程执行的特征。
进程由运行变为等待
如果进程执行的条件不够,或者说外部资源不足够,这时候进程会进入等待状态。等待状态可能的原因:
1. 请求并等待系统服务,无法马上完成。
2. 启动某种操作,无法马上完成。
3. 需要的数据没有到达
注意:只有进程自身才能知道何时需要等待某种事件的发生。
进程由运行变为就绪
运行的进程被强占。发生的情况:
1. 高优先级进程就绪
2. 运行的进程执行当前时间用完
由等待变为就绪
唤醒进程的情况:
1. 被阻塞的进程需要的东西可被满足
2. 被阻塞的进程等待的事件到达。
注意:进程只能被别的进程或者操作系统唤醒。等待的进程不会因自身被唤醒。
进程由运行变为退出
进程结束的情况:
1. 正常退出(自愿的)
2. 错误退出(自愿的)
3. 致命错误(强制性的)
4. 被其他进程所杀(强制性的)
例子
例子很简单,简单到只有一个 sleep(2000),返回。那么在这个过程中发生了什么?
首先需要创建进程 ME 所需要的资源,如内存,进程控制块,相关的数据完成数据化等。完成之后进入就绪状态,就绪的意思是把上一步创建的进程控制块等资源放到就绪队列中,挂到就绪队列中后等待CPU的调度,如果当前正在运行的进程退出或者说被抢先后导致等待,此时 ME 进程终于获得了运行机会(从就绪变为运行状态),占用CPU来开始执行,执行过程中会进入到sleep这个系统调用,这个调用呢它设置好内核中的定时器,中间这两秒它是做不了任何事情的,在这2秒的过程中 ME 将会进入等待状态。此时,CPU会调度其他就绪队列中的进程运行,这就是进程切换。等到2秒钟到了后,内核中的计时器会给系统一个中断 ,并告知中断的原因是什么,并找到这个进程。好,通知后,操作系统会把这个处于等待状态的进程 ME 放到就绪队列中去,并且把 ME 的等待事件设置为出现,然后等待CPU的调度。等到ME可以占用CPU 执行时,ME又由就绪变为运行。接下来程序返回,就是由运行变为退出,然后把它所占用的资源全部还回去。这样进程的整个生命周期就算结束了。
上面例子发生的进程切换
进程切换的示意图: