[总结]操作系统真是博大精深(二)

来源:互联网 发布:sublime windows 破解 编辑:程序博客网 时间:2024/06/06 17:18

进程管理

1、一个进程应该包括:程序的代码;程序的数据;PC中的值,用来指示下一条将运行的指令;一组通用的寄存器的当前值,堆、栈;一组系统资源(如打开的文件)

2、区分程序和进程:程序是文本,是语句的描述(静态);进程是运行中的程序,含有上下文信息(动态)。程序是被动的,进程是主动的。程序在外存上存储,进程在内存中实现;程序没有PCB,无法并发执行,无法被调度,而进程相反。一个程序多次执行可以产生多个进程,一个进程可以执行多个程序。

3、进程的特征:

  ⑴结构特征:程序段、相关的数据段、PCB构成了进程实体。

  ⑵动态性:进程是进程实体的一次执行,进程的状态总是在变化,PCB的内容总是在变化。

  ⑶并发性:多个进程实体,同存于内存中,能在一段时间内同时运行(宏观上)。

  ⑷独立性:独立运行和资源调度的基本单位。每个进程都有“自己”的PC和内部状态,运行时独立于其他的进程(逻辑PC和物理PC)。

  ⑸异步性:以各自独立的、不可预知的速度向前推进。

4、进程的三种状态:就绪(Ready)状态:进程一旦获得CPU就可以投入运行的状态;执行状态:进程获得CPU正在运行的状态;阻塞状态:进程由于等待资源或某个事件的发生而暂停执行的状态。

5、进程的三种状态间的转化

  ⑴运行à阻塞:等待I/O的结果;等待某一进程提供的输入

  ⑵运行à就绪:运行进程用完了时间片;运行进程被中断,因为一高优先级进程处于就绪状态

  ⑶就绪à运行:调度程序选择一个新的进程运行

  ⑷阻塞à就绪:当所等待的事件发生时

6、在某些系统中,由于一些特殊的原因(比如说考察进程情况或者调节系统负荷),进程被从内存中调出进驻外存,不再接受调度。这种新的状态被称为挂起状态。

7、进程控制块PCB:描述进程的数据结构,进程实体的一部分,是操作系统中最重要的记录型数据结构,PCB中记录了操作系统所需要的,用于描述进程情况及控制进程运行所需的全部信息。OS是根据PCB来对并发执行的进程进行控制和管理的。系统用PCB来描述进程的基本情况以及运行变化的过程,PCB是进程存在的唯一标志

8、将CPU切换到另一进程需要保存原来进程的状态并装入新进程的保存状态,这被称为上下文切换。上下文切换时间是额外开销,因为切换时系统并不能做什么有用的工作。上下文切换时间与硬件支持密切相关。

9、PCB的组织:链接、索引

10、进程创建

  ⑴引起事件:系统初始化时;在一个正在运行的进程当中,执行了创建进程的系统调用;用户请求创建一个新进程;初始化一个批处理作业。

  ⑵从技术上来说,只有一种创建进程的方法,即在一个已经存在的进程(用户进程或系统进程)当中,通过系统调用来创建一个新的进程。Unix:fork函数;Windows:CreateProcess函数。

⑶创建步骤:申请空白PCB;为新进程分配资源;初始化进程控制块;将新进程插入就绪队列,如果进程就绪队列能够接纳新进程,便将新进程插入就绪队列

11、进程终止

  ⑴情景:正常退出(自愿的);错误退出(自愿的);致命错误(强制性的);被其他进程所杀(强制性的)

  ⑵Unix:kill;Windows:TerminateProcess

  ⑶终止步骤:读出该进程的状态;终止该进程的执行,并置调度标志为真,用于指示该进程被终止后应重新进行调度;将其所有子孙进程予以终止;将被终止进程所拥有的全部资源归还给其父进程或者系统;将被终止进程的PCB从所在队列(或链表)中移出。

12、进程阻塞和唤醒

  ⑴事件:请求系统服务;启动某种操作;新数据尚未到达;无新工作可做

  ⑵阻塞步骤:调用阻塞原语block把自己阻塞;将PCB插入阻塞队列;最后,转调度程序进行重新调度,将处理机分配给另一就绪进程,并进行切换,亦即,保留被阻塞进程的处理机状态(在PCB中),再按新进程的PCB中的处理机状态设置CPU的环境。

  ⑶唤醒步骤:首先把被阻塞的进程从等待该事件的阻塞队列中移出;将其PCB中的现行状态由阻塞改为就绪;然后再将该PCB插入到就绪队列中。

