当前位置:文档之家› 现代操作系统第二章复习重点

现代操作系统第二章复习重点

第二章进程与线程·在早期计算机中,每个字节的读写直接由CPU处理(即没有DMA),对于多道程序而言这种组织方式有什么含义?在这个读取任务中包括两个时间:CPU复制数据的时间和IO设备工作的时间。

而早期IO设备的速度太慢了,IO 设备的工作时间远大于把数据存到内存中所需要的时间,CPU则会空转很长时间,此时多道程序设计就非常必要了。

进程是OS提供的最古老最需要的抽象概念,它把来回切换的多道程序描述成一种多程序的并发。

2.1进程多道程序设计站在系统的角度——提高了CPU的利用率站在用户的角度——可“同时”运行多个程序对某个具体的任务而言——执行速度不变单个CPU不能真正实现并行计算,其在任意时刻都只能执行一道指令。

(第一章到第六章都是以单个CPU来讲解的)·如何解决这个矛盾:OS采用了一系列软件技术实现程序并发执行。

·什么是程序的并发执行【“大家注意把这个刻在脑子里”】若干个程序段同时在系统中运行,这些程序段的执行在时间上是重叠的,一个程序段的执行尚未结束,另一个程序段的执行已经开始,即使这种重叠是很小的一部分,也称这几个程序段是并发执行的。

·什么是运行时间:程序在内存中的时间。

只有一个CPU,但是又希望有多个CPU——虚拟出多个CPU。

(“伪并行”,在任意时刻只有一个程序是活跃的)面向每个任务虚拟出一个CPU,这就是进程。

(CPU:从内存中取指令并执行)虚拟出的CPU本质:对每个进程虚拟了程序计数器。

2.1.1进程模型并行性:处理多个同时性活动的能力并行处理:利用多个处理部件,为完成一个整体任务而同时执行在任意时刻物理PC只对应一个程序的指令底层:CPU在各个进程间来回切换2.1.2进程的创建有4种主要事件导致进程的创建:1.系统初始化(foreground processes and daemons)2.执行了正在运行的进程所调用的进程创建系统调用★3.用户请求创建一个新进程4.一个批处理作业的初始化Fork子进程是父进程的精确副本。

(但子进程的执行是独立的)调用一次返回两次。

真正出现在代码中的不是系统调用程序,是系统调用的接口。

Pid=fork()pid>0:父进程pid=0:子进程如果返回-1:代表创建子进程失败。

父进程子进程谁先执行谁后执行不能确定。

Execlp(替换子进程)子进程复制了父进程的PC、正文、堆、栈等内容,包括输出缓冲。

Printf换行符:清空当前缓冲行;Putchar():在创建子进程后,当前缓冲行没有被清空,则子进程也会输出父进程中Putchar()的内容。

希望父子进程共享地址空间——vfork()Vfork会确保子进程先执行,子进程用exec或exit退出。

(子进程不能用return(0)而是exit(0))单CPU并行(多程序并发执行)与GPU并行的区别?伪并行,不能提高CPU执行速度和效率单CPU有空闲单CPU不够用共同点:价值体现在CPU确实有事要忙(多任务)2.1.5进程的状态只有运行态和就绪态可以相互变迁,且都是由于系统调度。

(CPU调度)为了更好地管理进程,我们会对它建立数据结构,通常采用的数据结构就是队列。

就绪队列:就绪态各个等待队列:阻塞态·程序的并发执行?两个程序在执行时间上有重叠。

·操作系统如何实现并发执行?计算机上所有软件被组织成若干顺序进程,用调度算法使CPU在各个进程间来回切换。

进程的五种状态及转换关系图2.1.6进程的实现为了实现进程模型,即多任务并发执行,OS维护着一张表格(一个结构数组)——进程表;每个进程对应一个进程表项(也叫进程控制块,PCB);它包含进程状态的重要信息:PC、堆栈指针、内存分配状况、所打开文件的状态、账号和调度信息、其他进程由运行态转换到就绪态或阻塞态时必须保存的信息。

(PPT英文,找了课本的图)CPU在各个进程间来回切换,切换时操作系统会保存现场。

保存线程——保存PCB就绪队列——就绪态;等待队列——堵塞态。

(因为可能有不同堵塞原因,所以有多个等待队列)·在单个CPU如何维持多个顺序进程的错觉?中断向量(Interrupt vector)的位置?因为操作系统通过我们之前一系列技术实现的,这些技术离不开中断处理,因此中断处理会放在内存固定的地方,即靠近内存底部的固定区域,它包含中断服务程序的入口地址。

假设当一个磁盘中断发生时,用户进程A正在运行,则---1.中断硬件将程序计数器、程序状态字、一个或多个寄存器压入堆栈,计算机随机跳转到中断向量所指示的地址(保存现场)2.软件,特别是中断服务例程接管一切剩余的工作。

【多道程序设计模型】怎么量化CPU的利用率呢?于是提出了概率模型Probabilistic Model(概率模型)p:一个进程等待I/O操作的时间与其停留在内存中的时间比n:内存中同时存在的进程数量·什么情况下多道程序设计最有价值?最有价值:内存足够的情况下,我可以增加尽可能多的程序道数,而且在这一过程中,随着程序道数的增加,我的CPU利用率一直在上升。

——所以由图,80%I/O的时候最有价值。

