进程是一个具有独立功能的程序关于某个数据集合的一次运行活动。它可以申请和拥有系统资源,是一个动态的概念,是一个活动的实体。它不只是程序的代码,还包括当前的活动,通过程序计数器的值和处理寄存器的内容来表示。
进程的概念主要有两点:
进程是一个实体,每一个进程都有它自己的地址空间,一般情况下,包括文本区域(text region)、数据区域(data region)和堆栈(stack region)。文本区域存储处理器执行的代码;数据区域存储变量和进程执行期间使用的动态分配的内存;堆栈区域存储着活动过程调用的指令和本地变量。
进程是一个“执行中的程序”,程序是一个没有生命的实体,只有处理器赋予程序生命时,它才能成为一个活动的实体,我们称其为进程。
进程的基本状态
阻塞态:等待某个事件的完成;
就绪态:等待系统分配处理器以便运行;
执行态:占有处理器正在运行。
执行态 -> 阻塞态:往往是由于等待外设,等待主存等资源分配或等待人工干预而引起的。
阻塞态 -> 就绪态:则是等待的条件已满足,只需分配到处理器后就能运行。
执行态 -> 就绪态:不是由于自身原因,而是由外界原因使运行状态的进程让出处理器,这时候就变成就绪态。例如时间片用完,或有更高优先级的进程来抢占处理器等。
就绪态 -> 执行态:系统按某种策略选中就绪队列中的一个进程占用处理器,此时就变成了运行态
进程调度
上下文切换
线程/进程的上下文(以下统称为:上下文)主要包含两个部分:寄存器(尤其是 PC)和操作系统需要的特定数据(PCB)。上下文切换(context switch),是一个存储和重建 CPU 的过程,完整的上下文会涉及到这两部分的切换,旧的上下文被保存,新的上下文被加载。
当系统发生中断或者 OS 进行线程调度时会进行上下文切换。
调度种类
高级、中级和低级调度作业从提交开始直到完成,往往要经历下述三级调度:
高级调度:又称为作业调度,它决定把后备作业调入内存运行;
中级调度:又称为在虚拟存储器中引入,在内、外存对换区进行进程对换。
低级调度:又称为进程调度,它决定把就绪队列的某进程获得CPU;
非抢占式调度与抢占式调度
非抢占式:分派程序一旦把处理机分配给某进程后便让它一直运行下去,直到进程完成或发生进程调度进程调度某事件而阻塞时,才把处理机分配给另一个进程。
抢占式:操作系统将正在运行的进程强行暂停,由调度程序将CPU分配给其他就绪进程的调度方式。
调度策略的设计
响应时间:从用户输入到产生反应的时间
周转时间:从任务开始到任务结束的时间
平均周转时间:周转总时间除以作业个数
CPU任务可以分为交互式任务和批处理任务,调度最终的目标是合理的使用CPU,使得交互式任务的响应时间尽可能短,用户不至于感到延迟,同时使得批处理任务的周转时间尽可能短,减少用户等待的时间。
调度算法
FCFS:调度的顺序就是任务到达就绪队列的顺序。对短作业不公平。
SJF:最短的作业(CPU区间长度最小)最先调度。