处理机的执行方式分为系统态和用户态
进程控制一般是由内核来实现,内核的两大方面功能:
- 支撑功能:中断处理、时钟管理、原语操作
- 资源管理功能:进程管理、存储器管理、设备管理
进程的创建:
进程的层次结构:os允许一个进程创建另一个进程,所以形成了一个层次结构
子进程继承父进程的所拥有的资源,注意Windows不具有层次解构,每个进程之间多具有相同的的地位,但是一个进程创建另一个进程时,获得了一个句柄,作用相当于一个令牌,可以用来控制被创建的进程,这个令牌是可以传递的,也就是说,谁获得了令牌,谁就有控制该进程的权利。
进程图:Unix
进程创建的过程:
引起进程创建的事件:用户登录、作业调度、提供服务、(前三个都是由内核完成的)应用请求(这个是由用户进程自己创建的)。
首先申请一个空白的PCB,获得唯一的PCB标识符,为新进程分配所需的资源,资源各种:内存、文件、io、CPU时间等。操作系统为其分配内存空间时,需要知道需要多大的内存空间。如果是批处理作业,用户创建进程时提供。如果是应用进程创建子进程,也是该进程在提出创建进程请求时给出。然后初始化PCB,有标识信息、处理机状态信息、处理机控制信息。如果进程就绪队列能够接纳新的进程,就放入就绪进程队列。
进程的终止:
引起进程终止的事件:
正常结束,批处理系统会加一条holt指令。分时系统利用logs off 实现
异常结束:
- 越界错:进程访问的存储区超过了该进程。
- 非法指令:执行了不存在的指令
- 特权指令错:执行了一条只允许os去执行的指令
- 运行超时
- 等待超时
- 算术运算错
- i/o故障
- 外界干预:
操作系统或操作员的干预,比如系统发生了死锁,有操作员或操作系统采取终止的方式将系统从死锁状态解救出来
父进程请求:子进程完成父进程要求的工作后,父进程提出请求结束子进程
因父进程终止
进程终止的过程:
首先根据进程标识符,检索出要终止的进程,读到该进程的状态。然后,如果处于运行态,立刻终止,并置调度标志位真用于指示该进程被终止后,应重新进行调度,如果还有子进程,将子进程也终止,防止子进程变为不可控的进程。被终止得到进程将所有的资源归还给父进程,或者归还给系统将被终止进程移出所在队列,等待其他程序来收集信息。信息收集完毕后,删除PCB。
进程的阻塞:
引起阻塞的事件:
- 向系统请求资源失败:系统没有足够的资源分配时。
- 等待某种操作的完成:例如io操作
- 新数据尚未到达:例如进程a要对进程b输入得到数据进行处理时。
- 等待新任务的到达:比如网络环境下的发送进程,当所有的数据包发送完后,没有其他的数据包要发送时
进程的阻塞过程:
当发生引起阻塞的事件后,进程调用block原语,可见是一种主动行为,进入block后,由于处于运行状态,所以立即终止运行,改PCB中的状态参数为阻塞状态,并将其插入阻塞队列。如果是多阻塞队列,应将该进程插入具有相同事件的队列。
进程唤醒过程:
当阻塞状态的所期待的事件发生时,将等待该事件的进程唤醒,比如io操作完成后,就将其唤醒,首先存阻塞队列中移出,更改PCB中的状态值,然后将其插入就绪队列。
需要指出的是,block,和wakeup需要成对存在。否则可能永久处于阻塞状态。
进程的挂起过程:
引起挂起的事件:
- 终端用户发现一些问题,希望暂停运行,以便于用户研究执行情况和程序更改。
- 父进程有需要让其暂停运行,以便协调各个子进程之间的活动,以及考查修改子进程。
- 操作系统,以便于检查运行中资源的使用情况或进行记账。
- 负荷调节的需要,当实时系统的负荷过重时,挂起不重要的进程,保证任务的完成时间,和系统的正常运行。
挂起的过程:
首先检查状态,如果处于活动就绪就该为静止就绪,如果处于活动阻塞就改为静止阻塞,为了方便考查进程运行情况,把进程的PCB放到指定的内存区域,叫做存储交换区。如果是运行态变为静止就绪。
进程的激活过程:
现将进程从外存调入内存,检查进程的现行状态,如果静止就绪,就改为活动就绪,如果是静止阻塞,就改为活动阻塞。如果采用抢占策略,每当插入就绪队列时,应该检查与当前进程得到优先级,看是否要进行调度。