【重要题型:CPU利用率】(顺序执行时,∵CPU20分钟,I/O等待占50%,∴IO也需要20分钟,∴总共40分钟,又∵两个作业,∴总共80分钟。

并行执行时,则需要计算利用率。

总时间=真正用到的时间÷cpu利用率)2.1.7多道程序设计模型2.2线程传统操作系统中,每个进程有一个地址空间和一个控制线程<--->进程进程有两个基本属性:拥有资源的独立单元&被处理器独立调度和分配的单元。

通常存在一个地址空间中准并行运行多个控制线程的情形分离的进程&共享地址空间为了减小系统开销,出现了线程。

但还是以进程为单位分配资源。

(以线程为调度运行的单位,系统开销大大减小)·多线程的必要性?回顾进程模型→多线程→并行实体共享同一地址空间和可用数据的能力比进程更轻量级,比进程更易创建【快10-100倍】原因:创建线程时不需要给它分配地址空间和额外的资源。

性能:存在大量计算和I/O操作情况下加快应用程序执行速度。

多线程的价值:同步完成多项任务;不是为了提高运行效率,而是为了提高资源使用效率来提高系统的效率。

2.2.2经典的线程模型进程VS线程进程用于把资源集中到一起,而线程则是在CPU上被调度执行的实体;线程给进程模型增加了一项内容:在同一个环境中,允许彼此有较大独立性的多个线程执行。

·进程中的不同线程与不同进程间的独立性相比?进程独立性是为了竞争而存在,线程独立性是为了合作而存在,他们是不一样的。

同一进程中的各个线程的共享内容(左)各个线程私有的内容(右)·为何Stack(栈)为线程私有内容?因为线程是独立执行的,函数参数、局部变量都保存在栈中,函数名只是一段代码的起始地址而已,它执行时要取参数(保存在栈中,要取局部变量,这些都在栈中,所以为了线程不互相干扰,堆栈是独立的。

2.2.4在用户空间中实现线程在内核只有进程表,是看不到线程的。

操作系统的调度一定是以进程为单位调度的。

·为什么要在用户空间实现多线程呢?在用户空间实现多线程依然可以更高效的执行,只是只能由进程自己的运行时系统来管理,进程中会有自己的线程表。

·进程中会有自己的线程表的好处?减少开销,减少干预,安排线程更加灵活;缺点:操作系统还是以进程为单位调度,所以没办法更好地根据线程的需要分配资源。

2.2.5在内核中实现线程线程由内核管理,内核有进程表和线程表。

内核开销大,不够灵活。

可以真正实现以线程为单位的调度。

2.2.6混合实现若干用户级线程对应一个内核线程。

线程的实现小结用户空间实现[用户级线程ULT(User Level Threads)]由应用程序完成所有线程的管理通过线程库(用户空间)一组管理线程的过程核心不知道线程的存在线程切换不需要核心态特权调度是应用特定的在内核中实现[内核支持线程KST(Kernel Supported Threads)]所有线程管理由内核完成没有线程库,但对内核线程工具提供API内核维护进程和线程的上下文[线程表]线程之间的切换需要内核支持以线程为基础进行调度例子:Windows NT,OS/2★不同优缺点用户空间实现核心不知道线程的活动,但仍然管理线程的进程的活动;当线程调用系统调用时,整个进程阻塞优点:线程切换不调用内核调度是应用程序特定的:可以选择最好的算法ULT可运行在任何操作系统上(只需要线程库)Run-time system缺点:大多数系统调用是阻塞的,因此内核阻塞进程,故进程中所有线程将被阻塞内核只将处理器分配给进程,同一进程中的两个线程不能同时运行于两个处理器上。

内核中实现优点:对多处理器,内核可以同时调度同一进程的多个线程;阻塞是在线程一级完成;内核例程是多线程的缺点:在同一进程内的线程切换调用内核,开销大,导致速度下降。

2.3进程间通信(第二章的核心)全局变量究竟应该私有还是共享呢?——关键:不同的线程间是否需要通信。

(线程可以拥有私有的全局变量)全局变量共享:实现进程间通信进程间通信,IPC三个问题需要处理:①一个进程如何把消息传递给另一个②确保两个或更多的进程在关键活动中不会出现交叉③正确的顺序相关(原语操作)请记住同样的问题和解决方法也适用于线程。

2.3.1竞争条件竞争条件:两个或多个进程读写某些共享数据,而最后的结果取决于进程运行的精确时序。

如何避免竞争条件?——实现对共享数据的互斥操作抽象描述:把对共享内存进行访问的程序片段称作临界区域或临界区采取措施使2个进程不可能同时处于临界区。

形成原语→形成程序片段(临界区)2.3.2临界区·避免竞争条件的解决方案满足的条件?①任何时候都没有2个进程同时在临界区②对CPU的速度和数量不做任何假设③任意运行在临界区外的进程都不能阻塞其它进程④任何进程总有机会可以进入其临界区·何为临界区?对共享内存进行访问的程序片段。

·下面代码中临界区是?全局变量是count则访问了count的都是临界区2.3.3忙等待的互斥方案说明实现代码一定有while或for,循环测试。

1.屏蔽中断在每个进程在刚刚进入临界区后立即屏蔽所有中断(包括时钟中断),并在就要离开前再打开所有中断。

缺点:①把屏蔽中断的权利交给用户可能导致严重后果②中断时间过长,会影响系统效率,限制了处理器交叉执行程序的能力③多处理器情况下,中断屏蔽仅对执行Disable指令的那个CPU有效2.锁变量软件解决方案:共享锁变量,初始值为0一个进程想进入临界区时首先测试这把锁0:临界区没有进程1:临界区有进程缺点:锁变量本身也是全局变量,其依然会被争抢。

相关主题