进程管理和处理器调度详稿10学时.docx
- 文档编号:28512175
- 上传时间:2023-07-18
- 格式:DOCX
- 页数:56
- 大小:298.77KB
进程管理和处理器调度详稿10学时.docx
《进程管理和处理器调度详稿10学时.docx》由会员分享,可在线阅读,更多相关《进程管理和处理器调度详稿10学时.docx(56页珍藏版)》请在冰豆网上搜索。
进程管理和处理器调度详稿10学时
引言:
本章首先详细介绍操作系统最重要的概念——进程,接着并讨论进程状态的变迁,然后分析进程的管理,包括进程的创建和撤销、阻塞和唤醒、挂起和激活,最后详细介绍操作系统的处理器管理,处理器管理是操作系统中最核心的组成部分,直接影响系统性能。
3.1进程
一、为什么要引入进程
1.程序的顺序执行
在没有引入多道程序设计之前,程序都是顺序执行的。
同一时刻,内存中只有一道程序在运行。
前一个程序执行完毕,下一个程序才开始运行,不存在一个程序在运行过程中又交替执行另一个程序的情况。
不仅程序之间是顺序执行的,而且程序内部也是顺序执行。
程序中的所有操作必须按照某种先后次序执行,仅当前一操作执行完后,下一操作才开始执行。
程序的顺序执行具有如下特点:
(1)顺序性
处理机顺序地执行程序所规定的操作,只有前一操作结束才能执行下一个操作。
(2)封闭性
程序在执行过程中独占系统分配给它的所有资源(处理机、内存、外设和信息资源等),其执行过程不受外界因素的干扰。
一般又把程序顺序执行的封闭性称为资源的独占性。
(3)结果的可再现性
程序的执行与初始条件和执行环境有关有关,而与执行时间无关。
只要程序的初始条件和执行环境相同,重复执行一个程序获得的结果总是相同的。
2.程序的并发执行
引入多道程序设计之后,程序可并发执行,即两个或两个以上的程序在执行时间上有重叠,即一个程序的第一个操作是在另一个程序的最后一个操作完成之前开始的。
并发执行的程序不再处在一个封闭的环境中,出现了许多新的特征:
(1)共享性
在多道程序设计环境下,内存中有多个程序存在,它们共享一切系统资源,包括处理机、内存、各种外部设备、以及程序和数据。
(2)间断性
在多道程序设计环境下,每个程序的执行不再是连续的而是走走停停的。
例如,一个程序因等待某个事件的发生或所申请的资源得不到满足而暂停执行。
或者,为完成同一任务而相互合作的并发程序之间存在一定的制约关系,一个程序的执行将有赖于另一个合作程序的消息或信号,在没有收到来自于另一个程序的消息或信号之前,它只能等待。
(3)结果的不可再现性。
程序并发执行时既然失去了封闭性,随之也就失去了结果可再现这一特特点。
例如,两个程序P1和P2共享三个变量x、y和z,初始情况下有x=y=z=1,P1和P2的语句序列如下:
程序P1程序P2
y=x+2;①x=x+1;③
z=y+1;②x=x+z;④
按照①→③→②→④的执行轨迹:
x=6,y=3,z=4;
按照③→①→④→②的执行轨迹:
x=3,y=4,z=5。
由于多道程序设计环境下程序的并发执行具有新的特征,操作系统需要引入新的概念来刻画系统内部出现的动态情况,描述系统内部各道程序的活动规律,这一概念就是进程。
二、进程的定义和属性
1.进程的定义
进程(process)这个名词最早是由MIT在设计MULTICS和IBM公司开发TSS360系统时提出的,直到现在为止对于进程的名称和定义都不统一。
不同的系统中采用不同的术语名称:
MIT称进程(process),IBM称任务(task)和Univac公司称活动(active);
现存多种关于进程的定义:
(1)一个正在执行的程序。
(2)一个正在计算机上执行的程序实例。
(3)能分配给处理器并由处理器执行的实体。
(4)一个具有以下特征的活动单元:
一组指令序列的执行、一个当前状态和相关的系统资源集合。
国内学术界较为一致的看法是:
进程是一个可并发执行的具有独立功能的程序关于某个数据集合的一次执行过程,也是操作系统进行资源分配和保护的基本单位(1978年全国操作系统学术会议)。
2.进程的属性
(1)结构性
每个进程至少有三要素组成:
程序块、数据块和进程控制块。
(2)共享性
同一个程序可以运行在不同的数据集上,从而构成不同的进程。
或者,多个不同的进程可以共享相同的程序。
【思考】进程和程序的关系?
(3)动态性
进程是程序在数据集上的一次执行过程,是一个动态的概念。
它有生命周期,因创建而产生,由调度而执行,因撤消而消亡。
程序是静态,是一种信息资源。
(4)独立性
进程既是系统中资源分配和保护的基本单位,也是系统调度和独立单位,凡是未建立进程的程序都不能直接运行。
(5)制约性
并发进程之间存在着制约关系(同步或互斥),进程在某些关键点上需要相互等待互通消息,以保证程序执行的可再现性和计算结果的惟一性。
(6)并发性
进程可以并发执行,从而改进资源利用率和提高系统效率。
通过进程需要执行的指令序列来描述单个进程的行为,把这样的序列称为进程的轨迹。
通过给出各个进程的轨迹是如何被交替的来描述处理器的行为。
考虑下面这个简单的例子:
现在有3个进程A、B和C,图3.1给出了三个进程在执行过程早期的轨迹,进程A的程序起始地址为5000,进程B的程序起始地址为8000,进程C的程序起始地址为12000。
进程B的第4条指令执行一个I/O操作。
另外在操作系统中有一个调度器,用于实现进程切换。
为了简化讨论,假设设调度器中只有6条指令。
最后假设操作系统仅允许一个进程最多连续执行6个指令周期,在此之后将被中断,这可避免任何一个进程独占处理器时间。
图3.2给出了最初52个周期中交替轨迹。
三、进程的创建和终止
无论采用哪种进程行为模型,进程的生命周期始终围绕着进程的创建和终止。
在这里有必要先讨论一下进程的创建和终止。
1.进程的创建
通常有四个事件会导致一个进程的创建:
(1)新的批处理作业
在批处理环境中,响应作业提交时会创建进程。
(2)交互登录
在交互环境下,当一个新用户试图登录时会创建进程。
(3)操作系统因为提供一项服务而创建
操作系统可能会代表用户程序创建进程。
例如,如果用户请求打印一个文件,则操作系统可以创建一个管理打印的进程,从而使发出请求的进程可以继续执行而无需等待。
(4)由现有的进程派生
允许一个进程引发另一个进程的创建是很有用的。
例如,一个应用程序进程可以产生另一个进程,以接受应用产生的数据,并将数据组织成适于以后分析的格式。
新进程与应用程序并行地运行,并当得到新的数据时被激活,这个方案对构造应用程序是非常有用的。
当操作系统为另一个进程的显式请求创建一个进程时,这个动作称为进程派生。
当一个进程派生另一个进程时,前一个称为父进程,被派生的进程称为子进程。
2.进程的终止
(1)正常完成
任何一个计算机系统都必须为进程提供表示其完成的方法。
批处理作业中包含一个Halt指令或一个操作系统服务调用用于终止;交互式应用程序,由用户的行为指出何时进程完成。
这些行为将导致给操作系统发出一个服务请求,以终止发出请求的进程。
例如,分时系统中,当用户退出系统或关闭终端时,该用户的进程被终止。
个人计算机或工作站中,用户可以结束一个应用程序(如字处理或电子表格)。
(2)错误和故障
●超过时限:
进程运行时间超过规定的时限。
●无可用内存:
系统无法满足进程需要的内存空间。
●越界:
进程试图访问不允许访问的内存单元。
●保护错误:
进程试图使用不允许访问的资源或文件,或者试图以一种不正确的方式使用,如往只读文件中写。
●算术错误:
进程试图进行被禁止的计算,如除以零。
●时间超出:
进程等待某一事件发生的时间超过了规定的最大值。
●I/O失败:
在输入或输出期间发生错误,如找不到文件、在超过规定的最多努力次数后仍然读/写失败(例如当遇到了磁带上的一个坏区时)或者无效操作(如从行式打印机中读)。
●无效指令:
进程试图执行一个不存在的指令(通常是由于转移到了数据区并企图执行数据)。
●特权指令:
进程试图使用为操作系统保留的指令。
●数据误用:
错误类型或未初始化的一块数据。
●操作员或操作系统干涉:
由于某些原因,操作员或操作系统终止进程(例如,如果存在死锁)。
(3)父进程
在有些操作系统中,进程可以被创建它的进程终止(父进程通常具有终止其任何后代进程的权利);或当父进程终止时,操作系统可自动终止该进程的所有后代进程。
四、五状态模型
一个进程从创建产生到撤销消亡的整个生命周期间,有时占有处理器执行,有时虽可运行但分不到处理器,有时虽然处理器空闲但因等待某个事件的发生而无法执行。
这些都充分说明了进程和程序的不同,进程是活动的且有状态变化的,可以用一组状态加以刻画。
1.进程状态
为了便于管理进程,一般来说,按进程在执行过程中的不同情况至少要定义三种不同的进程状态。
另外,还应该增加两个已经证明很有用的状态。
(1)运行态
进程正在执行。
如果计算机只有一个处理器,那么一次最多只有一个进程处于该状态。
(2)就绪态
进程做好了准备,只要有机会就开始执行。
(3)阻塞态
进程在某些事件发生前不能执行,如I/O操作完成。
(4)新建态
刚刚创建的进程,操作系统还没有把它加入可执行进程组中。
通常是进程控制块已经创建但还没有加载到主存中的新进程。
当进程处于新建态时,操作系统所需要的关于该进程的信息保存在主存的进程表中,但进程自身还未进入主存,也就是进程中的程序代码和数据都还未被分配内存空间。
(5)退出态
操作系统从可执行进程组中释放出的进程,或者是因为它自身停止了,或者是因为某种原因被取消。
2.状态变迁
(1)新建→就绪
操作系统系统准备好再接纳一个进程时,就把一个进程从新建态转换到就绪态。
(2)就绪→运行
当需要选择一个进程运行时,操作系统选择一个处于就绪的进程。
调度算法后面讨论。
(3)运行→退出
如果当前正在运行的进程表示自己已经完成或被取消,则它将被操作系统终止。
(4)运行→就绪
这类转换的最常见的原因是,正在运行的进程到达了“允许不中断执行”的最长时间段;实际上所有多道程序操作系统都实现了这类时间限定。
这类转换还有很多其他原因,但它们不是在所有的操作系统中都实现了。
如果操作系统给不同的进程分配不同的优先级,进程就有可能被抢占。
假设进程A在一个给定的优先级下运行,具有更高优先级的进程B处于阻塞态。
如果操作系统知道进程B等待的事件已经发生了,就把B转换到就绪态,然后由于优先级的原因中断了进程A的执行,将处理器分配给进程B,我们称操作系统抢占了进程A。
(5)运行→阻塞
如果进程请求它必须等待的某些事件,则进入阻塞态。
例如,进程可能请求操作系统的一个服务,但操作系统无法立即给予服务,它也可能请求了一个无法立即得到的资源,如文件或虚存中的共享区域;或者也可能需要进行某种初始化的工作,如I/O操作所遇到的情况,并且只有在该初始化动作完成后才能继续执行。
当进程互相通信,一个进程等待另一个进程提供输入时,或者等待来自另一个进程的信息时,都可能被阻塞。
(6)阻塞→就绪
当所等待的事件发生时,阻塞态进程转换到就绪态。
(7)就绪→退出
状态图中没有表示这种转换。
在某些系统中,父进程可以在任何时刻终止一个子进程。
如果父进程终止,与该父进程相关的所有子进程都将被终止。
(8)阻塞→退出
理由同就绪→退出。
3.进程队列
为了方便管理进程,可将所有处于就绪状态的进程安排在就绪队列中,所有阻塞态的进程根据阻塞的原因不同(等待的事件不同)安排在不同的阻塞队列中。
队列是一种先进先出的数据结构。
(1)进入系统的每个进程被放置在就绪队列中,当操作系统选择一个进程运行时,就从就绪队列中选择。
(2)当正在运行的进程被移出执行时,根据具体情况或被终止,或被放置在就绪队列或阻塞队列中。
(3)当一个事件发生时,所有位于阻塞对中等待这个事件的进程都被转换到就绪队列中。
最后还有一点改进是,如果按照优先级方案调度进程,可维护多个就绪队列,每个优先
级一个队列,就会带来很多便利。
操作系统可以很容易地确定就绪态进程具有最高的优先级
且等待时间最长。
五、被挂起的进程
前面描述的三个基本状态(就绪态、运行态和阻塞态)提供一种为进程行为建立模型的系统方法,并可知道操作系统的实现。
许多实际的操作系统都是按照这样的三种状态进行具体构造的。
但是,可以证明向模型中增加其他状态也是合理的。
1.交换的需求
考虑一个没有使用虚拟内存的系统,每个被执行的进程必须完全载入主存,因此所有队列中的所有进程必须驻留在主存。
一般来说,处理器比I/O要快得多,以至于内存中所有的进程都在等待I/O的情况很常见。
因此,即使采用多道程序设计,大多数时处理器仍然可能处于空闲状态。
一种解决方法是扩充主存以装入更多的进程,但是这种方法有两个缺陷。
首先是主存的价格问题,但内存大小增加到MB及GB时,价格也会随之增加;再者,程序对内存空间要求的增张速度比内存价格下降的速度快得多。
因此,更大的内存只会招致更大的进程,而不是更多的进程。
另一种解决方案是交换
交换,即把主存中某个进程的一部分或全部内容都转移到磁盘中。
当主存中没有处在就绪态的进程时,操作系统就把被阻塞的进程换出到磁盘中的“挂起队列”(暂时保存从主存中被“驱逐”出的进程,或者说被挂起的进程)。
操作系统之后取出挂起队列中的另一个进程或者接受一个新进程的请求,将其纳入主存运行。
交换是个I/O操作,因而也可能使问题更加恶化。
但磁盘I/O一般是系统中最快的I/O(相对于磁带或打印机I/O而言),所以交换通常会提高性能。
2.带有一个挂起态的进程状态模型
需要在五状态进程模型中增加另一个状态:
挂起态。
当主存中所有进程都处于阻塞态时,操作系统可以把其中的一个进程置于挂起态,并将它转移到磁盘,主存中释放的空间可被调入的另一个进程使用。
当操作系统执行一个换出操作后,有两种方法选择一个进程到主存中:
一是可以接纳一个新创建的进程;二是调入一个以前被挂起的进程,当然该进程所等待的事件已经发生。
3.带有两个挂起态的进程状态模型
(1)阻塞/挂起态和就绪挂起态
重新考虑设计方式,现在有两个独立的概念:
进程是否在等待一个事件(阻塞与否)以及进程是否已经被换出主存(挂起与否)。
为适应这种2×2的组合,需要四个状态:
●就绪态:
进程在主存中并可以执行。
●阻塞态:
进程在主存中并等待一个事件。
●阻塞/挂起态:
进程在辅存中并等待一个事件。
●就绪/挂起态:
进程在辅存中,但是只要被载入主存就可以执行。
(2)状态变迁
比较重要的转换如下:
●阻塞→阻塞/挂起
如果没有就绪态进程,则至少一个阻塞态进程被换出,为另一个没有阻塞的进程让出主程空间;如果操作系统确定当前正在运行的进程,或就绪态进程为了维护基本的性能要求而需要更多的内存空间,那么,即使有可用的就绪态进程也可能出现这种转换。
●阻塞/挂起→就绪/挂起
如果等待的事件发生了,则处于阻塞/挂起态的进程可以转换到就绪/挂起态。
●就绪/挂起→就绪
如果主存中没有就绪态进程,则操作系统需要调入一个进程继续执行。
另外,当处于就绪/挂起态的进程优先级比处于就绪态的任何进程的优先级要高时,也可进行这种转换。
●新建→就绪/挂起以及新建→就绪
当创建一个新进程时,该进程或者加入到就绪队列,或者加入到就绪/挂起队列中。
●各种状态→退出
在某些操作系统中,一个进程可以被创建它的进程终止,或当父进程终止时被终止。
如果允许这样,则进程在任何状态时都可以转换到退出态。
特殊转换有:
●就绪→就绪挂起
通常操作系统更倾向于挂起阻塞态进程而不是就绪态进程,道理很简单,因为就绪态进程可以立即执行,而阻塞态进程占用了主存储空间。
但是如果释放主存以得到足够空间的唯一方法是挂起就绪态进程,那么这种转换也是必须的。
另外,如果操作系统确信高优先级的阻塞态进程很快就会就绪,那么它可能选择挂起一个低优先级的就绪态进程,而不是一个高优先级的阻塞态进程。
●阻塞/挂起→阻塞
这种转换在设计中比较少见,如果一个进程没有准备好执行,并且不在主存中,那么调入它又有什么意义?
但是考虑到下面的情况:
一个进程终止,释放了一些主存空间,阻塞/挂起队列中有一个进程比就绪/挂起队列中的任何进程优先级都要高,并且操作系统有理由相信阻塞该进程的事件会很快发生,这时把阻塞态进程而不是就绪态进程调入主存是合理。
●运行→就绪/挂起
通常当分配给一个运行进程的时间片满时,该进程将被转换到就绪态。
但是,如果由于位于阻塞/挂起队列的具有较高优先级的进程变得不再被阻塞,它需要抢占CPU,而此时主存空间不够,从而可能导致正在运行的进程转换到就绪/挂起队列中。
4.导致进程挂起的事件
(1)交换
进程挂起的一个主要原因是为了提供更多的内存空间,这样可以调入一个就绪/挂起态进程,或者增加分配给其他就绪态进程的内存。
(2)其他操作系统原因
在操作员的控制下的操作系统可能不时地打开或挂起一个后台进程或工具程序进程;另外,操作系统可以挂起被怀疑有问题的进程。
(3)交互式用户请求
如果用户会议程序中有缺陷,他可以挂起执行程序并进行调试、检查和修改程序或数据,然后恢复执行。
(4)定时
如果一个进程周期性地被激活,但大多数时间是空闲的,则在它两次使用之间应该被换出内存。
监视使用情况或用户活动的程序就是一个例子。
(5)父进程请求
父进程可能会希望挂起一个后代进程。
例如,进程A可以生成进程B,以执行文件读操作;随后,进程B在读文件的过程中遇到错误,并报告给进程A;进程A挂起进程B,调查错误的原因。
【思考】根据下图中进程P1、P2、P3和P4的资源分配情况,判断这些进程的状态。
到目前为止,我们介绍了进程的概念,分析了进程在其生命周期中的各种状态,以及这些状态的转换。
但是还有一个最基本的问题尚未解决——即进程的物理表示是什么?
或者说进程究竟是由什么组成的。
3.2进程描述和进程控制
一、进程控制块
1.进程映像
进程最少必须包括一个或一组被执行的程序,以及与这些程序相关联的数据(包括局部变量、全局变量和常量)。
程序的执行通常还涉及到用于跟踪过程调用和过程间参数传递的堆栈。
最后,与每个进程相关联的还有操作系统用来管理和控制进程的许多属性,这些属性的集合被称为进程控制块(ProcessControlBlock,PCB)。
程序、数据、栈和属性的集合(PCB)合称为进程映像。
如果操作系统要管理进程,其进程映像至少有一部分必须位于主存中。
为执行此进程,整个进程映像必须载入主存或至少载入虚拟内存中。
2.进程控制块
进程控制块(ProcessControlBlock,PCB)是操作系统用来记录和刻画进程状态及有关信息的数据结构,也是操作系统掌握进程的惟一资料结构,是操作系统控制和管理进程的主要依据。
每一个进程都有一个且只有一个进程控制块。
PCB随着进程的创建而建立,随着进程的撤消而释放,PCB是进程存在的唯一标志。
可将进程控制块信息分成三部分:
(1)进程标识信息
进程标识
进程号存储在进程控制块中的数字标识符,包括
●此进程的标识号(ProcessID,简称进程ID)
●创建此进程的进程(父进程)标识号
●用户标识号(UserID,简称用户ID)
在所有的操作系统中,每个进程在创建时都被分配了一个惟一的数字标识号。
除了进程标识号外,还给进程分配了一个用户标识号,用于标明拥有该进程的用户。
(2)进程状态信息
处理器状态信息
用户可见寄存器用户可见寄存器是处于用户模式的处理器执行的机器语言可以
访问的寄存器。
通常有8到32个此类寄存器,而在一些RISC
实现中有超过100个此类寄存器
控制和状态寄存器用于控制处理器操作的各种处理器寄存器,包括:
程序计数器、条件码、状态信息
栈指针每个进程有一个或多个与之相关联的后进先出(LIFO)系统栈。
栈用于保存参数和过程调用或系统调用的地址,栈指针指向栈顶
处理器状态信息包括处理器的寄存器的内容。
当一个进程正在运行时,其信息当然在寄存器中。
当进程被中断时,所有的寄存器信息必须保存起来,当进程再次获得处理机恢复执行时,就可以把这些信息置入处理机的寄存器中,恢复到被中断时的状态,从而保证进程继续执行,就象从未被中断过一样。
(3)进程控制信息
进程控制信息
调度和状态信息这是操作系统执行其调度功能所需要的信息,典型的信息项包括
●进程状态:
定义被调度执行的进程的准备情况(运行态、就绪态、等待态、停止态)
●优先级:
用于描述进程调度优先级的一个或多个域。
在某些系统中,需要多个值(例如默认、当前、最高许可证)
●调度相关信息:
这取决于所使用的调度算法。
例如进程等待的时间总量和进程在上一次运行时的执行时间总量。
●事件:
进程在继续执行前等待的事件标识
数据结构进程可以以队列、环或某些别的结构形式与其他进程进行链接。
例如,所有具有某一特定优先级且处于等待状态的进程链接在一个队列中;进程还可以表示出与另一个进程的父子(创建者-被创建者)关系。
PCB为支持这些结构需要包含指向其他进程的指针
进程间通信与进程间通信相关联的有各种标记、信号和消息。
进程控制块中维护着某些或全部此类信息
进程特权进程根据其可以访问的内存空间以及可以执行的指令类型被赋予
各种特权。
此外,特权还用于实用程序和服务的使用。
存储管理包括指向描述分配给进程的虚拟内存空间的段表或页表的指针
资源的所有权和使用情况进程控制的资源可以表示成诸如一个打开的文件,还可能包括处理器或其他资源的使用历史;调度器会需要这些信息
进程控制信息用于管理和调度进程。
常见的控制信息包括:
进程状态,优先级,所等待事件的标识,进程队列中下一个进程的PCB的内存地址,进程间通信用的标记、信号或者消息,该进程的段表或者页表的内存地址,进程已占用CPU的时间、进程已执行的时间综合、记帐信息,资源清单等。
3.进程控制块的保护
进程控制块是操作系统中最重要的数据结构,包含操作系统所需要的关于进程的所有信息。
操作系统中的每个模块,包括那些涉及到调度、资源分配、中断处理、性能监控和分析的模块,都可能读取和修改它们。
这就带来了一个重要的设计问题:
如何保护进程控制块中的信息?
具体表现为:
(1)一个例程(如中断处理器)中有错误,可能会破坏它所访问的某个进程的PCB,进而破坏了操作系统对该进程的管理能力。
(2)进程控制块的结构或语义的设计变化可能会影响到操作系统中的许多模块。
解决方案:
可以通过要求操作系统中的所有例程都通过一个处理例程来专门处理,处理例程的任务仅仅是保护进程控制块,它是读写这些块的惟一的仲裁程序。
二、进程队列及其管理
前面提到,为了便于管理进程,通常把处于同一状态的进程组织成队列。
既然进程的主要特征是由PCB来刻画的,那么就可以用进程的PCB来组织队列。
把处于同一状态(例如就绪态)的所有进程的进程控制块链接在一起形成进程队列。
可以按先来先到的原则把同一状态进程的PCB排成队列,也可以按优先数或其他原则排成队列。
链接PCB的方法很多,常用的有单向链接和双向链接。
1.链接法
(1)单向链接
在每个进程控制块内设置一个队列指引元,指向队列中下一个进程的PCB。
另设一个队列标志,其指引元指向队列中第一个进程的PCB。
(2)双向链接
在每个进程控制块内设置两个队列指引元,其中一个指向队列中该进程的上一个进程的PCB,另一个指向队列中该进程的下一个进程的PCB。
另设队列标志,其后向指引元指向队列中第一个进程的PCB,其前向指引元指向队列中最后一个进程的PCB。
(3)出队和入队
当发生的某个事件使一个进程的状态发生变换时。
该进程就要退出所在的某个队列,而排入到另一
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 进程 管理 处理器 调度 10 学时