13、进程的挂起和激活

  ⑴挂起步骤:修改进程状态;PCB复制到某指定的内存区域;如有必要转调度程序。

  ⑵激活步骤:进程调入内存;修改进程状态;如抢占调度考虑是否执行。

14、进程间通信(InterProcess  Communication,IPC):进程之间的信息交流与协调。如果两个并发运行的进程之间没有任何关联关系(直接的或间接的),那么无须通信;如果两个并发运行的进程之间存在着某种关联关系(直接的或间接的),那么可能需要通信。

15、进程互斥问题:两个或多个进程在进行一些关键性的临界活动时(如对共享资源的访问),如何确保它们不会相互妨碍;进程同步问题:进程之间存在着某种依存关系时,如何来调整它们的运行次序。

16、两个或多个进程对同一共享数据同时进行读写操作,而最后的结果是不可预测的,它取决于各个进程具体运行情况。在同一时刻,只允许一个进程访问该共享数据,即如果当前已有一个进程正在使用该数据,那么其他进程暂时不能访问。这就是互斥的概念。

  ⑴进程在运行过程中所做的工作分为两类:内部计算(不会导致竞争条件)、对共享内存或共享文件的访问(可能导致竞争条件)

  ⑵我们把完成第二类工作的程序称为“临界区”,把需要互斥访问的共享资源称为“临界资源”。

  ⑶实现互斥访问的四个条件:任何两个进程都不能同时进入临界区;不能事先假定CPU的个数和运行速度;当一个进程运行在它的临界区外面时,不能妨碍其他的进程进入临界区;任何一个进程进入临界区的要求应该在有限时间内得到满足。

  ⑷整型信号量:最初由Dijkstra把整型信号量定义为一个整型量,除初始化外,仅能通过两个标准的原子操作(Atomic Operation) wait(S)和signal(S)来访问。这两个操作一直被分别称为P、V操作。wait(S): whileS≤0 do no-op S:=S-1; signal(S): S:=S+1;

  ⑸记录型信号量:信号量被描述为一个记录(或者结构)。在记录型信号量机制中,S.value的初值表示系统中某类资源的数目,因而又称为资源信号量,对它的每次wait操作,意味着进程请求一个单位的该类资源,因此描述为S.value:=S.value-1; 当S.value<0时,表示该类资源已分配完毕,因此进程应调用block原语,进行自我阻塞,放弃处理机,并插入到信号量链表S.L中。

  ⑹当n个进程互斥的使用某个临界资源时,我们为此临界资源设置一个用于互斥访问的信号量mutex,并初始化为 1。每个进程的组织结构如下:wait (mutex);临界区;signal (mutex);剩余区。

  ⑺P原语操作的定义:procedure wait(S)var S: semaphore;beginS.value:=S.value-1;  if S.value<0 thenblock(S,L);end;

    V原语操作的定义:procedure signal(S)varS: semaphore;beginS.value:=S.value+1; if S.value≤0 then wakeup(S,L); end;

17、AND型信号量:将进程在整个运行过程中需要的所有资源,一次性全部地分配给进程,待进程使用完后再一起释放。这样就可避免上述死锁情况的发生。

  ⑴信号量集是指同时需要多种资源、每种占用的数目不同、且可分配的资源还存在一个临界值时的信号量处理(一次需要N个某类临界资源时,就要进行N次wait操作,低效又可能死锁),一般信号量集的基本思路就是在AND型信号量集的基础上进行扩充,在一次原语操作中完成所有的资源申请。

  ⑵进程对信号量Si的测试值为ti(表示信号量的判断条件,要求Si >= ti;即当资源数量低于ti时,便不予分配);占用值为di(表示资源的申请量,即Si = Si – di),对应的P、V原语格式为:Swait(S1, t1, d1; ...; Sn, tn, dn);Ssignal(S1,d1; ...; Sn, dn);

  ⑶一般“信号量集”的几种特殊情况:

    ①Swait(S, d, d)。 此时在信号量集中只有一个信号量S, 但允许它每次申请d个资源,当现有资源数少于d时,不予分配。

    ②Swait(S, 1, 1)。 此时的信号量集已蜕化为一般的记录型信号量(S>1时)或互斥信号量(S=1时)。

    ③Swait(S, 1, 0)。这是一种很特殊且很有用的信号量操作。当S≥1时,允许多个进程进入某特定区;当S变为0后,将阻止任何进程进入特定区。换言之,它相当于一个可控开关。

