1)运行态:进程正在处理机上运行。在单处理机环境下,每个时刻最多只有一个进程处于运行态。 2)就绪态:进程已处于准备运行状态,即进程获得了除处理机外的一切所需资源,一旦得到处理机即 可运行。 3)阻塞态:又称为等待态。进程正在等待某一事件而暂停运行,如等待某资源为可用(不包括处理机)或 等待输入/输出完成。即使处理机空闲,该进程也不能运行。 4)创建态:进程正在被创建,尚未转到就绪态。创建进程通常需要多个步骤:首先申请一个空白的 PCB,并向PCB中填写一些控制和管理进程的信息;然后由系统为该进程分配运行时所需的必要资源, 最后把该进程转入就绪态。 5)结束态:进程正在从系统中消失,可能是进程正常结束或其它原因中断退出运行,进程需要结束运 行时,系统首先必须置该进程为结束态,然后再进一步处理资源释放和回收工作。
五种状态的基本转换 (1)就绪态->运行态:处于就绪的进程被调度后,获得处理机资源(分派处理机时间片),于是进程就由就绪态转为运行态。 (2)运行态->就绪态:处于运行态的进程在时间片用完后,不得不退出处理机,从而进程由运行态转为就绪态。此外,在可剥夺的操作系统中,当有更高优先级的进程就绪时,调度程序将正在执行的进程转为就绪态,让更高优先级的进程执行。 (3)运行态->阻塞态:进程请求某一资源(如外设)的使用和分配或等待某一事件的发生(如I/O操作的完成)时,它就从运行态转阻塞态。 (4)阻塞态->就绪态:进程等待的事件到来时,如I/O操作结束或中断结束时,中断处理程序必须把相应进程的状态由阻塞态转换为就绪态。 【注】进程从运行态转变为阻塞态是主动行为,而从阻塞态变成就绪态是被动行为,需要其它相关进程的协助。在操作系统中,一般把进程控制的程序称为原语,原语的特点是执行期间不允许被中断,它是一个 不可被分割的基本单位。
1. 进程的创建
子进程与父进程允许一个进程创建另一个进程。此时创建者称为父进程,被创建的进程称为子进程,子进程可以继承父进程所拥有的资源。当子进程被撤销时,应将其从父进程那里获得的资源归还给父进程。此外,在撤销父进程时,必须同时撤销其所有子进程。
引起进程创建的事件终端用户登录、作业调度、系统提供服务、用户程序的应用请求等
操作系统创建一个新进程的过程1)为新进程分配一个唯一的进程标识号,并申请一个空白的PCB(PCB是有限的)。若PCB申请失败,则创建失败。 2)为进程分配资源,为新进程的程序和数据及用户栈分配必要的内存空间(在PCB中体现)。 【注】若资源不足(如内存空间),则并不是创建失败,而是处于**“等待态”或称为“阻塞态”,等待的是内存这个资源。 3)初始化PCB,主要包括初始化标志信息**、初始化状态信息和初始化处理机控制信息,以及设置进程的优先级等。 4)若进程就绪队列能够接纳新进程,则将新进程插入就绪队列,等待被调度运行。
2. 进程的终止
引起进程终止的事件 1)正常结束:表示进程的任务以及完成并准备退出。 2)异常结束:表示进程运行时,发送了某种异常事件,使程序无法继续运行,如存储区越界、非法指令、特权指令错、保护错、I/O故障等。 3)外界干预:指进程应外界的请求而终止运行,如操作员或操作系统干预、父进程请求和父进程终止。进程终止的过程 1)根据被终止的标识符,检索PCB,从中读出该进程的状态。(读状态) 2)若被终止进程处于执行状态,立即终止该进程的执行,将处理机资源分配给其他进程。(终止执行) 3)若该进程还有子进程,则应将其所有的子进程终止。(终止子进程) 4)将该进程所拥有的全部资源归还给其父进程,或归还给操作系统。(还资源) 5)将该PCB从所在队列中删除。(删PCB)3. 进程的阻塞和唤醒
引起进程由执行态变为阻塞态的事件 正在执行的进程,由于期待的某些事件未发生,如请求系统资源失败、等待某种操作的完成、新数据尚未到达或无新工作可做等,由系统自动执行阻塞原语(Block),使自己由运行态变为阻塞态。当被阻塞进程所期待的事件发生时,由有关进程调用唤醒原语(Wakeup),将等待该事件的进程唤醒。阻塞原语的执行过程 1)找到将要被阻塞进程的标识号对应的PCB。(找PCB) 2)若该进程为运行态,则保护其现场,将其状态转为阻塞态,停止运行。(转状态) 3)把该PCB插入相应事件的等待队列。(插入等待队列)唤醒原语的执行过程 1)在该事件的等待队列中找到相应进程的PCB。(找PCB) 2)将其从等待队列中移出,并置其状态为就绪态。(从等待队列中移出) 3)把该PCB插入就绪队列,等待调度程序调度。(插入就绪队列) 【注】阻塞原语和唤醒原语是一对作用刚好相反的原语,必须成对使用。Block原语是由被阻塞进程自我调用实现的,而Wakeup原语则是由一个与被唤醒进程合作或被其它相关进程调用实现的。4.进程切换 进程的切换是指处理机从一个进程的运行跳到另一个进程上运行。进程的切换是在内核的支持下实现的,因此可以说,任何进程都是在操作系统内核的支持下运行的,是与内核紧密相关的。
进程的切换过程 1)保存处理机上下文,包括程序计数器和其他寄存器。 2)更新PCB信息 3)把进程的PCB移入相应的队列,如就绪、在某事件阻塞等队列。 4)选择另一个进程执行,并更新其PCB。 5)更新内存管理的数据结构 6)恢复处理机上下文进程切换与处理机模式切换的区别 注意,进程切换与处理机模式切换是不同的,模式切换时,处理机逻辑上可能还在同一进程中运行。若进程因中断或异常进入核心态运行,执行完后又回到用户态刚被中断的程序运行,则操作系统只需恢复进程进入内核时保存的CPU现场,而无需改变当前进程的环境信息。但若要切换进程,当前运行进程改变了,则当前进程的环境信息也需要改变。进程的通信是指进程之间的信息交换。PV操作是低级通信方式,高级通信方式是指以较高的效率传输大量数据的通信方式。
4.线程的实现方式
用户级线程 在用户级线程中,有关线程管理的所有工作都由应用程序完成,内核意识不到线程的存在。应用程序可以通过使用线程库设计成多线程程序。通常,应用程序从单线程开始,在该线程中开始运行,在其运行时刻,可以通过调用线程库中派生例程创建一个在相同进程中运行的新线程。内核级线程 内核级程序中,线程管理所有工作由内核完成,应用程序没有线程管理的代码,只有一个到内核级线程的编程接口。内核为进程及其内部的每个线程维护上下文信息,调度也在内核基于线程架构的基础上完成。 有些系统中使用组合方式的多线程实现。线程创建完全在用户空间中完成,线程的调度和同步也在应用程序中进行。一个应用程序中的多个用户级线程被映射到一些(小于等于用户级线程的数目)内核线程上。 5.多线程模型多对一模型 将多个用户级线程映射到一个内核级线程,线程管理在用户空间完成。此模式中,用户级线程对操作系统不可见(透明)。 优点:线程管理是在用户空间进行的,因而效率比较高。 缺点:一个线程在使用内核服务时被阻塞,整个进程都会被阻塞;多个线程不能并行的运行在多处理机上。一对一模型 将用户级线程映射到一个内核级线程。 优点:当一个线程被阻塞后,允许另一个线程继续运行,所以并发能力较强。 缺点:每创建一个用户级线程都需要创建一个内核线程与其对应,这样创建线程的开销比较大,会影响到应用程序的性能。多对多模型 将n个用户级线程映射到m个内核线程上,要m小于等于n。 特点:多对多模型是多对一和一对多模型的折中,即克服了多对一模型并发度不高的特点,又克服了一对一模型的一个用户进程占用太多内核级线程而开销太大的缺点。1.调度的基本概念 在多道程序系统中,进程的数量往往多于处理机的个数,因此进程争用处理机在所难免。处理机调度是多道程序操作系统的基础,是操作系统设计的核心问题。 2.调度的层次 一个作业从提交开始直到完成,往往要经历以下三级调度。 1)作业调度 2)中级调度 3)进程调度 3.三级调度的联系 作业调度从外存的后备队列中选择一批作业进入内存,为他们建立进程,这些进程被送入就绪队列,进程调度从就绪队列中选出一个进程,把其状态改为运行态,把CPU分配给它。中级调度是为了提高内存的利用率,系统将那些暂时不能运行的进程挂起来。当内存空间宽松时,通过中级调度选择具备运行条件的进程,将其挂起。 1)作业调度为进程活动做准备,进程调度使进程正常活动起来,中级调度将展示不能运行的进程挂起,中级调度处于作业调度和进程调度之间。 2)作业调度的次数少,中级调度次数略多,进程调度的频率最高。 3)进程调度是最基本的,不可或缺的。
进程调度和切换程序是操作系统内核程序。请求调度事件发生后,才可能运行进程调度程序。调度了新的就绪进程后,才会进行进程间的切换。理论上这三件事应该顺序执行,但在实际设计中,操作系统内核程序运行时,若某时发生了引起进程调度的因素,则不一定能马上进行进程调度与切换。 现代操作系统中,不能进行进程的调度与切换的情况有以下几种: (1)在处理机中断的过程。 (2)进程在操作系统内核程序临界区中。 (3)其他需要完全屏蔽中断的原子操作过程中。如加锁、解锁、中断保护现场、恢复等原子操作。 【注】当进程处于临界区时,说明进程正在占用处理机,只要不破坏临界资源的使用规则,是不会影响处理机调度的。
应该进行进程调度和切换的情况如下:(1)发生引起调度条件且当前进程无法继续运行下去时,可以马上进行调度和切换。属于非剥夺调度。 (2)中断处理结束或自陷处理结束后,返回被中断进程的用户态程序执行现场前,若置上请求调度标志,即可马上进行进程调度与切换。属于剥夺调度。
1)非剥夺调度方法,又称非抢占方式 2)剥夺调度方法,又称抢占方式
略
1.临界资源 我们将一次只允许一个进程使用的资源称为临界资源。许多物理设备都属于临界资源,如打印机等。此外,还有许多变量、数据等都可以被若干进程共享,也属于临界资源。 在每个进程中,访问临界资源的那段代码成为临界区。为了保证临界资源的正确使用,可把临界资源的访问过程分为4个部分: 1)进入区:为了进入临界区使用临界资源,在进入区要检查是否进入临界区,若能进入临界区,则设置正在访问临界区标志,以阻止其他进程同时进入临界区。 2)临界区:进程中访问临界资源的那段代码,又称为临界段。 3)退出区:将正在访问临界区的标志清楚。 4)剩余区:代码中的其余部分。 2.同步 同步亦称直接制约关系,是指完成某任务而建立的两个或多个进程,这些进程因为需要在某些位置上协调他们的工作次序而等待、传递消息所产生的制约关系。进程的直接制约关系源于他们之间的合作。 3. 互斥 互斥也称为间接制约关系。当一个进程进入临界区使用临界资源时,另一个进程必须等待,当占用 临界区资源的进程退出临界区后,另一个进程才允许去访问此临界资源。 为了禁止两个进程同步进入临界区,同步机制应该遵循以下准则: 1)空闲让进。 2)忙则等待。 3)有限等待。 4)让权等待。
软件、硬件
信号量是一种功能较强的机制,可用来解决互斥与同步问题,它只能被两个标准原语wait(S)和signal(S)访问,也可记为“P操作”和“V操作”。 【注】原语是指完成某种功能且不被分割、不被中断执行的操作序列,通常可由硬件来实现。例如前述的Test-and-Set和Swap指令就是由硬件实现的原子操作。 1.整型信号量 整型信号量被定义为一个用于表示资源数目的整型量S 2.记录型信号量 记录型信号量是不存在“忙等”现象的进程同步机制。除需要一个用于代表资源数目的整型变量value 外,再增加一个进程链表L,用于链表所有等待该资源的进程。 3.利用信号量实现同步 4. 利用信号量实现进程互斥