版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第二章进程管理
第一节:进程的概念第二章进程管理第一节:进程的概念1前趋图:是一个有向无循环图。
前趋图用于描述进程之间执行的前后关系。图中的每个结点可用于描述一个程序段或进程,乃至一条语句;结点间的有向边则用于表示两个结点之间存在的偏序或前趋关系“→”。节点前趋图:是一个有向无循环图。前趋图用于描述进程之间执行的前2图2-1(a)中存在着这样的前趋关系:P1→P2,P1→P3,P1→P4,P2→P5,P3→P5,P4→P6,P4→P7,P5→P8,P6→P8,P7→P9,P8→P9图2-1前趋图图2-1(a)中存在着这样的前趋关系:图2-1前趋图3或表示为:P={P1,P2,P3,P4,P5,P6,P7,P8,P9}→={(P1,P2),(P1,P3),(P1,P4),(P2,P5),(P3,P5),(P4,P6),(P4,P7),(P5,P8),(P6,P8),(P7,P9),(P8,P9)}应当注意,前趋图中必须不存在循环,但在图2-1(b)中却有着下述的前趋关系:S2→S3,S3→S2
图2-1前趋图或表示为:应当注意,前趋图中必须不存在循环,但在图2-1(41、程序的顺序执行1、程序的顺序执行5图2-2程序的顺序执行S1:a∶=x+y;S2:b∶=a-5;S3:c∶=b+1;试想S1、S2、S3三条语句以何顺序执行?1、程序的顺序执行图2-2程序的顺序执行S1:a∶=x+y;试想S6程序顺序执行时的特征
顺序性:(2)封闭性(运行时候独占处理机资源,运行结果不受外界影响)-程序可再现性:(3)可再现性(初始条件相同,结果相同)程序顺序执行时的特征顺序性:72、程序的并发执行及其特征
2、程序的并发执行及其特征82、程序的并发执行及其特征2.1程序的并发执行图2-3并发执行时的前趋图在该例中存在下述前趋关系:Ii→Ci,Ii→Ii+1,Ci→Pi,Ci→Ci+1,Pi→Pi+1而Ii+1和Ci及Pi-1是重迭的,亦即在Pi-1和Ci以及Ii+1之间,可以并发执行。如何实现并发执行?2、程序的并发执行及其特征2.1程序的并发执行图2-39对于具有下述四条语句的程序段:S1:a∶=x+2S2:b∶=y+4S3:c∶=a+bS4:d∶=c+b请画出前趋关系图。对于具有下述四条语句的程序段:102.2程序并发执行时的特征
间断性(相互制约性)-后面的模块等待前面的模块传来的结果,然后才执行(如打印模块等待计算模块完成)。走走停停。失去封闭性:多个程序共享系统中的各种资源,因而这些资源的状态将由多个程序来改变,致使程序的运行已失去了封闭性。
结果是一个程序运行时会受到另一个程序的影响。不可再现性:程序在并发执行时,由于失去了封闭性,也将导致失去其可再现性下面看个小例子:2.2程序并发执行时的特征间断性(相互制约性)-后面的模11例如,有两个循环程序A和B,它们共享一个变量N。程序A每执行一次时,都要做N∶=N+1操作;程序B每执行一次时,都要执行Print(N)操作,然后再将N置成“0”。程序A和B以不同的速度运行。(1)N∶=N+1在Print(N)和N∶=0之前,此时得到的N值分别为n+1,n+1,0。(2)N∶=N+1在Print(N)和N∶=0之后,此时得到的N值分别为n,0,1。(3)N∶=N+1在Print(N)和N∶=0之间,此时得到的N值分别为n,n+1,0。结论:程序在并发执行时,由于失去了封闭性,其计算结果已经和并发执行速度有关,从而使程序失去了可再现性,亦即,程序经过多次执行后,虽然他们执行时的环境和初始条件相同,但得到的结果却不相同。例如,有两个循环程序A和B,它们共享一个变量N12
顺序执行:并发执行:程序具有封闭性程序失去封闭性独享资源共享资源(互为存在条件)可再现性程序与“计算”不再一一对应有相互制约[工学]操作系统课件-第2章-进程133、进程(Process)3、进程(Process)143.1较典型的进程定义有:进程是程序的一次执行。进程是一个程序及其数据在处理机上顺序执行时所发生的活动。进程是程序在一个数据集合上运行的过程,它是系统进行资源分配和调度的一个独立单位。进程是一个程序及其数据在处理机上顺序执行时所发生的活动。进程是程序在一个数据集合上运行的过程,它是系统进行资源分配和调度的一个独立单位;3.1较典型的进程定义有:进程是程序的一次执行。153.2进程的组成:进程的实体由:程序段、数据段、进程控制块PCB组成。有人把这三部分称为”进程映像”.
通常的程序是不能并发执行的,为使程序能并发执行,应为之配置一进程控制块,即PCB;所谓创建进程是指创建进程实体中的PCB,撤销亦如此。3.2进程的组成:161)结构化特征:含代码段、数据段和核心段(在地址空间中)2)动态性:进程的实质是进程实体的一次执行过程,动态性是进程的最基本特征。3)并发性:指多个进程实体同存于内存中,且能在一段时间内同时运行,它是进程的重要特征,也是操作系统的重要特征。4)独立性:各进程的地址空间相互独立,除非采用进程间通信手段;5)异步性:这是指进程按各自独立的,不可预知的速度向前推进。导致程序执行的不可再现性3.3进程的特征:1)结构化特征:含代码段、数据段和核心段(在地址空间中)171)程序是静态的,进程是动态的;(是根本区别)
程序是有序代码的集合;进程是程序的执行。2)进程和程序不是一一对应的;一个程序可对应多个进程,即多个进程可执行同一程序
;一个进程可以执行一个或几个程序
3)进程是暂时的,程序的永久的:进程是一个状态变化的过程,程序可长久保存。4)进程与程序的组成不同:进程的组成包括程序、数据和进程控制块(即进程状态信息)。5)进程具有创建其他进程的功能,而程序没有。3.4进程与程序的区别1)程序是静态的,进程是动态的;(是根本区别)3.4进程与程18程序与进程的类比
程序进程唱歌的曲谱或音乐乐器的乐谱
演出或演奏
剧本
演出
火车
列车
程序与进程的类比
程序进程唱歌的191、判断题:进程是一个程序在某数据集上的一次执行,所以不同进程对应不同的程序。分析:进程是程序在某数据集上得一次执行,但是不同进程可以对应同一程序。2、程序顺序执行与并发执行有什么不同?3、用户程序必须在进程中运行。正确4、判断题:两次打开Word字处理程序,编辑同一篇文章,因为程序一样(Word2003),数据一样(同一篇文章),所以系统中运行的这两个Word字处理程序是同一个进程。错误,运行的是2个不同的进程1、判断题:进程是一个程序在某数据集上的一次执行,所以不同进203.5处理机调度器(dispatcher)把处理机从一个进程切换到另一个进程;防止某进程独占处理机;处理机调度器(进程调度):是操作系统中的一段代码,它完成如下功能:3.5处理机调度器(dispatcher)把处理机从一个进程213.6进程的三种基本状态
1)就绪(Ready)状态:已分配到除CPU以外的所有必要的资源,只要能再获得处理机,便可立即执行的状态。多个排成一队称为就绪队列。2)执行状态:指进程已获得处理机,其程序正在执行;在单处理机系统中,只能有一个进程处于执行状态;在多处理机系统中,则可能多个进程处于执行状态。3)阻塞状态:进程因发生某事件(如请求I/O、申请缓冲空间等)而暂停执行时的状态,亦即进程的执行受到阻塞,故称这种暂停状态为阻塞状态,有时也称为“等待”状态或“睡眠”状态。通常将处于阻塞状态的进程排成一个队列,称为阻塞队列。在有的系统中,按阻塞原因的不同而将处于阻塞状态的进程排成多个队列。3.6进程的三种基本状态1)就绪(Ready)状态:已分22图2-5进程的三种基本状态及其转换(教材讲5种)
结束新进程接纳完成图2-5进程的三种基本状态及其转换结束新进程接纳完成23作业后备队列进程就绪队列外存内存作业调度一些处理器(CPU)阻塞队列阻塞队列作业后备队列进程就绪队列外存内存作业调度243.7五状态进程模型五状态进程模型(状态变迁)3.7五状态进程模型五状态进程模型(状态变迁)25五状态进程模型(单队列结构)五状态进程模型(单队列结构)26五状态进程模型(多队列结构)五状态进程模型(多队列结构)273.8进程状态的转换
新(New)状态就绪状态。(2)就绪(Ready)状态执行状态。(3)执行状态阻塞状态。(4)阻塞状态就绪状态。(5)执行状态就绪状态3.8进程状态的转换新(New)状态就绪状态。283.9挂起进程模型这个问题的出现是由于进程优先级的引入,一些低优先级进程可能等待较长时间,从而被对换至外存。这样做的目的是:提高处理机效率:就绪进程表为空时,要提交新进程,以提高处理机效率;为运行进程提供足够内存:资源紧张时,暂停某些进程,如:CPU繁忙(或实时任务执行),内存紧张用于调试:在调试时,挂起被调试进程(从而对其地址空间进行读写)3.9挂起进程模型这个问题的出现是由于进程优先级的引入,一些29单挂起进程模型单挂起进程模型30双挂起进程模型内存外存双挂起进程模型内存外存313.9.1状态就绪状态(Ready):进程在内存且可立即进入运行状态;阻塞状态(Blocked):进程在内存并等待某事件的出现;阻塞挂起状态(Blocked,suspend):进程在外存并等待某事件的出现;就绪挂起状态(Ready,suspend):进程在外存,但只要进入内存,即可运行;注:这里只列出了意义有变化或新的状态。3.9.1状态就绪状态(Ready):进程在内存且可立即进323.9.2转换挂起(Suspend):把一个进程从内存转到外存;可能有以下几种情况:阻塞到阻塞挂起:没有进程处于就绪状态或就绪进程要求更多内存资源时,会进行这种转换,以提交新进程或运行就绪进程;就绪到就绪挂起:当有高优先级阻塞(系统认为会很快就绪的)进程和低优先级就绪进程时,系统会选择挂起低优先级就绪进程;运行到就绪挂起:对抢占式分时系统,当有高优先级阻塞挂起进程因事件出现而进入就绪挂起时,系统可能会把正运行的进程转到就绪挂起状态;激活(Activate):把一个进程从外存转到内存;可能有以下几种情况:就绪挂起到就绪:没有就绪进程或挂起就绪进程优先级高于就绪进程时,会进行这种转换;阻塞挂起到阻塞:当一个进程释放足够内存时,系统会把一个高优先级阻塞挂起(系统认为会很快出现所等待的事件)进程变成阻塞状态;3.9.2转换挂起(Suspend):把一个进程从内存转到外33事件出现(EventOccurs):进程等待的事件出现;如:操作完成、申请成功等;可能的情况有:阻塞到就绪:针对内存进程的事件出现;阻塞挂起到就绪挂起:针对外存进程的事件出现;收容(Admit):收容(提交)一个新进程,进入就绪状态或就绪挂起状态。事件出现(EventOccurs):进程等待的事件出现;如341、进程由就绪态转为运行态是因为()引起的? A、中断事件 b、进程状态转换 c、进程调度的 d、为程序创建进程C2、分配到必要的资源并获得处理机的进程状态是()。运行态3、当(),进程从执行状态转变为就绪状态。a、进程被调度程序选中b、时间片到c、等待某一事件d、等待的时间发生B4、判断题:两次打开Word字处理程序,编辑同一篇文章,因为程序一样(Word2003),数据一样(同一篇文章),所以系统中运行的这两个Word字处理程序是同一个进程。1、进程由就绪态转为运行态是因为()引起的?C2、分配到必要35[工学]操作系统课件-第2章-进程363.10、进程控制块
3.10.1.进程控制块的作用
※※或者说:OS是根据PCB来对并发执行的进程进行控制和管理的。简单题:进程控制块的作用(要扩展)?判断题:进程控制块是进程存在的唯一标志。进程控制块是由OS维护的用来记录进程相关信息的一块内存。正确3.10、进程控制块3.10.1.进程控制块的作用※※373.10.2进程控制块的内容(数据结构很复杂)进程标识符:内部进程标识符(processID),唯一,通常是一个整数;进程名(外部标识符),通常基于可执行文件名(不唯一);用户标识符(userID);进程组关系(processgroup)进程控制信息:当前状态;优先级(priority);代码执行入口地址;程序的外存地址;运行统计信息(执行时间、页面调度);进程间同步和通信;阻塞原因进程调度信息:进程状态、进程优先级、资源信息等处理机状态:寄存器值(通用、程序计数器PC、状态PSW,地址包括栈指针)3.10.2进程控制块的内容(数据结构很复杂)进程标识符:383.10.3PCB的组织方式链表:同一状态的进程其PCB成一链表,多个状态对应多个不同的链表各状态的进程形成不同的链表:就绪链表、阻塞链表索引表:同一状态的进程归入一个index表(由index指向PCB),多个状态对应多个不同的index表各状态的进行形成不同的索引表:就绪索引表、阻塞索引表把具有相同状态的PCB,用其中的链接字,链接成一个队列。3.10.3PCB的组织方式链表:同一状态的进程其PCB394、进程控制返回4、进程控制返回404.1进程控制的功能:完成进程状态的转换。原语(primitive)※:由若干条指令构成的“原子操作(atomicoperation)”过程,作为一个整体而不可分割--要么全都完成,要么全都不做。许多系统调用就是原语。注意:系统调用并不都是原语。进程A调用read(),因无数据而阻塞,在read()里未返回。然后进程B调用read(),此时read()被重入。系统调用不一定一次执行完并返回该进程,有可能在特定的点暂停,而转入到其他进程。4.1进程控制的功能:完成进程状态的转换。原语(primi414.2.1进程图(ProcessGraph)图2-9进程树用于描述进程家族关系的有向树。图中的结点代表进程。父进程:在进程Pi创建了进程Pj后,称Pi是Pj的父进程。子进程:在进程Pi创建了进程Pj后,称Pj是Pi的子进程。4.2进程的创建4.2.1进程图(ProcessGraph)图2-424.2.2引起创建进程的事件
用户登录。(2)作业调度。(3)提供服务。(4)应用请求。
4.2.2引起创建进程的事件用户登录。434.2.3进程的创建(CreationofProgress)过程
(1)申请空白PCB。(2)为新进程分配资源。(分配内存空间)(3)初始化进程控制块。(4)将新进程插入就绪队列,如果进程就绪队列能够接纳新进程,便将新进程插入就绪队列。4.2.3进程的创建(CreationofProgre444.3进程退出也称为“终止”或主程序返回:调用exit()可终止进程。释放资源:释放内外存空间关闭所有打开文件释放共享内存段和各种锁定lock4.3进程退出也称为“终止”或主程序返回:调用exit()454.4进程的阻塞与唤醒4.4.1引起进程阻塞和唤醒的事件请求系统服务2)启动某种操作3)新数据尚未到达4)无新工作可做4.4进程的阻塞与唤醒4.4.1引起进程阻塞和唤醒的事件464.4.2.进程阻塞过程
正在执行的进程,当发现上述某事件时,无法继续执行,于是进程调用阻塞原语block把自己阻塞。可见,进程的阻塞是进程自身的一种主动行为。进入block过程后,由于此时该进程还处于执行状态,所以应先立即停止执行,把进程控制块中的现行状态由“执行”改为阻塞,并将PCB插入阻塞队列。如果系统中设置了因不同事件而阻塞的多个阻塞队列,则应将本进程插入到具有相同事件的阻塞(等待)队列。最后,转调度程序进行重新调度,将处理机分配给另一就绪进程,并进行切换。
4.4.2.进程阻塞过程474.4.3进程唤醒过程当被阻塞进程所期待的事件出现时,如I/O完成或其所期待的数据已经到达,则由有关进程(比如,用完并释放了该I/O设备的进程)调用唤醒原语wakeup(),将等待该事件的进程唤醒。唤醒原语执行的过程是:首先把被阻塞的进程从等待该事件的阻塞队列中移出,将其PCB中的现行状态由阻塞改为就绪,然后再将该PCB插入到就绪队列中。4.4.3进程唤醒过程484.5进程的挂起与激活
引起进程挂起的事件:4.5.1.进程的挂起挂起原语的执行过程是:首先检查被挂起进程的状态,若处于活动就绪状态,便将其改为静止就绪;对于活动阻塞状态的进程,则将之改为静止阻塞。最后,若被挂起的进程正在执行,则转向调度程序重新调度。-或父进程请求将自己的某个子进程挂起,-系统将利用挂起原语suspend()将指定进程或处于阻塞状态的进程挂起。-用户进程请求将自己挂起;4.5进程的挂起与激活引起进程挂起的事件:4.5.1.494.5.2.进程的激活过程系统将利用激活原语active()将指定进程激活。激活原语先将进程从外存调入内存,检查该进程的现行状态,若是静止就绪,便将之改为活动就绪;若为静止阻塞便将之改为活动阻塞。4.5.2.进程的激活过程50例:NT线程的挂起和激活 NT中处理机的分配对象为线程,一个线程可被多次挂起和多次激活。在线程内有一个挂起计数(suspendcount),挂起操作使该计数加1,激活操作将该计数减1;当挂起计数为0时,线程恢复执行。(1)挂起:WindowsNT中的SuspendThread可挂起指定的线程;DWORDSuspendThread(HANDLEhThread//handletothethread);(2)激活:WindowsNT中的ResumeThread可恢复指定线程的执行;DWORDResumeThread(HANDLEhThread//identifiesthreadtorestart);例:NT线程的挂起和激活 NT中处理机的分配对象为线程,一51例子NT_thread.cpp#include<stdio.h>#include<windows.h>#include<iostream.h>#include<winbase.h>voidSubThread(void){ inti; for(i=0;i<5;i++) { cout<<"SubThread"<<i<<endl; Sleep(2000); }}例子NT_thread.cpp#include<stdio52voidmain(void){cout<<"CreateThread"<<endl; //Createathread; DWORDIDThread; HANDLEhThread; hThread=CreateThread(NULL,//nosecurityattributes0,//usedefaultstacksize(LPTHREAD_START_ROUTINE)SubThread,//threadfunctionNULL,//nothreadfunctionargument0,//usedefaultcreationflags&IDThread);//returnsthreadidentifier
//Checkthereturnvalueforsuccess. if(hThread==NULL) cout<<"CreateThreaderror"<<endl;voidmain(void)53
inti; for(i=0;i<5;i++) { cout<<"MainThread"<<i<<endl; if(i==1) {if(SuspendThread(hThread)==0xFFFFFFFF) {cout<<"Suspendthreaderror."<<endl; } else {cout<<"Suspendthreadisok."<<endl; } } if(i==3) { if(ResumeThread(hThread)==0xFFFFFFFF) {cout<<"Resumethreaderror."<<endl;} else {cout<<"Resumethreadisok."<<endl; } }Sleep(4000); }} inti;54运行结果CreateThreadMainThread0SubThread0SubThread1MainThread1Suspendthreadisok.MainThread2MainThread3Resumethreadisok.SubThread2SubThread3MainThread4SubThread4运行结果CreateThread55例子NT_thread.cpp#include<stdio.h>#include<windows.h>#include<iostream.h>#include<winbase.h>voidSubThread(void){ inti; for(i=0;i<5;i++) { cout<<"SubThread"<<i<<endl; Sleep(2000);//改一下时间,输出顺序会有变化 }}此处是用户自己的函数,完成指定功能例子NT_thread.cpp#include<st56voidmain(void){cout<<"CreateThread"<<endl; //Createathread; DWORDIDThread; HANDLEhThread; hThread=CreateThread(NULL,//nosecurityattributes0,//usedefaultstacksize(LPTHREAD_START_ROUTINE)SubThread,//threadfunctionNULL,//nothreadfunctionargument0,//usedefaultcreationflags&IDThread);//returnsthreadidentifier
//Checkthereturnvalueforsuccess. if(hThread==NULL) cout<<"CreateThreaderror"<<endl;voidmain(void)57
inti; for(i=0;i<5;i++) { cout<<"MainThread"<<i<<endl; if(i==1) {if(SuspendThread(hThread)==0xFFFFFFFF) {cout<<"Suspendthreaderror."<<endl; } else {cout<<"Suspendthreadisok."<<endl; } } if(i==3) { if(ResumeThread(hThread)==0xFFFFFFFF) {cout<<"Resumethreaderror."<<endl;} else {cout<<"Resumethreadisok."<<endl; } }Sleep(4000);//改一下结果会有变化。 }} inti;58运行结果CreateThreadMainThread0//输出后。Sleep(4000)SubThread0//输出后,Sleep(2000)SubThread1//输出后,Sleep(2000)MainThread1//输出后。Sleep(4000)Suspendthreadisok.MainThread2MainThread3Resumethreadisok.//输出后。Sleep(4000)SubThread2SubThread3MainThread4SubThread4进程创建后只要通过进程调度获得cpu,就自动执行!运行结果CreateThread进程创建后只要通过进程调度获595线程(THREAD)返回引入线程的目的是简化进程间的通信,以小的开销来提高进程内的并发程度。5线程(THREAD)返回引入线程的目的是简化进程间的通信605.1线程的引入进程:资源分配单位(存储器、文件)和CPU调度(分派)单位-未引入线程时。又称为“任务(task)“线程:作为CPU调度单位,而引入线程后进程只作为其他资源分配单位。只拥有必不可少的资源,如:线程状态、寄存器上下文和栈同样具有就绪、阻塞和执行三种基本状态线程的优点:减小并发执行的时间和空间开销(线程的创建、退出和调度),因此容许在系统中建立更多的线程来提高并发程度。线程的创建时间比进程短;线程的终止时间比进程短;同进程内的线程切换时间比进程短;由于同进程内线程间共享内存和文件资源,可直接进行不通过内核的通信;5.1线程的引入进程:资源分配单位(存储器、文件)和CPU61进程与线程的关系进程与线程的关系625.2线程的属性
线程具有许多传统进程所具有的特征,故又称为轻型进程(1)轻型实体。(线程是进程中的一个实体)(2)独立调度和分派的基本单位。在多线程OS中,线程是能独立运行的基本单位,因而也是独立调度和分派的基本单位。而把进程作为资源拥有的单位。由于线程很“轻’’,故线程的切换非常迅速且开销小。(3)可并发执行。
(4)共享进程资源。5.2线程的属性线程具有许多传统进程所具有的特征,故又称635.3OS对线程的实现方式内核维护进程和线程的上下文信息;线程切换由内核完成;一个线程发起系统调用而阻塞,不会影响其他线程的运行。时间片分配给线程,所以多线程的进程获得更多CPU时间。依赖于OS核心,由内核的内部需求进行创建和撤销,用来执行一个指定的函数。WindowsNT和OS/2支持内核线程;1)内核线程(kernel-levelthread)5.3OS对线程的实现方式内核维护进程和线程的上下文信息;642)用户线程(user-levelthread)用户线程的维护由应用进程完成;内核不了解用户线程的存在;用户线程切换不需要内核特权;用户线程调度算法可针对应用优化;不依赖于OS核心,应用进程利用线程库提供创建、同步、调度和管理线程的函数来控制用户线程。如:数据库系统informix,图形处理AldusPageMaker。调度由应用软件内部进行,通常采用非抢先式和更简单的规则,也无需用户态/核心态切换,所以速度特别快。一个线程发起系统调用而阻塞,则整个进程在等待。时间片分配给进程,多线程则每个线程就慢。2)用户线程(user-levelthread)用户线程的65
例:线程执行时间对于只设置了用户级线程的系统,调度是以进程为单位的,在采用轮转调度算法时,各个进程轮流执行一个时间片,这对诸进程而言,看似公平的,但假如在A进程中包含了一个用户级线程,而在另一个进程B中含有100个线程,这样,进程A中线程的运行时间,将是进程B中线程运行时间的100倍;相应地,速度就快100倍。假如系统中是设置的内核支持线程,其调度是以线程为单位进行的,这样,进程B可以获得的CPU时间是进程A的100倍,进程B可使100个系统调用并发工作。例:线程执行时间665.3Solaris操作系统中的线程同时实现了用户级线程与内核支持线程。
SUN
SolarisOS在用户级线程和内核级线程之间,定义了一种轻型进程LWP(内核控制线程,也称为轻权进程),一个进程中至少有一个LWP。5.3Solaris操作系统中的线程同时实现了用户级线程与67Solaris支持内核线程(Kernelthreads)、轻权进程(LightweightProcesses)和用户线程(UserLevelThreads)。一个进程可有大量用户线程;大量用户线程复用少量的轻权进程,不同的轻权进程分别对应不同的内核线程。Solaris支持内核线程(Kernelthreads)、68用户级线程在使用系统调用时(如文件读写),需要“捆绑(bound)”在一个LWP上,用户级线程可通过LWP访问内核,但内核所看到的总是多个LWP,而看不到用户级线程。永久捆绑:一个LWP固定被一个用户级线程占用,该LWP移到LWP池之外临时捆绑:从LWP池中临时分配一个未被占用的LWP在使用系统调用时,如果所有LWP已被其他用户级线程所占用(捆绑),则该线程阻塞直到有可用的LWP--例如6个用户级线程,而LWP池中有4个LWP如果LWP执行系统调用时阻塞(如read()调用),则当前捆绑在LWP上的用户级线程也阻塞。每个要通信的用户级线程都需要一个LWP用户级线程在使用系统调用时(如文件读写),需要“捆绑(bou69Solaris用户线程和轻权进程Solaris用户线程和轻权进程70用户线程、轻权进程LWP和核心线程的关系同时有4个用户级线程发出对文件的读写请求,而任务中只有3个LPW,则3个用户级线程可执行读写请求,余下的必须等用户线程、轻权进程LWP和核心线程的关系同时有4个用户级线程71有关的C库函数/*创建用户级线程 */intthr_create(void*stack_base,size_tstack_size,void*(*start_routine)(void*),void*arg,longflags,thread_t*new_thread_id); 其中flags包括:THR_BOUND(永久捆绑),THR_NEW_LWP(创建新LWP放入LWP池),若两者同时指定则创建两个新LWP,一个永久捆绑而另一个放入LWP池有关的系统调用/*在当前进程中创建LWP */int_lwp_create(ucontext_t*contextp,unsignedlongflags,lwpid_t*new_lwp_id);/*构造LWP上下文 */void_lwp_makecontext(ucontext_t*ucp,void(*start_routine)(void*),void*arg,void*private,caddr_tstack_base,size_tstack_size);/*注意:没有进行"捆绑"操作的系统调用*/有关的C库函数/*创建用户级线程 */有关的系统调用725.3.2进程和线程的关系(1)线程是进程的一个组成部分。每个进程在创建时通常只有一个线程,需要时这个线程可以创建其它线程。(2)进程的多线程都在进程的地址空间活动。-某进程内的线程在其他进程不可见。(3)资源是分给进程的,而不是分给线程的,线程在执行中需要资源时,系统从进程的资源配额中扣除并分配给它。(4)处理机调度的基本单位是线程,线程之间竞争处理机,真正在处理机上运行的是线程。(5)线程在执行过程中,需要同步。5.3.2进程和线程的关系73第二章进程管理
第一节:进程的概念第二章进程管理第一节:进程的概念74前趋图:是一个有向无循环图。
前趋图用于描述进程之间执行的前后关系。图中的每个结点可用于描述一个程序段或进程,乃至一条语句;结点间的有向边则用于表示两个结点之间存在的偏序或前趋关系“→”。节点前趋图:是一个有向无循环图。前趋图用于描述进程之间执行的前75图2-1(a)中存在着这样的前趋关系:P1→P2,P1→P3,P1→P4,P2→P5,P3→P5,P4→P6,P4→P7,P5→P8,P6→P8,P7→P9,P8→P9图2-1前趋图图2-1(a)中存在着这样的前趋关系:图2-1前趋图76或表示为:P={P1,P2,P3,P4,P5,P6,P7,P8,P9}→={(P1,P2),(P1,P3),(P1,P4),(P2,P5),(P3,P5),(P4,P6),(P4,P7),(P5,P8),(P6,P8),(P7,P9),(P8,P9)}应当注意,前趋图中必须不存在循环,但在图2-1(b)中却有着下述的前趋关系:S2→S3,S3→S2
图2-1前趋图或表示为:应当注意,前趋图中必须不存在循环,但在图2-1(771、程序的顺序执行1、程序的顺序执行78图2-2程序的顺序执行S1:a∶=x+y;S2:b∶=a-5;S3:c∶=b+1;试想S1、S2、S3三条语句以何顺序执行?1、程序的顺序执行图2-2程序的顺序执行S1:a∶=x+y;试想S79程序顺序执行时的特征
顺序性:(2)封闭性(运行时候独占处理机资源,运行结果不受外界影响)-程序可再现性:(3)可再现性(初始条件相同,结果相同)程序顺序执行时的特征顺序性:802、程序的并发执行及其特征
2、程序的并发执行及其特征812、程序的并发执行及其特征2.1程序的并发执行图2-3并发执行时的前趋图在该例中存在下述前趋关系:Ii→Ci,Ii→Ii+1,Ci→Pi,Ci→Ci+1,Pi→Pi+1而Ii+1和Ci及Pi-1是重迭的,亦即在Pi-1和Ci以及Ii+1之间,可以并发执行。如何实现并发执行?2、程序的并发执行及其特征2.1程序的并发执行图2-382对于具有下述四条语句的程序段:S1:a∶=x+2S2:b∶=y+4S3:c∶=a+bS4:d∶=c+b请画出前趋关系图。对于具有下述四条语句的程序段:832.2程序并发执行时的特征
间断性(相互制约性)-后面的模块等待前面的模块传来的结果,然后才执行(如打印模块等待计算模块完成)。走走停停。失去封闭性:多个程序共享系统中的各种资源,因而这些资源的状态将由多个程序来改变,致使程序的运行已失去了封闭性。
结果是一个程序运行时会受到另一个程序的影响。不可再现性:程序在并发执行时,由于失去了封闭性,也将导致失去其可再现性下面看个小例子:2.2程序并发执行时的特征间断性(相互制约性)-后面的模84例如,有两个循环程序A和B,它们共享一个变量N。程序A每执行一次时,都要做N∶=N+1操作;程序B每执行一次时,都要执行Print(N)操作,然后再将N置成“0”。程序A和B以不同的速度运行。(1)N∶=N+1在Print(N)和N∶=0之前,此时得到的N值分别为n+1,n+1,0。(2)N∶=N+1在Print(N)和N∶=0之后,此时得到的N值分别为n,0,1。(3)N∶=N+1在Print(N)和N∶=0之间,此时得到的N值分别为n,n+1,0。结论:程序在并发执行时,由于失去了封闭性,其计算结果已经和并发执行速度有关,从而使程序失去了可再现性,亦即,程序经过多次执行后,虽然他们执行时的环境和初始条件相同,但得到的结果却不相同。例如,有两个循环程序A和B,它们共享一个变量N85
顺序执行:并发执行:程序具有封闭性程序失去封闭性独享资源共享资源(互为存在条件)可再现性程序与“计算”不再一一对应有相互制约[工学]操作系统课件-第2章-进程863、进程(Process)3、进程(Process)873.1较典型的进程定义有:进程是程序的一次执行。进程是一个程序及其数据在处理机上顺序执行时所发生的活动。进程是程序在一个数据集合上运行的过程,它是系统进行资源分配和调度的一个独立单位。进程是一个程序及其数据在处理机上顺序执行时所发生的活动。进程是程序在一个数据集合上运行的过程,它是系统进行资源分配和调度的一个独立单位;3.1较典型的进程定义有:进程是程序的一次执行。883.2进程的组成:进程的实体由:程序段、数据段、进程控制块PCB组成。有人把这三部分称为”进程映像”.
通常的程序是不能并发执行的,为使程序能并发执行,应为之配置一进程控制块,即PCB;所谓创建进程是指创建进程实体中的PCB,撤销亦如此。3.2进程的组成:891)结构化特征:含代码段、数据段和核心段(在地址空间中)2)动态性:进程的实质是进程实体的一次执行过程,动态性是进程的最基本特征。3)并发性:指多个进程实体同存于内存中,且能在一段时间内同时运行,它是进程的重要特征,也是操作系统的重要特征。4)独立性:各进程的地址空间相互独立,除非采用进程间通信手段;5)异步性:这是指进程按各自独立的,不可预知的速度向前推进。导致程序执行的不可再现性3.3进程的特征:1)结构化特征:含代码段、数据段和核心段(在地址空间中)901)程序是静态的,进程是动态的;(是根本区别)
程序是有序代码的集合;进程是程序的执行。2)进程和程序不是一一对应的;一个程序可对应多个进程,即多个进程可执行同一程序
;一个进程可以执行一个或几个程序
3)进程是暂时的,程序的永久的:进程是一个状态变化的过程,程序可长久保存。4)进程与程序的组成不同:进程的组成包括程序、数据和进程控制块(即进程状态信息)。5)进程具有创建其他进程的功能,而程序没有。3.4进程与程序的区别1)程序是静态的,进程是动态的;(是根本区别)3.4进程与程91程序与进程的类比
程序进程唱歌的曲谱或音乐乐器的乐谱
演出或演奏
剧本
演出
火车
列车
程序与进程的类比
程序进程唱歌的921、判断题:进程是一个程序在某数据集上的一次执行,所以不同进程对应不同的程序。分析:进程是程序在某数据集上得一次执行,但是不同进程可以对应同一程序。2、程序顺序执行与并发执行有什么不同?3、用户程序必须在进程中运行。正确4、判断题:两次打开Word字处理程序,编辑同一篇文章,因为程序一样(Word2003),数据一样(同一篇文章),所以系统中运行的这两个Word字处理程序是同一个进程。错误,运行的是2个不同的进程1、判断题:进程是一个程序在某数据集上的一次执行,所以不同进933.5处理机调度器(dispatcher)把处理机从一个进程切换到另一个进程;防止某进程独占处理机;处理机调度器(进程调度):是操作系统中的一段代码,它完成如下功能:3.5处理机调度器(dispatcher)把处理机从一个进程943.6进程的三种基本状态
1)就绪(Ready)状态:已分配到除CPU以外的所有必要的资源,只要能再获得处理机,便可立即执行的状态。多个排成一队称为就绪队列。2)执行状态:指进程已获得处理机,其程序正在执行;在单处理机系统中,只能有一个进程处于执行状态;在多处理机系统中,则可能多个进程处于执行状态。3)阻塞状态:进程因发生某事件(如请求I/O、申请缓冲空间等)而暂停执行时的状态,亦即进程的执行受到阻塞,故称这种暂停状态为阻塞状态,有时也称为“等待”状态或“睡眠”状态。通常将处于阻塞状态的进程排成一个队列,称为阻塞队列。在有的系统中,按阻塞原因的不同而将处于阻塞状态的进程排成多个队列。3.6进程的三种基本状态1)就绪(Ready)状态:已分95图2-5进程的三种基本状态及其转换(教材讲5种)
结束新进程接纳完成图2-5进程的三种基本状态及其转换结束新进程接纳完成96作业后备队列进程就绪队列外存内存作业调度一些处理器(CPU)阻塞队列阻塞队列作业后备队列进程就绪队列外存内存作业调度973.7五状态进程模型五状态进程模型(状态变迁)3.7五状态进程模型五状态进程模型(状态变迁)98五状态进程模型(单队列结构)五状态进程模型(单队列结构)99五状态进程模型(多队列结构)五状态进程模型(多队列结构)1003.8进程状态的转换
新(New)状态就绪状态。(2)就绪(Ready)状态执行状态。(3)执行状态阻塞状态。(4)阻塞状态就绪状态。(5)执行状态就绪状态3.8进程状态的转换新(New)状态就绪状态。1013.9挂起进程模型这个问题的出现是由于进程优先级的引入,一些低优先级进程可能等待较长时间,从而被对换至外存。这样做的目的是:提高处理机效率:就绪进程表为空时,要提交新进程,以提高处理机效率;为运行进程提供足够内存:资源紧张时,暂停某些进程,如:CPU繁忙(或实时任务执行),内存紧张用于调试:在调试时,挂起被调试进程(从而对其地址空间进行读写)3.9挂起进程模型这个问题的出现是由于进程优先级的引入,一些102单挂起进程模型单挂起进程模型103双挂起进程模型内存外存双挂起进程模型内存外存1043.9.1状态就绪状态(Ready):进程在内存且可立即进入运行状态;阻塞状态(Blocked):进程在内存并等待某事件的出现;阻塞挂起状态(Blocked,suspend):进程在外存并等待某事件的出现;就绪挂起状态(Ready,suspend):进程在外存,但只要进入内存,即可运行;注:这里只列出了意义有变化或新的状态。3.9.1状态就绪状态(Ready):进程在内存且可立即进1053.9.2转换挂起(Suspend):把一个进程从内存转到外存;可能有以下几种情况:阻塞到阻塞挂起:没有进程处于就绪状态或就绪进程要求更多内存资源时,会进行这种转换,以提交新进程或运行就绪进程;就绪到就绪挂起:当有高优先级阻塞(系统认为会很快就绪的)进程和低优先级就绪进程时,系统会选择挂起低优先级就绪进程;运行到就绪挂起:对抢占式分时系统,当有高优先级阻塞挂起进程因事件出现而进入就绪挂起时,系统可能会把正运行的进程转到就绪挂起状态;激活(Activate):把一个进程从外存转到内存;可能有以下几种情况:就绪挂起到就绪:没有就绪进程或挂起就绪进程优先级高于就绪进程时,会进行这种转换;阻塞挂起到阻塞:当一个进程释放足够内存时,系统会把一个高优先级阻塞挂起(系统认为会很快出现所等待的事件)进程变成阻塞状态;3.9.2转换挂起(Suspend):把一个进程从内存转到外106事件出现(EventOccurs):进程等待的事件出现;如:操作完成、申请成功等;可能的情况有:阻塞到就绪:针对内存进程的事件出现;阻塞挂起到就绪挂起:针对外存进程的事件出现;收容(Admit):收容(提交)一个新进程,进入就绪状态或就绪挂起状态。事件出现(EventOccurs):进程等待的事件出现;如1071、进程由就绪态转为运行态是因为()引起的? A、中断事件 b、进程状态转换 c、进程调度的 d、为程序创建进程C2、分配到必要的资源并获得处理机的进程状态是()。运行态3、当(),进程从执行状态转变为就绪状态。a、进程被调度程序选中b、时间片到c、等待某一事件d、等待的时间发生B4、判断题:两次打开Word字处理程序,编辑同一篇文章,因为程序一样(Word2003),数据一样(同一篇文章),所以系统中运行的这两个Word字处理程序是同一个进程。1、进程由就绪态转为运行态是因为()引起的?C2、分配到必要108[工学]操作系统课件-第2章-进程1093.10、进程控制块
3.10.1.进程控制块的作用
※※或者说:OS是根据PCB来对并发执行的进程进行控制和管理的。简单题:进程控制块的作用(要扩展)?判断题:进程控制块是进程存在的唯一标志。进程控制块是由OS维护的用来记录进程相关信息的一块内存。正确3.10、进程控制块3.10.1.进程控制块的作用※※1103.10.2进程控制块的内容(数据结构很复杂)进程标识符:内部进程标识符(processID),唯一,通常是一个整数;进程名(外部标识符),通常基于可执行文件名(不唯一);用户标识符(userID);进程组关系(processgroup)进程控制信息:当前状态;优先级(priority);代码执行入口地址;程序的外存地址;运行统计信息(执行时间、页面调度);进程间同步和通信;阻塞原因进程调度信息:进程状态、进程优先级、资源信息等处理机状态:寄存器值(通用、程序计数器PC、状态PSW,地址包括栈指针)3.10.2进程控制块的内容(数据结构很复杂)进程标识符:1113.10.3PCB的组织方式链表:同一状态的进程其PCB成一链表,多个状态对应多个不同的链表各状态的进程形成不同的链表:就绪链表、阻塞链表索引表:同一状态的进程归入一个index表(由index指向PCB),多个状态对应多个不同的index表各状态的进行形成不同的索引表:就绪索引表、阻塞索引表把具有相同状态的PCB,用其中的链接字,链接成一个队列。3.10.3PCB的组织方式链表:同一状态的进程其PCB1124、进程控制返回4、进程控制返回1134.1进程控制的功能:完成进程状态的转换。原语(primitive)※:由若干条指令构成的“原子操作(atomicoperation)”过程,作为一个整体而不可分割--要么全都完成,要么全都不做。许多系统调用就是原语。注意:系统调用并不都是原语。进程A调用read(),因无数据而阻塞,在read()里未返回。然后进程B调用read(),此时read()被重入。系统调用不一定一次执行完并返回该进程,有可能在特定的点暂停,而转入到其他进程。4.1进程控制的功能:完成进程状态的转换。原语(primi1144.2.1进程图(ProcessGraph)图2-9进程树用于描述进程家族关系的有向树。图中的结点代表进程。父进程:在进程Pi创建了进程Pj后,称Pi是Pj的父进程。子进程:在进程Pi创建了进程Pj后,称Pj是Pi的子进程。4.2进程的创建4.2.1进程图(ProcessGraph)图2-1154.2.2引起创建进程的事件
用户登录。(2)作业调度。(3)提供服务。(4)应用请求。
4.2.2引起创建进程的事件用户登录。1164.2.3进程的创建(CreationofProgress)过程
(1)申请空白PCB。(2)为新进程分配资源。(分配内存空间)(3)初始化进程控制块。(4)将新进程插入就绪队列,如果进程就绪队列能够接纳新进程,便将新进程插入就绪队列。4.2.3进程的创建(CreationofProgre1174.3进程退出也称为“终止”或主程序返回:调用exit()可终止进程。释放资源:释放内外存空间关闭所有打开文件释放共享内存段和各种锁定lock4.3进程退出也称为“终止”或主程序返回:调用exit()1184.4进程的阻塞与唤醒4.4.1引起进程阻塞和唤醒的事件请求系统服务2)启动某种操作3)新数据尚未到达4)无新工作可做4.4进程的阻塞与唤醒4.4.1引起进程阻塞和唤醒的事件1194.4.2.进程阻塞过程
正在执行的进程,当发现上述某事件时,无法继续执行,于是进程调用阻塞原语block把自己阻塞。可见,进程的阻塞是进程自身的一种主动行为。进入block过程后,由于此时该进程还处于执行状态,所以应先立即停止执行,把进程控制块中的现行状态由“执行”改为阻塞,并将PCB插入阻塞队列。如果系统中设置了因不同事件而阻塞的多个阻塞队列,则应将本进程插入到具有相同事件的阻塞(等待)队列。最后,转调度程序进行重新调度,将处理机分配给另一就绪进程,并进行切换。
4.4.2.进程阻塞过程1204.4.3进程唤醒过程当被阻塞进程所期待的事件出现时,如I/O完成或其所期待的数据已经到达,则由有关进程(比如,用完并释放了该I/O设备的进程)调用唤醒原语wakeup(),将等待该事件的进程唤醒。唤醒原语执行的过程是:首先把被阻塞的进程从等待该事件的阻塞队列中移出,将其PCB中的现行状态由阻塞改为就绪,然后再将该PCB插入到就绪队列中。4.4.3进程唤醒过程1214.5进程的挂起与激活
引起进程挂起的事件:4.5.1.进程的挂起挂起原语的执行过程是:首先检查被挂起进程的状态,若处于活动就绪状态,便将其改为静止就绪;对于活动阻塞状态的进程,则将之改为静止阻塞。最后,若被挂起的进程正在执行,则转向调度程序重新调度。-或父进程请求将自己的某个子进程挂起,-系统将利用挂起原语suspend()将指定进程或处于阻塞状态的进程挂起。-用户进程请求将自己挂起;4.5进程的挂起与激活引起进程挂起的事件:4.5.1.1224.5.2.进程的激活过程系统将利用激活原语active()将指定进程激活。激活原语先将进程从外存调入内存,检查该进程的现行状态,若是静止就绪,便将之改为活动就绪;若为静止阻塞便将之改为活动阻塞。4.5.2.进程的激活过程123例:NT线程的挂起和激活 NT中处理机的分配对象为线程,一个线程可被多次挂起和多次激活。在线程内有一个挂起计数(suspendcount),挂起操作使该计数加1,激活操作将该计数减1;当挂起计数为0时,线程恢复执行。(1)挂起:WindowsNT中的SuspendThread可挂起指定的线程;DWORDSuspendThread(HANDLEhThread//handletothethread);(2)激活:WindowsNT中的ResumeThread可恢复指定线程的执行;DWORDResumeThread(HANDLEhThread//identifiesthreadtorestart);例:NT线程的挂起和激活 NT中处理机的分配对象为线程,一124例子NT_thread.cpp#include<stdio.h>#include<windows.h>#include<iostream.h>#include<winbase.h>voidSubThread(void){ inti; for(i=0;i<5;i++) { cout<<"SubThread"<<i<<endl; Sleep(2000); }}例子NT_thread.cpp#include<stdio125voidmain(void){cout<<"CreateThread"<<endl; //Createathread; DWORDIDThread; HANDLEhThread; hThread=CreateThread(NULL,//nosecurityattributes0,//usedefaultstacksize(LPTHREAD_START_ROUTINE)SubThread,//threadfunctionNULL,//nothreadfunctionargument0,//usedefaultcreationflags&IDThread);//returnsthreadidentifier
//Checkthereturnvalueforsuccess. if(hThread==NULL) cout<<"CreateThreaderror"<<endl;voidmain(void)126
inti; for(i=0;i<5;i++) { cout<<"MainThread"<<i<<endl; if(i==1) {if(SuspendThread(hThread)==0xFFFFFFFF) {cout<<"Suspendthreaderror."<<endl; } else {cout<<"Suspendthreadisok."<<endl; } } if(i==3) { if(ResumeThread(hThread)==0xFFFFFFFF) {cout<<"Resumethreaderror."<<endl;} else {cout<<"Resumethreadisok."<<endl; } }Sleep(4000); }} inti;127运行结果CreateThreadMainThread0SubThread0SubThread1MainThread1Suspendthreadisok.MainThread2MainThread3Resumethreadisok.SubThread2SubThread3MainThread4SubThread4运行结果CreateThread128例子NT_thread.cpp#include<stdio.h>#include<windows.h>#include<iostream.h>#include<winbase.h>voidSubThread(void){ inti; for(i=0;i<5;i++) { cout<<"SubThread"<<i<<endl; Sleep(2000);//改一下时间,输出顺序会有变化 }}此处是用户自己的函数,完成指定功能例子NT_thread.cpp#include<st129voidmain(void){cout<<"CreateThread"<<endl; //Createathread; DWORDIDThread; HANDLEhThread; hThread=CreateThread(NULL,//nosecurityattributes0,//usedefaultstacksize(LPTHREAD_START_ROUTINE)SubThread,//threadfunctionNULL,//nothreadfunctionargument0,//usedefaultcreationflags&IDThread);//returnsthreadidentifier
//Checkthereturnvalueforsuccess. if(hThread==NULL) cout<<"CreateThreaderror"<<endl;voidmain(void)130
inti; for(i=0;i<5;i++) { cout<<"MainThread"<<i<<endl; if(i==1) {if(SuspendThread(hThread)==0xFFFFFFFF) {cout<<"Suspendthreaderror."<<endl; } else {cout<<"Suspendthreadisok."<<endl; } } if(i==3) { if(ResumeThread(hThread)==0xFFFFFFFF) {cout<<"Resumethreaderror."<<endl;} else {cout<<"Resumethreadisok."<<endl; } }Sleep(4000);//改一下结果会有变化。 }} inti;131运行结果CreateThreadMainThread0//输出后。Slee
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 【苏教版】-小学一年级数学下册-第1课时 数数、数的组成
- 25年春【大象版】小学2年级科学上册【二上4单元《力和形变》教材编写思路与教学建议·杨春生】
- 铜陵市护士招聘笔试题及答案
- 铁岭市教师招聘考试题库及答案
- 2026春苏科版(新教材)小学信息技术四年级下册《保护好自己的数据》同步练习及答案
- 烹饪西点蛋糕裱花技巧题目及答案
- 设计师排版题库及答案
- 十堰市教师招聘笔试题及答案
- 深圳市专职消防员招聘面试题及答案
- 26年鼻咽癌精准医疗质控要点梳理
- 2026年机关行政处罚法应知应会知识题库
- 2026年体育类教师招聘考试冲刺试卷
- 基层应急管理制度上墙(3篇)
- 2025-2030智慧办公室系统市场供需发展分析及投资引导规划研究报告
- 基金从业资格考试科目一基金法律法规、职业道德与业务规范完美无错字修订版
- 2026年广东广州市高三一模高考政治试卷试题(含答案详解)
- 火电行业环境保护培训课件
- 文化文学常识知识点02:文化常识-2026年山东省春季高考语文一轮复习
- 宁波银行人才库题库
- 工地安全生产责任制制度
- 国家科学技术奖励条例
评论
0/150
提交评论