18、进程间的同步是指多个进程中发生的事件存在某种时序关系,因此在各个进程之间必须协同合作,相互配合,使各个进程按一定的速度执行,以共同完成某一项任务。

⑴进程的互斥实质上也是一种同步关系,进程互斥可以看作是一种特殊的进程同步。为便于区分,把进程同步特指为对执行顺序严格要求的同步问题。同步:合作。互斥:竞争。

  ⑵互相合作的两个进程只有一个可以先执行;信号量S1和S2的初值,一个为1,一个为0。

19、经典IPC问题:生产者-消费者问题、哲学家就餐问题、读者-写者问题。

20、信号量方法的缺点

  ⑴使用困难:各并发进程间的逻辑关系比较复杂,在使用信号量时,必须小心谨慎,稍有不当(如P、V操作的次序错误、重复或遗漏)就会出错;

  ⑵出错后果严重:如竞争状态、死锁和各种无法预料的、不可重现的错误现象;

  ⑶可读性差:信号量的控制分布在整个程序中,其正确性分析很困难;

  ⑷维护困难:各模块的独立性差,任一组变量或一段代码的修改都可能影响全局。

21、管程基本思想是:将共享变量以及对共享变量所进行的操作封装在一个模块中。管程是由一组变量、数据结构和函数所构成的一种特殊的软件模块。

  ⑴特性:①封装性:进程可以调用管程当中的函数,但是不能直接访问管程的内部数据结构;②互斥性:在任何时候,只允许一个进程在管程中活动(即调用管程的函数);③语言相关性:管程属于编程语言的范畴,由编译器来识别并实现对管程内函数的互斥访问

  ⑵互斥:把共享数据封装在管程内,把各个进程的临界区变成管程当中的函数。这样就能够保证任何两个进程都不会同时进入它们的临界区。

  ⑶同步:在管程内部,应当具有某种等待机制。当进入管程的进程因资源被占用等原因不能继续运行时应使其等待。因此在管程内部可以声明和使用一种特殊类型的变量----条件变量。

  ⑷条件变量:用来描述等待的原因。每个条件变量表示一种等待的原因,它不取具体的数值。对条件变量的操作:wait和signal;当一个管程函数发现它不能继续执行下去时,使用wait操作,使得调用它的进程进入阻塞状态,同时允许其他的进程进入管程;而signal操作的作用是唤醒某个正在等待的进程。通过wait和signal操作即可实现进程间同步关系;wait操作和signal操作有点类似于P、V原语,但条件变量不取具体的数值,不进行信号的累加,因此在signal操作发出信号前,必须有wait操作在等待,否则该信号就丢失了。

22、低级通信:只能传递状态和整数值(控制信息),包括用来实现进程同步和互斥的信号量和管程机制,优点是速度快。缺点是传送信息量小,编程复杂。高级通信:能够传送任意数量的数据,包括三类:共享内存、管道、消息。

  ⑴共享内存:绝大多数现代的操作系统都提供了相应的方法,来让各个进程共享它们地址空间当中的某些部分,即共享内存。在共享内存中,可以任意读写和使用任意的数据结构(缓冲区)。一组进程向共享内存中写,另一组进程从共享内存中读,通过这种方式实现两组进程间的信息交换。类似于生产者-消费者问题中的缓冲区,需要进程的同步和互斥机制来确保数据的一致性。

  ⑵管道通信以文件系统为基础,所谓管道即连接两个进程之间的一个打开的共享文件,专用于进程之间的数据通信;发送进程从管道的一端写入数据流,接收进程从管道的另一端按先进先出的顺序读出数据;在对管道文件进行读写过程中,发送进程和接收进程要进行正确的同步和互斥,由系统自动完成。

  ⑶消息机制是由操作系统来维护的,进程在通信时无须使用共享变量,而是以消息作为信息载体。消息机制提供了两个原语操作(系统调用):Send和receive。如果进程P和Q想要进行通信,它们需要:在两者之间建立一个通信链路,使用send和receive交换信息。

  ⑷消息的直接通信:通信双方必须指明与之通信的对象,操作系统维护着一个消息缓冲区,当一条消息已经被发送,但还没有被接收时,系统自动把它放在缓冲区当中。

    消息间接通信:进程间通过一个中间媒介─信箱来实现通信。当两个进程需要通信时,就创建一个共享的信箱,通过该信箱来发送和接收消息。

23、线程:进程当中的一条执行流程。

  ⑴进程=资源平台+线程。一个进程中可以同时存在多个线程;各个线程之间可以并发地执行;各个线程之间可以共享地址空间。

  ⑵进程的引入,实现了系统级的并发;线程的引入,实现了进程级的并发

  ⑶线程与进程

    ①进程是资源分配单位,线程是CPU调度单位;

    ②进程拥有一个完整的资源平台,而线程只独享必不可少的资源,如寄存器和栈;

    ③线程同样具有就绪、阻塞和执行三种基本状态,同样具有状态之间的转换关系;

    ④线程能减少并发执行的时间和空间开销,线程的创建时间比进程短,线程的终止时间比进程短,同一进程内的线程切换时间比进程短;

    ⑤由于同一进程的各线程间共享内存和文件资源,可直接进行不通过内核的通信;

    ⑥线程 = 轻量级进程

  ⑷线程的实现

①用户线程:在用户空间实现。它不依赖于操作系统的内核,由一组用户级的线程库函数来完成线程的管理,包括进程的创建、终止、同步和调度等。不需要操作系统内核了解用户线程的存在,可用于不支持线程技术的多进程操作系统;每个进程都需要它自己私有的线程控制块(TCB)列表,用来跟踪记录它的各个线程的状态信息(PC、栈指针、寄存器),TCB由线程库函数来维护;用户线程的切换也是由线程库函数来完成,无需用户态/核心态切换,所以速度特别快;允许每个进程拥有自定义的线程调度算法。

缺点:如果一个线程发起系统调用而阻塞,则整个进程在等待;当一个线程开始运行后,除非它主动地交出CPU的使用权,否则它所在的进程当中的其他线程将无法运行;时间片分配给进程,多线程则每个线程就慢。

②内核线程:在内核中实现。在操作系统的内核当中实现的一种线程机制,由操作系统的内核来完成线程的创建、终止和管理。在支持内核线程的操作系统中,由内核来维护进程和线程的上下文信息(PCB和TCB),线程的创建、终止和切换都是通过系统调用的方式来进行,需要从用户态转换到系统态,由内核来完成,因此系统开销较大;在一个进程当中,如果某个线程发起系统调用而被阻塞,并不会影响其他线程的运行;时间片分配给线程,多线程的进程获得更多CPU时间。

24、就绪队列中只要有两个以上的进程存在就会竞争CPU的使用权。如果只有1个CPU可用,那么就必须选择下一个要运行的进程。完成选择工作的这一部分称为调度程序(scheduler),该程序使用的算法称为调度算法(schedulingalgorithm)。

  ⑴几乎所有进程的(磁盘)I/O请求或计算都是交替突发的。进程类型包括计算密集型和I/O密集型。CPU的提高比磁盘更快,越来越多的进程倾向于I/O密集型。

  ⑵进程何时被调度:当一个进程运行完毕时;当一个新的进程被创建时;当一个进程由于I/O、信号量或其他的某个原因被阻塞时;当一个I/O中断发生时,表明某个I/O操作已经完成,而等待该I/O操作的进程转入就绪状态;在分时系统中,当一个时钟中断发生时。

  ⑶进程调度的方式:不可抢占调度方式:一个进程若被选中,就一直运行下去,直到它被阻塞(I/O,或正在等待其他的进程),或主动地交出CPU;可抢占调度方式:当一个进程在运行时,调度程序可以打断它。另外,在其他的一些情形下,如就绪队列中有进程的优先级高于当前运行进程的优先级,也可能立即进行调度。

25、分派程序是一个模块,用来将CPU的控制交给由短期调度程序所选择的进程。其功能包括切换上下文、切换到用户模式、跳转到用户程序的合适位置以重新启动这个程序。分派延迟(dispatch latency):分派程序停止一个进程而启动另一个进程执行所要花费的时间。

26、算法调度的目标是多元的,有些是可以共存的,也有些是相互牵制的,对于一个实际的调度算法来说,有一个综合权衡的过程。所有系统普遍适用的目标:公平:大致相当的两个进程所得到的CPU时间也应是大致相同的;对已制订的调度策略必须能贯彻执行;均衡:尽可能使整个系统的各部分都忙起来,提高系统资源的使用效率。

27、批处理系统中调度算法的评价指标:

  ⑴吞吐量(Throughput):单位时间内所完成的作业数,与作业本身特性和调度算法有关;

  ⑵周转时间(Turnaround time):一个批处理作业从提交到完成(得到结果)所经历的时间。包括:在收容队列中等待,CPU上执行,就绪队列和阻塞队列中等待,结果输出等待;

  ⑶平均周转时间:一批作业的周转时间的平均值;

  ⑷平均带权周转时间:权值是实际执行时间的倒数。

28、交互式系统中调度算法的评价指标:

  ⑴响应时间:用户输入一个请求(如击键)到系统给出首次响应(如屏幕显示)的时间。响应时间越短越好,优先考虑交互式进程;

  ⑵相称性:满足用户对程序运行时间的期望值。

29、实时系统中调度算法的评价指标:

  ⑴实时响应:必须严格地遵守时间期限;

  ⑵可预测性:在实时多媒体系统中,信号的播放必须连贯,不能时断时续。

30、批处理系统的调度算法-FCFS:先来先服务,按照作业到达的先后次序进行调度。不可抢占。

⑴优点:简单,易于理解也易于实现。现实生活中应用广泛:排队。

⑵缺点:平均周转时间取决于各作业到达的顺序,若短作业位于长作业之后,将增大平均周转时间。无法充分利用CPU繁忙的作业与I/O繁忙的作业之间的互补关系。如果CPU繁忙的作业独占很长时间的CPU,使得I/O设备空闲,也使得I/O繁忙的作业无法运行。

31、批处理系统的调度算法-SJF:短作业优先(Shortest  Job First,SJF),SJF算法要求作业在开始执行时预计执行时间,对预计执行时间短的作业优先分派处理器。

⑴不可抢占方式:当前作业在运行时不会被打断,只有运行完毕或阻塞时,才让出CPU;

⑵可抢占方式:如果一个新的短作业到来,其运行时间小于当前正在运行作业的剩余时间,则抢占CPU运行,称为SRTF。

⑶优点:对于一组同时到达的作业,采用SJF算法将得到一个最小的平均周转时间。

32、批处理系统的调度算法-HRN:一种动态优先权算法,最高响应比作业优先算法是对FCFS方式和SJF方式的一种综合平衡。响应比R定义为系统对作业的响应时间与作业要求运行时间的比值。R=响应时间 / 要求运行时间= 1+已等待时间/ 需运行时间= 1+W/T。

33、交互式系统的调度算法-RR:在时间片轮转算法(Round-Robin,RR)中,将所有的就绪进程按照FCFS原则,排成一个队列;每次调度时将处理器分派给队首进程,让其执行一小段CPU时间;在一个时间片结束时,如果进程还没有执行完的话,将发生时钟中断,在时钟中断中,进程调度程序将暂停当前进程的执行,并将其送到就绪队列的末尾,然后执行当前的队首进程;如果一个进程在它的时间片用完之前就已结束或被阻塞,那么立即让出CPU。

  ⑴优点:公平性:各个就绪进程平均地分配CPU的使用时间。假设有n个就绪进程,时间片大小为q,那么每个进程将得到1/n的CPU时间;活动性:每个进程最多等待(n-1)q时间就能够再次得到CPU去运行;一般来说,平均周转时间较SJF算法为长,但能够得到较短的平均响应时间。

  ⑵缺点:的大小难以确定(一般在20-50ms)。q太大:退化为FCFS算法,进程在一个时间片内都执行完,响应时间长。q太小:每个进程都需要更多的时间片才能处理完,进程切换次数增加,增大系统开销。

34、多级队列算法:引入多个就绪队列,通过各个队列的区别对待,达到一个综合的调度目标。

  ⑴根据进程的性质或类型的不同,将就绪队列再分为若干个子队列,如系统进程、用户交互进程、批处理进程等;不同的队列可以有不同的优先级;不同的队列可以采用各自不同的调度算法,如前台的交互式进程可采用RR算法,后台的批处理进程可采用FCFS算法。

  ⑵在各个队列之间也必须进行调度。

固定优先级调度:按照各种类型的进程的优先级别从高到低地进行,先运行最高优先级的所有进程,再运行次一级所有进程,依此类推。问题:可能导致“饥饿”。

时间片方法:把CPU时间按比例分配给不同的队列,然后再由各个队列的调度算法去调度,如80%给前台的交互式进程队列(RR算法),20%给后台的批处理进程队列FCFS)。

35、多级反馈队列算法:根据一个进程的运行反馈信息,动态地调整它所在的队列。

  ⑴参数:队列的个数;每个队列所用的调度算法;用来确定何时给一个进程“升级”的方法;用来确定何时给一个进程“降级”的方法;用来确定一个进程的初始队列的方法。

  ⑵举例:三种优先级别,3最高、1最低,三个就绪队列。时间片长度分别为N、2N和4N;新进程进入内存后,优先级为3,加入队列3的末尾,按FCFS算法调度;若一个时间片内未能执行完,则优先级降为2,加入到队列2的末尾,同样按FCFS算法调度;依此类推。仅当较高优先级的队列为空,才调度较低优先级的队列中的进程执行。若进程执行时有新进程进入较高优先级的队列,则抢先执行新进程。

36、实时系统调度算法

  ⑴硬实时:有一个绝对的时间期限,计算机的反应动作必须在此期限之前完成,如核电站的控制系统;软实时:偶尔错过一次期限虽然是令人不快的,但也是可以容忍的,如VCD的播放系统。

  ⑵实时调度算法可以是静态的或动态的,前者在系统开始运行之前即已做好调度决策;而后者是在运行中做出调度决策。

  ⑶实时系统调度算法-最早截止时间优先算法:根据任务的开始截止时间确定任务优先级,截止时间越早,优先级越高。可用于抢占和非抢占式。

⑷实时系统调度算法-最低松弛度优先算法:根据任务紧急(或松弛)的程度,来确定任务的优先级。任务的紧急程度愈高,为该任务所赋予的优先级就愈高,以使之优先执行。松弛度=必须完成时间-本身运行时间-当前时间。

37、在一组进程中,每个进程都占用着若干个资源,同时又在等待得到该组进程中另一进程所占用的资源,因而造成的所有进程都无法进展下去的现象,这种现象称为死锁,这一组进程就称为死锁进程。

  ⑴可抢占的资源:当一个进程正在使用这种类型的资源时,可以把它拿走而不会对该进程造成任何不良的影响。不可抢占的资源:当一个进程正在使用这种类型的资源时,如果强行把它拿走,将会导致该进程运行失败。死锁主要由不可抢占资源引起,对于可抢占资源而言,可以通过重新分配资源的方法来避免死锁。

  ⑵死锁原因:资源有限;并发进程间的推进顺序不当。

  ⑶死锁的四个必要条件:

    ①互斥条件:在任何时刻,每一个资源最多只能被一个进程所使用;

    ②请求和保持条件:进程在占用若干个资源的同时又可以请求新的资源;

    ③不可抢占条件:进程已经占用的资源,不会被强制性拿走,而必须由该进程主动释放;

    ④环路等待条件:存在一条由两个或多个进程所组成的环路链,其中每一个进程都在等待环路链中下一个进程所占用的资源。

  ⑷应对死锁的策略:忽略;检测并恢复;避免(小心的进行资源分配);预防(破坏死锁的必要条件之一)。

38、死锁的避免

⑴安全状态,是指系统能按某种顺序,如安全序列(P1,P2,…,Pn)来为每个进程分配其所需资源,直至最大需求,使每个进程都可顺序完成。避免死锁的实质在于:如何使系统不进入不安全状态。

  ⑵银行家算法。

39、死锁的检测:对于一个系统而言,首先构造它的资源分配图,然后观察里面是否存在有封闭的环路,若有,则存在着死锁,该环路上的所有进程都是死锁进程;若没有,则系统不存在死锁。

40、死锁的解除:剥夺资源、进程回退、撤销进程。

原创粉丝点击