文档库 最新最全的文档下载
当前位置:文档库 › 《计算机操作系统教程》第三版答案作者左万历+周长林

《计算机操作系统教程》第三版答案作者左万历+周长林

《计算机操作系统教程》第三版答案作者左万历+周长林
《计算机操作系统教程》第三版答案作者左万历+周长林

第一章操作系统概述课后习题

1. 硬件将处理机划分为两种状态,即管态和目态,这样做给操作系统设计带来什么好处 ? 答:便于设计安全可靠的操作系统。管态和目态是计算机硬件为保护操作系统免受用户程序的干扰和破坏而引入的两种状态。通常操作系统在管态下运行,可以执行所有机器指令;而用户程序在目态下运行,只能执行非特权指令。如果用户程序企图在目态下执行特权指令,将会引起保护性中断,由操作系统终止该程序的执行,从而保护了操作系统。

2. 何为特权指令?举例说明之。如果允许用户执行特权指令,会带来什么后果?答:只能在态下才能执行的指令称为特权指令。如开关中断、置程序状态寄存器等。如果允许用户执行特权指令,它将不仅影响当前运行的程序,而且还有可能影响操作系统的正常运行,甚至整个系统。

3. 中断向量在机器中的存储位置是由硬件确定的,还是由软件确定的 ? 答:中断向量在机器中的位置是由硬件确定的。例如,在 INTEL 80x86 CPU 中,内存空间0x00000——0x003ff为中断向量空间。

4. 中断向量的内容是由操作系统程序确定的还是由用户程序确定的?答:中断向量的内容是由操作系统程序确定的。向量的内容包括中断处理程序的入口地址和程序状态字(中断处理程序运行环境),中断处理程序是由操作系统装入内存的,操作系统将根据装入的实际地址和该中断处理程序的运行环境来填写中断向量。

5. 中断向量内的处理机状态位应当标明是管态还是目态 ? 为什么? 答:应当标明是管态。该状态由系统初试化程序设置,这样才能保证中断发生后进入操作系统规定的中断处理程序。

6. 中断和程序并发之间的关系是什么?答:中断是程序并发的必要条件。如果没有中断,操作系统不能获得系统控制权,无法按调度算法对处机进行重新分配,一个程序将一直运行到结束而不会被打断。

7. 说明“栈”和“堆”的差别.答:栈是一块按后进先出(FIFO)规则访问的存储区域,用来实现中断嵌套和子程序调用的参数和返回断点。而堆虽然是一块存储区域,但是对堆的访问是任意的,没有后进先出的要求,堆主要用来为动态变量分配存储空间。

8. 何为系统栈?何为用户栈?系统栈有何用途?用户栈有何用途? 答:系统栈是内存中操作系统空间的一个固定区域;用户栈是内存中用户空间的一个区域。系统栈的作用:(1)保存中断现场,对于嵌套中断,被中断程序的现场信息依次压入系统栈,中断返回时逆序弹出;(2)保存操作系统子程序间相互调用的参数、返回值、返回点、以及子程序的局部变量。用户栈的作用:用于保存用户进程的子程序间相互调用的参数、返回值、返回点、以及子程序的局部变量。

9. 用户堆栈段的长度为何无法确定 ? 答:用户堆栈段的长度主要取决于两个因素:(1)用户

进程(线程)中子程序(函数)之间的嵌套调用深度;(2)子程序参数和局部变量的数量及类型;(3)动态变量的使用。这些在进程(线程)运行前无法确定,由此导致用户堆栈段的长度无法预先准确确定。

10堆栈段的动态扩充为何可能导致进程空间的搬迁? 答:堆栈段的扩充需要在原来进程空间大小的基础上增添新的存储区域,而且通常要求与原来存储区域连续。由于原存放位置处可扩展的区域可能已经被其它进程占用,故可能需要将整个进程空间搬迁到另外一个区域,以实现地址空间扩展要求。

11. 何谓并行 ? 何谓并发? 在单处理机系统中,下述并行和并发现象哪些可能发生,哪些不会发生? (1) 进程与进程之间的并行; (2) 进程与进程之间的并发; (3) 处理机与设备之间的并行; (4) 处理机与通道之间的并行; (5) 通道与通道之间的并行; (6) 设备与设备之间的并行; 答:所谓并行是指同一时刻同时进行,进程并行需要多处理器的支持;所谓并发,是指在一段时间内,多个进程都在向前推进,而在同一时刻,可能只有一个进程在执行,多个进程轮流使用处理器。在单处理器传统中,可能发生的并行和并发现象如下: (2) 进程与进程之间的并发。例如,在Windows操作系统中,mp3播放进程和Word字处理进程可以并发执行,这样用户就可以边听音乐边写文章了。(3) 处理机与设备之间的并行。例如,当处理机进行科学运算时,打印机可以打印文档。 (4) 处理机与通道之间的并行。通道程序的执行可与处理机的操作并行。 (5) 通道与通道之间的并行。通常一个系统中有多个通道,这些通道可以并行地执行相应的通道程序。 (6) 设备与设备之间的并行。例如打印机打印文档时,磁带机在输入数据。

12. 何谓作业? 它包括哪几个部分? 各部分用途是什么?答:所谓作业是指用户要求计算机系统为其完成的计算任务的集合。一个作业通常包括程序、程序所处理的数据以及作业说明书。程序用来完成特定的功能,数据是程序处理的对象,作业说明书用来说明作业处理的步骤。13. 从透明性和资源共享两方面,说明网络操作系统与分布式操作系统之间的差别。答:从透明性上看,分布式操作系统优于网络操作系统。网络用户能够感觉到所访问的资源是在本地还是在远地;而在分布式系统中,用户感觉不到所访问的资源是否在本地,分布式操作系统掩盖了资源在地理位置上的差异。从资源共享上看 ,分布式操作系统比网络操作系统能共享更多的资源。在网络操作系统中,一个计算任务不能由一台主机任意迁移到另外一台主机上运行;而在分布式操作系统中,所有作业可以由一台主机任意迁移到另外一台主机上处理,即可实现处理机资源的共享,从而达到整个系统的负载平衡。

14. 为什么构成分布式系统的主机一般都是相同的或兼容的?答:这样更有利于进程的动态迁移。如果主机不兼容,则在一台主机上能运行的进程,因所用指令系统不同,在另一台主机上可能无法运行,导致进程难于在不同主机间迁移,使得分布式系统难于实现负载平衡。构成分布式系统的主机一般都是相同的或兼容的。

15. 为什么嵌入式操作系统通常采用微内核结构?答:嵌入式操作系统与一般操作系统相比具有比较明显的差别 : (1)嵌入式操作系统规模一般较小,因为一般硬件配置较低,而且对操作系统提供的功能要求也不高。(2)应用领域差别大,对于不同的应用领域其硬件环境和设备配置情况有明显差别。所以,嵌入式操作系统一般采用微内核 ( micro kernel )结构,包括如下基本功能: (1)处理机调度;(2)基本内存管理;(3)通讯机制;(4)电源管理。在这些基本成分之上可进行扩展,以适应不同应用目标。

第二章进程、线程与作业课后习题

1. 为何引入多道程序设计? 在多道程序系统中,内存中作业的道数是否越多越好? 请说明原因。答:引入多道程序设计技术是为了提高计算机系统资源的利用率。在多道程序系统中,内存中作业的道数并非越多越好。一个计算机系统中的内存、外设等资源是有限的,只能容纳适当数量的作业,当作业道数增加时,将导致对资源的竞争激烈,系统开销增大,从而导致作业的执行缓慢,系统效率下降。

2. 什么是进程? 进程具有那些主要特性?比较进程与程序之间相同点与不同点.答:进程是具有一定独立功能的程序关于一个数据集合的一次执行活动。特性:并发性、动态性、独立性、交往性、异步性和结构性。联系:程序是进程的组成部分,一个进程存在的目的就是执行其所对应的程序。区别:程序是静态的,而进程是动态的;进程是有生存期的,而程序没有;一个程序可对应多个进程,而一个进程只能对应一个程序。

3. 有人说,用户进程所执行的程序一定是用户自己编写的。这种说法对吗?如不对举例说明之。答:这种说法不对。例如, C编译程序以用户进程身份运行,但C编译程序并不是用户自己编写的。此外还有字处理程序等工具软件。

4. 什么是进程上下文?进程上下文包括那些成分?那些成分对目态程序是可见的?答:在UNIX System V中,将进程的物理实体与支持进程运行的物理环境合称为进程上下文(process context),进程上下文包括三个组成部分:·用户级上下文。是由用户进程的程序块、用户数

据块(含共享数据块)和用户堆栈组成的进程地址空间。·系统级上下文。包括进程控制块、内存管理信息、进程环境块,以及系统堆栈等组成的进程地址空间·寄存器上下文。由程序状态字寄存器、各类控制寄存器、地址寄存器、通用寄存器、用户堆栈指针等组成。其中用户级上下文及部分寄存器上下文对目态程序是可见得。

5. 进程一般具有哪三个主要状态?举例说明状态转换的原因。答:进程在其生存期内可能处于如下三种基本状态之一 : (1) 运行态( Run ): 进程占有处理机资源,正在运行。显然,在单处理机系统中任一时刻只能有一个进程处于此种状态; (2) 就绪态( Ready ): 进程本身具备运行条件,但由于处理机的个数少于可运行进程的个数,暂未投入运行。即相当于等待处理机资源; (3) 等待态( Wait ): 也称挂起态( Suspended )、封锁态( Blocked )、睡眠态( Sleep )。进程本身不具备运行条件,即使分给它处理机也不能运行。进程正等待某一个事件的发生,如等待某一资源被释放,等待与该进程相关的 I/O 传输的完成信号等。进程的三个基本状态之间是可以相互转换的。具体地说,当一个就绪进程获得处理机时,其状态由就绪变为运行 ; 当一个运行进程被剥夺处理机时,如用完系统分给它的时间片,或出现高优先级别的其它进程,其状态由运行变为就绪;当一个运行进程因某事件受阻时,如所申请资源被占用,启动 I/O 传输未完成,其状态由运行变为等待 ; 当所等待事件发生时,如得到申请资源, I/O 传输完成,其状态由等待变为就绪。

6.有几种类型进程队列?每类各应设置几个队列?答:有三种类型进程队列:就绪队列(整

个系统一个)、等待队列(每个等待事件一个)和运行队列(在单CPU系统中只有一个)

7. 线程控制块 TCB 中一般应包含那些内容?答:一般 TCB 中的内容较少,因为有关资源分

配等多数信息已经记录于所属进程的 PCB中.TCB中的主要信息包括:线程标识、线程状态、

调度参数、现场、链接指针,其中现场信息主要包括通用寄存器、指令计数器 PC以及用户栈

指针.对于操作系统支持的线程,TCB中还应包含系统栈指针。

8. 同一进程中的多个线程有那些成分是共用的,那些成分是私用的?答:共用的成分有:堆、

数据和程序代码;私用的成分有:线程控制块、寄存器和用户栈。

9. 比较用户级线程与系统级线程间在以下方面的差别和各自的优缺点。 (1) 创建速度;(2)

切换速度;(3)并行性;(4) TCB 的存储位置答:用户级线程由系统库支持.线程的创建和撤

销,以及线程状态的变化都由库函数控制并在目态完成,与线程相关的控制结构 TCB 保存在

目态空间并由运行系统维护。由于线程对操作系统不可见,系统调度仍以进程为单位,核心

栈的个数与进程个数相对应用户级别线程的优点在于: (1)线程不依赖于操作系统,可以采用

与问题相关的调度策略,灵活性好;(2)同一进程中的线程切换不需进入操作系统,因而实现

效率较高。缺点在于:(1)同一进程中的多个线程不能真正并行,即使在多处理机环境中;(2)

由于线程对操作系统不可见,调度在进程级别,某进程中的一个线程通过系统调用进入操作系

统受阻,该进程的其它线程也不能运行。核心级别线程通过系统调用由操作系统创建,线程

的控制结构 TCB 保存于操作系统空间,线程状态转换由操作系统完成,线程是 CPU 调度的基

本单位。另外由于系统调度以线程为单位,操作系统还需要为每个线程保持一个核心栈。核

心级线程的优点是并发性好,在多 CPU 环境中同一进程中的多个线程可以真正并行执行。核

心级别线程的缺点是线程控制和状态转换需要进入操作系统完成,系统开销比较大。 10.何谓

作业步?作业何时转为进程?答:作业步:作业中一个相对独立的处理步骤作业进入内存,根

据作业步的要求建立进程。11. 分析作业、进程、线程三者之间的关系.答:联系:一个作业

包含多个进程,一个进程包含多个线程;区别:作业是向计算机提交任务的任务实体,而进程

是执行实体,是资源分配的基本单位,线程是处理机调度的基本单位。12. 何谓系统开销? 试

举三个例子说明之运行操作系统程序对系统进行管理而花费的时间和空间,如:作业调度、

进程调度、进程切换等。

第三章中段与处理机调度课后习题

1. 试说明下述概念之间的联系与差别: (1) 系统调用命令(2) 访管指令(3) 广义指令答:访管指令由指令码和访管中断号两部分组成。即 : SVC n ───①其中 SVC(SuperVisor Call)为指令码,表明为访管指令; n 为访管中断号,其值是一整数,具体表示何种访问要求。中断发生时,硬件中断装置将访管中断号n 送入旧的程序状态字内的中断码字段,访管中断总控程序由系统堆栈中将其取出,并据此转入对应的服务程序。在实际使用时,用户程序与操作系统之间还需要相互传递参数和返回值。如此,用户使用访管指令的一般形式为 : 准备参数SVC n 取返回值───②根据具体访管要求约定,参数及返回值可以通过寄存器传递,也可以通过内存传递。对于后者,操作系统必须能够访问进程空间。通常将②称为系统调用命令,它除访管指令外,还有准备参数和取返回值。为了使用方便,在高级语言中一般将其写为与过程调用相类似的形式,即: 返回值=系统调用名称(参数1,参数2, …,参数m ); ───③当然,编译程序会将③翻译成形如②的形式。其中系统调用名称对应①,不同的系统调用名称对应不同的整数 n 。在有的书中,也将③称为代表②

的宏指令或广义指令。

2. 为什么说中断是进程切换的必要条件,但不是充分条件?答:发生进程切换时一定发生中断。系统由一个运行进程转去运行另外一个进程,前提条件是必须进入操作系统,即处于系统态,因为处于用户态运行的进程不可能将cpu的使用权直接交给另一个进程,而中断是从用户态转换为系统态的必要条件。即中断是进程切换的前提(必要)条件。但发生中断时未必发生进程切换。如果中断处理完后原进程不再具有继续运行的条件,则一定会发生进程切换;反之,如果中断处理完后原进程仍具有继续运行的条件,则可能会发生进程切换,也可能不发生进程切换,这与处理机调度策略有关。

3. 试分析中断与进程状态转换之间的关系。答:进程状态转换是由内核控制的,如果一个进程的状态发生了改变,则在新旧状态之间一定发生了处理机状态由目态到管态的转换,而中断是处理机状态由目态转换到管态的必要条件,所以中断也是进程状态转换的必要条件。

4. 中断发生时, 旧的PSW和PC为何需要压入系统栈?答:保存断点信息,以便中断结束后接着原来的程序断点处继续执行。通常来说中断处理程序的最后一条指令是中断返回指令,该指令从系统栈顶弹出断点信息。如果未将PSW和PC压入系统栈,则中断返回指令弹出的不是中断前的断点信息,而是不确定的信息,这将导致系统处于不确定的状态,严重的情况会使系统崩溃。

5. 何谓中断向量? 用户能否修改中断向量的值?答:当中断事件发生时,中断装置根据中断类别自动地将中断处理程序所对应的 PSW和PC送入程序状态字和指令计数器中,如此便转移到对应的中断处理程序。这个转移类似于向量转移,因而PSW和PC 被称为中断向量。用户不能修改中断向量的值,因为修改中断向量是特权指令,普通用户程序不能执行特权指令。另外,如果允许用户修改中断向量的值,那么,用户就可以将中断向量与一段病毒程序联系起来,使中断发生时便执行病毒程序,从而破坏计算机系统。

6.中断向量的存储位置是否可由程序改变?为什么? 中断向量的值是如何确定的? 答:中断向量的存储位置是由硬件确定的,不能由程序改变。中断发生后,中断装置按照中断类型到内存指定位置取出中断向量。例如,在IBM PC系统中,地址000~03FF是中断向量空间。操作系统的设计者根据各中断事件处理程序的存储位置及运行环境确定对应中断向量的值,系统启动时由初始化程序将该值填入指定位置。

7. 有人说,中断发生后硬件中断装置保证处理机进入管态,这种说法准确吗? 说明理由。答:这种说法不准确。中断发生后,硬件中断装置负责引出中断处理程序,中断处理程序是否运行于管态取决于PSW中的处理机状态位,该位的值是操作系统初始化时设置的,只有在初试化程序正确设置该状态位的前提下,才能保证中断后系统进入管态。

8.为什么在中断处理过程中通常允许高优先级别的中断事件中途插入, 而不响应低优先级别的中断事

件?答:(1)从逻辑上来说,高优先级别中断源所对应的事件比低优先级别中断源所对应的中断事件急迫;

(2)由于硬件中断类型是有限的,这样做实际上也就限制了中断嵌套的深度。防止中断层数无限增长,甚至系统栈溢出。

9. 为什么说“关中断”会影响系统的并发性? 答:考虑单处理机系统。在单处理机系统中,并发是通过将处理机轮流分配给多个进程而实现的,这个分配是由操作系统中处理机调度程序完成的。中断是进程切换的必要条件,如果关了中断,则操作系统无法获得处理机的控制权,也就无法使多个进程分时共享处理机。在关中断期间,一个进程独占处理机。所以说“关中断”会影响系统的并发性。

10. 假如关中断后操作系统进入了死循环, 会产生什么后果?答:因为操作系统进入了死循环,并且处于关中断,即不能响应中断,也就不能从死循环中退出。系统不响应任何外部干预事件,系统表现为“死机”。

11. 为什么不允许目态程序执行关中断指令及中断屏蔽指令?答:开关中断指令和中断屏蔽指令属于特权指令,一般用户无权访问。如果允许用户使用,用户关中断后可能影响系统对内部或外部事件的响应,也会使操作系统无法获得系统控制权。

12. 如果没有中断, 是否能够实现多道程序设计? 为什么?答:不能。因为一个程序一旦被调度执行,将一直执行下去,中间不可能被打断,不可能达到多个进程交替执行的并发目的。

13. 下列中断源哪些通常是可以屏蔽的,哪些通常是不可屏蔽的? (1) I/O 中断;(2) 访管中断;

(3) 时钟中断;(4) 掉电中断答: (1) I/O中断可以屏蔽;(2) 访管中断不可以屏蔽;(3) 时钟中断可以屏蔽;(4) 掉电中断不可以屏蔽。

14. 下列中断事件哪些可由用户自行处理? 哪些只能由操作系统中断服务程序统一处理? 为什么?

(1) 溢出;(2) 地址越界;(3) 除零;(4) 非法指令;(5) 掉电答:一般来说,只影响应用程序自身的中断,可以由用户自行处理,包括:(1) 溢出;(3) 除零。可能影响其它用户或操作系统的中断只能由操作系统中断服务程序统一处理,包括:(2) 地址越界;(4) 非法指令;(5) 掉电。

15. 如果中断由用户程序自行处理,为何需要将被中断程序的断点由系统堆栈弹出并压入用户堆栈?答:中断发生时,被中断程序的现场信息已被压入系统堆栈中。而中断续元运行于目态,它执行完毕后将由用户堆栈区中恢复现场。为此,操作系统在转到中断续元之前还应当将系统堆栈中的现场信息弹出并压入用户堆栈中,否则中断续元执行完毕后将无法恢复现场返回断点。

16. 对于下面中断与进程状态转换之间的关系各举两个例子说明之: (1) 一定会引起进程状态转换的中断事件;(2) 可能引起进程状态转换的中断事件.答:定会引起进程状态转换的中断事件:当前

运行进程终止、应用程序启动I/O传输并等待I/O数据、运行程序申请当前被占用的某一资源。可能引起进程状态转换的中断事件:时钟中断事件可能引起进程状态转换,例如对于时间片轮转进程调度算法,若时钟中断发生后,当前进程的时间片已用完,则将发生进程切换;否则不发生进程切换。

17. 若在 T1 时刻进程 P1 运行,T2 时刻进程P2 运行,且P1 ≠P2 ,则在时刻T1 和时刻T2 期间之内一定发生过中断。这种说法对吗? 为什么? 答:这种说法对。如果在时刻 T1进程P1在运行,在时刻T2进程P2在运行,且P1≠P2,则说在时刻T1和时刻T2之间发生了进程切换。这说明在时刻T1和时刻T2之间执行了处理机调度程序,而处理机调度程序是操作系统低层中的一个模块,在系统运行的过程中,除非显式地调用到该模块,否则系统不会由运行一个进程转去运行另外一个进程,就是说不会发生进程切换。只有进入操作系统,即处于系统态,才有可能调用到处理机调度,因为处于用户态运行的用户程序不可能直接调用操作系统中的任何模块。中断是系统由用户态转换为系统态的必要条件。据此,假如在时刻T1与时刻T2之间发生了进程切换,则在时刻T1 与时刻T2 之间一定发生过中断。

18. 进程切换时,上升进程的PSW和PC为何必须由一条指令同时恢复? 答:中断向量中程序状态字PSW与指令计数器PC的内容必须由一条指令同时恢复,这样才能保证系统状态由管态转到目态的同时,控制转到上升进程的断点处继续执行。如果不同时恢复,则只能(1)先恢复PSW再恢复PC,在恢复PSW后已经转到目态,操作系统恢复PC的使命无法完成;(2)先恢复PC再恢复PSW,PC改变后转到操作系统另外区域(因为PSW仍为系统状态),PSW无法恢复。

19. 某系统采用可抢占处理机的静态优先数调度算法,请问何时会发生抢占处理机的现象?答:当一个新创建的进程或一个被唤醒进程的优先数比正在运行进程的优先数高时,可能发生抢占处理机现象。

20. 在实时系统中, 采用不可抢占处理机的优先数调度算法是否适宜? 为什么?答:不适宜。一旦一个低优先数、需要大量CPU时间的进程占用处理机,就会一直运行,直到运行结束,或者直到因某事件而阻塞。在此之前,即使高优先数的紧急任务到达,也得不到处理,因而可能延误对重要事件的响应和处理。

21. 在分时系统中,进程调度是否只能采用时间片轮转算法? 为什么?答:分时系统的特点是要求响应速度及时,除 RR算法之外,还可以采用可剥夺CPU的动态优先数调度算法。如经典UNIX的处理机调度算法,由于负反馈性质,算法也可以保证响应速度。

22. 有人说, 在采用等长时间片轮转处理机调度算法的分时操作系统中, 各终端用户所占有处理机的时间总量是相同的. 这种说法对吗? 为什么?答:这种说法不对。因为处理机是分配给进程(线程)的,而不同终端用户可能有不同数量的进程,一个拥有较多数量进程的终端显然比拥有较少数量进程的终端获得CPU的时间要多。

23. 对于下述处理机调度算法分别画出进程状态转换图。(1) 时间片轮转算法; (2) 可抢占处理机的优先数调度算法; (3) 不可抢占处理机的优先数调度算法。答:

(1) 时间片轮转算法(2) 可抢占处理机的优先数调度算法

;

(3) 不可抢占处理机的优先数调度算法

24. 举出两个例子说明操作系统访问进程空间的必要性.答:例(1):进程执行输出操作时,通过系统调用进入系统,由操作系统将待输出的数据由进程空间取出送给指定的外部设备,为此操作系统必须访问用户进程空间。例(2):当发生可由用户自己处理的中断事件时,操作系统在转到中断续元之前应当将系统堆栈中的现场信息弹出并压入用户堆栈中,为此操作系统也必须访问进程空间。25.根据进程和线程的组成说明进程调度和线程调度各需要完成哪些工作。答:进程调度: (1)地址映射寄存器;(2)用户栈指针;(3)通用寄存器;(4)PSW与PC。线程调度: (1)用户栈指针;(2)通用寄存器;(3)PC。26. 系统资源利用率与系统效率是否一定成正比? 如不是, 举例说明之.答:不是,如程序的并发执行时,并发要有个度,并发执行的程序过多,虽然系统资源利用率提高,但是,由于竞争过于激烈,切换过于频繁,系统开销大,反而会使系统效率降低。27. 设有周期性实时任务集如下表所示,用 EDF 算法和 RMS 算法是否可以调度?画出相应的Gantt 图。

任务发生周期Ti处理时间Ci

A3010

B4015

C505

答:由于,因而采用EDF算法一定可以调度,其Gantt图为:

A1B1C1A2B2C2A3B3A4C3

10155101551015105 0102530405560708095105110120

由于,因而采用RMS算法不可调度。

第四章互斥、同步与通讯课后习题答案

1. 何谓与时间有关的错误 ? 举例说明之。答:并发进程的执行实际上是进程活动的某种交叉,某些交叉次序可能得到错误结果。由于具体交叉的形成与进程的推进速度有关,而速度是时间的函数,因而将这种错误称为与时间有关的错误。例如,两个并发进程的程序如下:

int n=0; main(){ 创建进程 A;创建进程 B;};

A(){ while(1){ n++; } }; B(){ while(1){ printf(n); n=0; } };

假设进程 A被部署在公园入口的终端上,用来记录进入公园的人数,进程B被部署在公园的控制中心,用来输出一段时间内进入公园的总人数。进程A和进程B共享全局变量n。如果在进程B执行完打印语句后被进程A打断,进程A执行了若干次变量自增语句,之后进程B接着执行清0语句,那么进程A对n的累加丢失了,相当于进程B被打断的这段时间内进入公园的人没有被记录下来。发生与时间有关的错误。

2. 有人说, 假设两个进程之间没有共享内存, 则二者之间没有公共变量, 这种说法准确吗?说明原因.答:如果只从用户空间考虑,这种说法是正确的。但从操作系统的角度来说并不准确。两个没有公共内存的用户进程可能同时(宏观)进入操作系统,并访问操作系统空间中的公共变量。

3. 何谓忙式等待 ? 是否还有其它方式的等待? 比较它们之间的联系和差别。答:不进入等待状态的等待称为忙式等待。另一种等待方式是阻塞式等待,进程得不到共享资源时将进入阻塞状态,让出 CPU 给其他进程使用。忙等待和阻塞式等待的相同之处在于进程都不具备继续向前推进的条件,不同之处在于处于忙等待的进程不主动放弃CPU ,尽管CPU 可能被剥夺,因而是低效的;而处于阻塞状态的

进程主动放弃CPU ,因而是高效的。

4. 下列进程互斥方法哪些存在忙式等待问题? (1) 软件: 面包店算法(2) 硬件: TS指令(3) 关

中断指令答:(1)、(2)存在忙等待问题。

5. 为何开关中断进程互斥方法仅在单 CPU 系统中是有效的?答:关中断方法不适用于多 CPU 系统,因为关中断只能保证CPU 不由一个进程切换到另外一个进程,从而防止多个进程并发地进入公共临界区域。但即使关中断后,不同进程仍可以在不同CPU 上并行执行关于同一组共享变量的临界区代码。

6. 在多处理机系统中,软件互斥方法是否有效?为什么?答:依然有效。多处理机并行与单处理并发之间的差别在于程序交叉的粒度,单处理机机环境中进程交叉发生在指令之间,多处理机环境中进程交叉发生在指令周期之间。由于纯软件互斥算法并不依赖特殊的硬件指令(如test_and_set),指令之间的

交叉与指令周期之间的交叉结果相同。

7. 试分析临界区域的大小与系统并发性之间的关系。答:关于同一组变量的临界区域是不能并发执行

的代码,临界区越大,并发性越差,因而编写并发程序应尽量减小临界区域的大小。

8. 设CR1是关于一组共享变量SV1的临界区域, CR2是关于另外一组共享变量SV2的临界区域, 当进程P1进入CR1时, 进程P2是否可以进入CR2? 为什么?答:进程互斥是指多个进程不能同时进入关于同一组共享变量的临界区,否则可能发生于时间有关的错误。SV1与SV2不是同一组共享变量,所以当进程P1

进入CR1时, 进程P2可以进入CR2。

9. Lamport 面包店互斥算法是否会出现饿死情况 ? 答:不会,该算法是公平的。假定系统中共有n 个进程,每个想要进入临界区域的进程 (线程)在最坏的情况下需要等待其它n -1个进程进入并离开临界区域之后即可获得进入临界区域的机会,因而存在(忙式)等待的上界。

10. 试用信号灯和PV操作实现临界区语句:region <共享变量> do <语句>答:semaphore

mutex=1; …p(mutex);<语句> v(mutex);

…11. 由 V 操作唤醒的进程是否一定能够直接进入运行状态? 举例说明之。答:否。一般来说,唤醒是将进程状态由等待状态变成就绪状态,而就绪进程何时获得处理机则是由系统的处理机调度策略确定的。如果采用抢占式优先级调度算法,并且被唤醒的进程是当前系统中优先级最高的进程,那么该进程将被调度执行,该进程的状态变成运行态。如果该进程不是系统中优先级最高的进程或系统采用其它调度算法,那么该进程不会被调度执行,其状态将维持在就绪态。

12. 设S1和S2为两个信号灯变量, 下列八组P、V操作哪些可以同时进行? 哪些不能同时进行? 为什么?(1) P(S1), P(S2) (2) P(S1), V(S2)(3) V(S1), P(S2) (4) V(S1), V(S2) (5) P(S1), P(S1) (6) P(S2), V(S2)(7) V(S1), P(S1) (8) V(S2), V(S2)答:(1),(2),(3),(4)可以同时进行;(5),(6),(7),(8)不可以同时进行。因为如果将信号灯变量看作共享变量,则P、V操作作为其临界区,为了不发生于时间有关的错误,须保证多个进程不能对同一个信号灯变量同时执行P、V操作。

13. 对于生产者—消费者问题,假设缓冲区是无界的,试用信号灯与PV 操作给出解法。答:由于是

无界缓冲区,所以生产者不会因得不到缓冲区而被阻塞。

semaphore mutex_in=1; semaphore mutex_out=1;

semaphore product=0; int in=0 , out=0;

生产者:while(1){ 生产一个物品;P(mutex_in); buffer[in]=物品; in++; v(mutex_in); V(product); } 消费者: while(1){ P(product); P(mutex_out); 物品=buffer[out]; out++; V(mutex_out); }

14. 设有一个可以装A、B两种物品的仓库, 其容量无限大, 但要求仓库中A、B两种物品的数量满足下述不等式:-M≤A

物品数量-B物品数量≤N其中M和N为正整数. 试用信号灯和PV操作描述A、B两种物品的入库过程.解:若只放入A,而不放入B,则A产品最多可放入N次便被阻塞;若只放入B,而不放入A,则B产品最多可放入M次便被

阻塞;每放入一次A,放入产品B的机会也多一次;同理,每放入一次B,放入产品A的机会也多一次.Semaphore mutex=1,sa=N,sb=M;产品A进程: 产品B进程:while(1){ while(1){p(sa); p(sb);p(mutex); p(mutex);A产品入库;B产品入库;V(mutex); V(mutex);V(sb); V(sa);} }

15. 试用信号灯与 PV 操作实现司机与售票员之间的同步问题。设公共汽车上有一个司机和一个售票员,其活动如下图所示。为了安全起见,显然要求 : (1)关车门后方能启动车辆; (2)到站停车后方能开车门。亦即“启动车辆”这一活动应当在“关车门”这一活动之后,“开车门”这一活动应当在“到站停车”这

一活动之后。semaphore s1=0,s2=0; 司机:售票员:while(1){ while(1){p(s1); 关车门; 启动车辆;

v(s1);正常行驶;售票;到站停车;p(s2);v(s2); 开车门;} }

16. 设有A、B、C三组进程, 它们互斥地使用某一独占型资源R, 使用前申请, 使用后释放. 资源分配原则如下:(1) 当只有一组申请进程时, 该组申请进程依次获得R; (2) 当有两组申请进程时, 各组申请进程交替获得R, 组内申请进程交替获得R; (3) 当有三组申请进程时, 各组申请进程轮流获得R, 组内申请进程交替获得R.试用信号灯和PV操作分别给出各组进程的申请活动程序段和释放活动程序段.int free=1;//设备状态标志semaphore mutex=1;semaphore qa=qb=qc=0; //各组等待队列int counta=countb=countc=0;//等待队列长度

A组申请:P(mutex);if(free==1){free=0;V(mutex);}else{counta+ +;V(mutex);P(qa);}A组释放:if(countb>0){countb- -;V(qb);}else{if(countc>0){countc-

-;V(qc);}else{if(counta>0){counta-

-V(qa);}else{ free=1;}}}

A组进程活动可以给出B组和C组进程活动。

17. 设自行车生产线上有一只箱子,其中有 N 个位置( N ≥3),每个位置可存放一个车架或一个车轮;

又设有三个工人,其活动分别为:

工人 1活动:do { 加工一个车架 ; 车架放入箱中 ; } while (1) 工人 2活动:do { 加工一个车轮 ;

车轮放入箱中 ; } while (1)

工人 3活动:do { 箱中取一车架 ;

箱中取二车轮 ; 组装为一台车 ; }

while (1)

试分别用信号灯与 PV 操作、管程、会合实现三个工人的合作,要求解中不含死锁。一、用信号灯与 PV 操作实现三个工人的合作首先不考虑死锁问题,工人 1与工人3、工人2与工人3构成生产者与消费者关系,这两对生产/消费关系通过共同的缓冲区相联系。从资源的角度来看,箱字中的空位置相当于工人1和工人2的资源,而车架和车轮相当于工人3的资源。定义三个信号灯如下:semaphore empty=N;

semaphore wheel=0; semaphore frame=0; 三位工人的活动分别为:

工人 1活动:do { 加工一个车架 ; P(empty); 车架放入箱中; V(frame); } while (1) 工人 2活动:do { 加工一个车轮 ;

P(empty); 车轮放入箱中;

V(wheel); } while (1)

工人 3活动:do { P(frame); 箱中取

一车架; V(empty); P(wheel);

P(wheel); 箱中取二车轮;

V(empty); V(empty); 组装为一台

车 ; } while (1)

分析上述解法易见,当工人 1推进速度较快时,箱中空位置可能完全被车架占满或只留有一个存放车轮的位置,而当此时工人3同时取2个车轮时将无法得到,而工人2又无法将新加工的车轮放入箱中;当工人2推进速度较快时,箱中空位置可能完全被车轮占满,而当此时工人3同取车架时将无法得到,而工人1又无法将新加工的车架放入箱中。上述两种情况都意味着死锁。为防止死锁的发生,箱中车架的数量不可超过 N-2,车轮的数量不可超过N-1,这些限制可以用两个信号灯来表达。semaphore s1=N-2;

semaphore s2=N-1; 如此,可以给出不含死锁的完整解法如下:

工人 1活动:do { 加工一个车架 ; P(s1); P(empty); 车架放入箱中 ; V(frame); } while (1) 工人 2活动:do { 加工一个车轮 ;

P(s2); P(empty); 车轮放入箱中 ;

V(wheel); } while (1)

工人 3活动:do { P(frame); 箱中取

一车架; V(empty); V(s1);

P(wheel); P(wheel); 箱中取二车

轮; V(empty); V(empty); V(s2);

V(s2); 组装为一台车 ; } while (1)

详细描述还应考虑对箱子单元的描述以及访问互斥问题。建议车架放在箱子的一端,车轮放在箱子的另一端,车架与车轮都采用后进先出的管理方式。Semaphore s1=N-2,s2=N-1,mutex=1;int in1=0,

in2=N-1;int buf[N];

工人 1活动:do { 加工一个车架 ; P(s1);

P(empty);P(mutex);Buf[in1]=车架;in1=in1+1; V(mutex); V(frame); } while (1) 工人 2活动:do { 加工一个车轮 ;

P(s2); P(empty);

P(mutex);Buf[in2]=车轮;

in2=in2-1; V(mutex);V(wheel); }

while (1)

工人3活动:do { P(frame);

P(mutex);Temp1=Buf[in1-1];

in1=in1-1; V(mutex); V(empty);

V(s1); P(wheel); P(wheel);

P(mutex);Temp2=Buf[in2+1];in2=in2

+1;Temp3=Buf[in2+1];In2=in2+1;V(m

utex);V(empty); V(empty); V(s2);

V(s2); 组装为一台车 ; } while (1)

18. 一座小桥(最多只能承重两个人)横跨南北两岸,任意时刻同一方向只允许一人过桥,南侧桥段和北侧桥段较窄只能通过一人,桥中央一处宽敞,允许两个人通过或歇息.试用信号灯和PV操作写出南、北两岸过桥的同步算法.

semaphore load=2;semaphore north=1;semaphore

south=1;

tosouth(){P(load);P(north);过北段桥;到桥中间;V(north);P(south);过南段桥;到达南岸V(south);V(load);}tonorth(){P(load);P(south);过南段桥;到桥中间V(south);P(north);过北段桥;到达北岸V(north);V(load);}

19. 某寺庙,有小和尚、老和尚若干.庙内有一水缸,由小和尚提水入缸,供老和尚饮用.水缸可容纳 30 桶水,每次入水、取水仅为1桶,不可同时进行。水取自同一井中,水井径窄,每次只能容纳一个水桶取水。设水桶个数为5个,试用信号灯和PV 操作给出老和尚和小和尚的活动。

semaphore empty=30; // 表示缸中目前还能装多少桶水,初始时

能装 30 桶水semaphore full=0; // 表示缸中有多少桶水,初

始时缸中没有水 semaphore buckets=5; // 表示有多少只空桶可

用,初始时有 5 只桶可用semaphore mutex_well=1; // 用于实

现对井的互斥操作 semaphore mutex_bigjar=1; // 用于实现对

缸的互斥操作 semaphore mutex_bucket=1; //用于实现对桶的互

斥操作

young_monk() { while(1){ P(empty); P(buckets);P(mutex_bucket); 取一个桶; V(mutex_bucket); go to the well; P(mutex_well); get water; V(mutex_well); go to the temple; P(mutex_bigjar); pure the water into the big old_monk() { while(){ P(full); P(buckets); P(mutex_bucket); get a bucket; V(mutex_bucket); P(mutex_bigjar); get water; V(mutex_bigjar); V(buckets); V(empty); } }

jar; V(mutex_bigjar); V(buckets); V(full); } }

20. 设系统中有5台类型相同的打印机,依次编号为1~5。又设系统中有n个使用打印机的进程,使用前申请,使用后释放。每个进程有一个进程标识,用于区别不同的进程。每个进程还有一个优先数,不同进程的优先数各异。当有多个进程同时申请时,按照进程优先数由高到低的次序实施分配。试用信号灯和PV操作实现对于打印机资源的管理,即要求编写如下函数和过程:(1) 函数 require(pid,pri): 申请一台打印机。参数pid为进程标识,其值为1到n的整数; pri为进程优先数,其值为正整数; 函数返回值为所申请到打印机的编号,其值为1到5的整数;(2) 过程 return(prnt): 释放一台打印机。参数prnt为所释放打印机的编号,其值为1到5的整数。

解:#define N 5Int flag[N+1];//flag[0]表示可用打印机数,//flag表示第i号打印机的状态(1<=i<=N),0表示占用,1表示空闲PCB *queue=NULL;//进程阻塞队列semaphore mutex_flag=1;//用于对flag数组的互斥操作semaphore mutex_queue=1;//用于对阻塞队列的互斥操作

int require(int pid,int priority){P(mutex_flag);if(flag[0]>0){flag[0]--;fo r(int i=1;i

i;}else{V(mutex_flag);p(mutex_queue);将进程pid按其优先数插入到等待队列queue中;V(mutex_queue);}} return(int

print){P(mutex_flag);if(queue==NULL){flag[0]++;fla g[print]=1;V(mutex_flag);}else{V(mutex_flag);p(mut ex_queue);将print分配给queue队首进程;queue下移;V(mutex_queue);}}

26. 关于读者/写者问题,有人给出如下改进解法:semaphore r_w_w, mutex, s; (初值均为1)int count; (初值为0)

读者活动:P(s);P(mutex);count++;if (count=

=1)P(r_w_w);V(mutex);V(s);{读操

作}P(mutex);count--;If (count=

=0)V(r_w_w);V(mutex);

写者活动:P(s);P(r_w_w);{写操作}V(r_w_w);V(s);

分析上述改进算法的调度效果。答:由于s以及读者和写者对s的操作,读者和写者都不会无限等待,因而算法不会出现饿死现象,是一个公平的解法。

第五章死锁与饥饿课后习题答案

1.下面关于死锁问题的叙述哪些是正确的, 哪些是错误的, 说明原因.(1) 参与死锁的所有进程都占有资源; (2) 参与死锁的所有进程中至少有两个进程占有资源; (3) 死锁只发生在无关进程之间;(4) 死锁可发生在任意进程之间.答:说法(1)是错误的,应该是参与死锁的所有进程都等待资源。说法(2)正确。参与死锁的进程至少有两个,设为p1,p2,p1占有资源r1而等待资源r2,p2占有资源r2而等待资源r1。说法(3)错误。死锁也可能发生在相关进程之间。说法(4)正确,死锁既可能发生在相关进程之间,也可能发生在无关进程之间。即死锁可发生在任意进程之间。

2.试证明当每个资源类中仅有一个资源实例时,资源分配图中的环路是死锁的充要条件。证明:先证明充分条件:用反证法,假设每个资源类中仅有一个资源实例时,资源分配图的环路是可约简的,那么说明环路外至少有一个非孤立且没有请求边的进程节点pk占有一个资源类rk中的一个实例,而rk中的另

外一个实例被环路中某个进程占有。说明rk 中有两个以上的资源实例,与前提矛盾。所以说,每个资源类中仅有一个资源实例时,资源分配图的环路是不可约简的,根据死锁定理,得出结论每个资源类中仅有一个资源实例时,资源分配图若存在环路就产生死锁。 再证明必要条件:若死锁产生,则存在一个循环等待进程序列,进程p1正等待资源类r k1中唯一的一个实例,而r k1又被进程p2所占用;进程p2正等待资源类r k2中唯一的一个实例,而r k2又被进程p3所占用;……; 进程pn 正等待资源类r kn

中唯一的一个实例,而r kn 又被进程p1所占用。能看出,画出的资源分配图存在环路。

3. 什么叫饥饿?什么叫饿死?什么叫活锁?举例说明之.答:在一个动态系统中,资源请求与释放是经常性发生的进程行为.对于每类系统资源,操作系统需要确定一个分配策略,当多个进程同时申请某类资源时,由分配策略确定资源分配给进程的次序。 资源分配策略可能是公平的(fair),能保证请求者在有限的时间内获得所需资源;资源分配策略也可能是不公平的(unfair),即不能保证等待时间上界的存在。 在后一种情况下,即使系统没有发生死锁,某些进程也可能会长时间等待.当等待时间给进程推进和响应带来明显影响时,称发生了进程饥饿(starvation),当饥饿到一定程度的进程所赋予的任务即使完成也不再具有实际意义时称该进程被饿死(starve to death)。在忙式等待条件下发生的饥饿,称为活锁.考虑一台打印机分配的例子,当有多个进程需要打印文件时,系统按照短文件优先的策略排序,该策略具有平均等待时间短的优点,似乎非常合理,但当短文件打印任务源源不断时,长文件的打印任

务将被无限期地推迟,导致饥饿以至饿死。

4. 死锁与饿死之间有何相同点和不同点?答:饿死与死锁有一定联系:二者都是由于竞争资源而引起的,但又有明显差别,主要表现在如下几个方面:(1) 从进程状态考虑,死锁进程都处于等待状态,忙式等待(处于运行或就绪状态)的进程并非处于等待状态,但却可能被饿死;(2) 死锁进程等待永远不会被释放的资源,饿死进程等待会被释放但却不会分配给自己的资源,表现为等待时限没有上界(排队等待或忙式等待);(3) 死锁一定发生了循环等待,而饿死则不然。这也表明通过资源分配图可以检测死锁存在与否,但却不能检测是否有进程饿死;(4) 死锁一定涉及多个进程,而饥饿或被饿死的进程可能只有一个。饥饿和饿死与资源分配策略(policy)有关,因而防止饥饿与饿死可从公平性考虑,确保所有进程

不被忽视,如FCFS 分配算法。

5. 何谓银行家算法的保守性? 举例说明之.答:银行家算法的保守性是指银行家算法只给出了进程需要资源的最大量,而所需资源的具体申请和释放顺序仍是未知的,因而银行家只能往最坏处设想.例如:

书中举例p119页。例5.5。

6. 能否给出避免死锁的充要性算法? 为什么?答:目前关于避免死锁的算法,如银行家算法是充分性算法,即确保系统时刻处于安全状态,这是在系统已知每个进程所需资源最大量的条件下可以给出的最好结果。如果系统不仅知道每个进程所需资源的最大量,而且知道进程有关资源的活动序列,在这个更强的条件下,则可以给出避免死锁的充要性算法(读者可以证明),但其复杂度是很高(NP 完全)的。而

且由于程序中分支和循环的存在,事先给出进程有关资源的命令序列一般是不可能的。

7. 设有一个T型路口, 其中A、B、C、D处各可容纳一辆车,车行方向如下图所示,试找出死锁并用有序分配法消除之. 要求资源编号合理.解:(1)E方向两台车分别位于A和B;S方向一台车位于C;W方向一台车位于D。(2)S方向两台车分别位于B和C;E方向一台车位于A;W方向一台车位于D。设位置资源C、B、A、D的编号从低到高依次为1、2、3、4,管理四个位置的信号量分别为s1,s2,s3,s4,信号量的

初值均为1。车辆活动如下:

semaphore s1=1,s2=1,s3=1,s4=1;

W :直行 P(s1); // 按序申请 P(s4); 驶入D; 驶入C; V(s4); 驶出C; V(s1); E :左转 P(s2); 驶入 B; P(s3) ;驶

入A; V(S2) P(s4) ;驶入D;

V(s3) ;驶出 D; V(s4);

S :左转 P(s1); 驶入 C; P(s2) ;驶

入B; V(S1) P(s3) ;驶入A;

V(s2) ;驶出 A; V(s3);

8. 设系统中仅有一个资源类, 其中共有M个资源实例, 使用此类资源的进程个数共有N个, 它们所需资

源最大量总和为∑, 试证明发生死锁的必要条件是∑3M+N.答:证明:假定发生死锁,那么Alloc(1)+Alloc(2)+…+Alloc(N)=M,(Alloc(i)表示第i进程已分配的资源量)。Need(1)+Need(2)+…Need(N) 3N。(Need(i)表示第i进程还需要的资源量)所以,发生死锁时,所有进程所需资源的总量3∑M+N。

9. 在银行家算法中,若出现如下资源分配情况:Allocation Need Available A B C D A B C D A B C D P0: 0 0 3 2 0 0 1 2 1

6 2 3P1: 1 0 0 0 1

7 5 0P2: 1 3 5 4 2 3 5 6P3: 0 3 3 2 0 6

5 2P4: 0 0 1 4 0

6 5 6试问:(1)当前状态是否安全?(2)如果进程P2提出安全请求Request[2]=(1,2,2,2),系统能否将资源分配给它?说明原因.解:(1)当前状态是安全状态。运行安全

性检查算法如下:1)Work = Available;Finish = false;2)寻找满足如下条件的i: Finish[i]==false并且Need[i]≤Work[i];如果不存在,则转步骤4);3)Work = Work + Allocation[i];Finish[i] = true;转步骤2)4)如果对于所有i,Finish[i] = true,则系统处

于安全状态,否则处于不安全状态。令Work = Available=(1, 6, 2, 3)运行安全性检测算法,Finish[0]=false并且Need[0]=(0 0 1 2)

Finish[2] = true;可以找到一个安全进程序列

0 ,p

3

,p

4

,p

1

,p

2

>,它使Finish=true,对于所有0

≤i≤4,因而可以断言系统当前处于安全状态.(2)运行银行家算法,由于Request[2]=(1, 2, 2, 2)£Need[2]=(2, 3, 5, 6),因而请求合法。进一步,Request[2]=(1, 2, 2, 2)£Available=(1, 6, 2, 3),故该请求是可以满足的。假设将资源分配给p2,则系统状态变为:Allocation

Need Available A B C D A B C D A B C D P0: 0 0 3 2 0 0 1 2 0 4 0 1P1: 1 0 0 0 1 7 5 0P2: 2 5 7 6 1 1 3 4P3: 0 3 3 2 0 6 5 2P4: 0 0 1 4 0 6 5 6运行安全性检测算法,Work=Available=(0, 4, 0, 1),Finish=false,此时所有Need£Work均不成立,结果Finish[i[均为false,不存在安全进程序列,系统处于不安全状态。系统将取消资源分配并恢复原来状态,进程p2等待。

10.某系统采用死锁检测手段发现死锁,设系统中资源类集合为{A,B,C},资源类A中共有8个实例,资源类B中共有6个实例,资源类C中共有5个实例.又设系统中进程集合为{p1,p2,p3,p4,p5,p6}, 某时刻系统状态如下:Allocation Request Available A B C A B C A B C p1: 1 0 0 0 0 0 2 2 1p2: 3 2 1 0 0 0 p3: 0 1 2 2 0 2p4: 0 0 0 0 0 0p5: 2 1 0 0 3 1 p6: 0 0 1 0 0 0(1) 在上述状态下系统依次接受如下请求:Request[1]=(1,0,0);Request[2]=(2,1,0);Request[4]=(0,0,2).给出系统状态变化情况,并说明没有死锁.答:如果系统只是接受请求,但是没有分配资源给进程,那么系统状态变为:Allocation Request Available A B

C A B C A B C p1: 1 0 0 1 0 0 2 2 1p2: 3 2 1 2 1 0p3: 0

1 2 2 0 2p4: 0 0 0 0 0 2p5: 2 1 0 0 3 1p6: 0 0 1 0 0 0在该状态下运行死锁检测算法,可以找到一个进程序列,它使Finish=true,对于所有1≤i≤6,因而可以断言系统当前没有进入死锁状态。(2) 在由(1)所确定的状态下系统接收如下请求:Request[1]=(0,3,1),说明此时已发生死锁,并找出参与死锁的进程.答:设在(1)的状态下系统接收如下请求:Request[1]=(0,3,1),则系统状态变为:Allocation Request Available A B C A B C A B C p1: 2 0 0 0 3 1 1 2 1p2: 3 2 1 2 1 0p3: 0 1 2 2 0 2p4: 0 0 0 0 0 2p5: 2 1 0 0 3 1p6: 0 0 1 0 0 0在该状态下运行死锁检测算法,找不到一个进程序列使Finish=true,对于所有1≤i≤6,因为存在i∈{1,2,3,5},使Finish=false,因而可以断言系统已经进入死锁状态,进程p1,p2,p3,p5卷入死锁.

11. 设有7个简单资源: A、B、C、D、E、F、G。其申请命令分别为a、b、c、d、e、f、g; 释放命令分别为a-、b-、c-、d-、d-、f-、g-; 又设系统中有P1、P2、P3三个进程,其活动分别为:P1活动: a b a- b- e f g e- f- g- P2活动: b c b- c- d a d- a-P3活动: c d c-d- e g f e- f- g-试分析当P1、P2、P3并发执行时,是否有发生死锁的可能性,并说明原因。解:不会有发生死锁的可能性。在本题中,进程p1和p2都使用的资源集合是{a,b},由于进程p2在申请a之前已经释放了b,不存在占有b并且申请a的情况,所以进程p1和p2之间不满足死锁的四个必要条件,不会产生死锁;进程p1和p3都使用的资源集合是{e,f,g},进程p1和p3都是先申请资源e,这两个进程同时申请资源,那么只能有一个进程先获得e,另一个进程将因为得不到e而阻塞,获得e的进程将进一步顺利获得资源f和g,从而运行结束,释放资源e,f和g,唤醒另一个进程运行。可见,进程p1和p3之间不会产生死锁;进程p2和p3都使用的资源集合是{c,d},由于进程p2在申请d之前已经释放了c,不存在占有c并且申请d的情况,所以进程p2和p3之间不满足死锁的四个必要条件,不会产生死锁。综上所述,当P1、P2、P3并发执行时,没有发生死锁的可能性。

第六章存储管理课后习题答案

1.考虑下述存储管理方式中,进程空间和逻辑空间的编址情况:(1)界地址存储管理方式,进程空间的首地址;(2)页式存储管理,进程空间的首地址;(3)段式存储管理,进程空间各段的首地址;(4)段页式存储管理,进程空间各段的起始地址.答:(1)界地址存储管理方式,进程空间的首地址从0开始编址;(2)页式存储管理,进程空间的首地址从0开始编址,而逻辑空间划分为若干个页面,每个页面的起始地址是逻辑页号乘以页面大小;(3)段式存储管理,进程空间各段的首地址从0开始编址;(4)段页式存储管理,进程空间各段的起始地址从0开始编址.

2.对于如下存储管理方式来说,进程地址空间各是几维的?(1)页式;(2)段式;(3)段页式答:(1)页式的进程地址空间是一维的(2)段式的进程地址空间是二维的(3)段页式的进程地址空间是二维的

3. 在页式存储管理中,页的划分对用户是否可见?在段式样存储管理中,段的划分对用户是否可见?在段页式存储管理中,段的划分对用户是否可见?段内页的划分对用户是否可见?答:(1)在页式存储管理中,分页对于用户是透明的,一个进程由若干个页构成,所有页的长度相同;(2)在段式存储管理中,分段对于用户是可见的,一个进程由若干个段构成,各个段的长度可以不同,一个段恰好对应一个程序单位。(3)在段页式存储管理中,段的划分对用户是可见的,段内页的划分对用户是透明的,一个段由若干个页构成,所有页的长度相同。

4.为什么空闲页面链适合管理内存空间,而不适合管理外存空间?答:空闲页面链是将所有的空闲页面连成一个链,分配时可取链头的页面,去配时可将被释放的页面连入链头。此种方法适用于内存页面的分配,但对于外存页面的分配因分配和去配均需执行一次I/O传输,速度较慢。特别是当要申请多个页面时,需要进行多次I/O传输,分配效率太低。

5. 在某些虚拟页式存储管理系统中,内存永远保持一个空闲页面,这样做有什么好处?答:在内存没有空闲页架的情况下,需要按照置换算法淘汰一个内存页架,然后读入所缺页面,缺页进程一般需要等待两次I/O传输时间。若内存总保持一个空闲页架,当发生页故障时,所缺页面可以被立即调入内存,缺页进程只需等待一次I/O传输时间。读入后立即淘汰一个内存页面,此时可能也需执行一次I/O传输,但对缺页进程来说不需等待,因而提高了响应速度。

6.为何引入多级页表?多级页表是否影响速度?答:随着内存空间和进程空间的快速增长,页表越来越大,单级页表的存放遇到困难,为此常将页表分为多级存放,即引入多级页表。多级页表会降低地址映射的速度,但通过快表可以将效率保持在合理的范畴内。

7. 与传统页表相比,倒置页表有什么优势?答:传统页表是面向进程虚拟空间的,即对应进程的每个逻辑页面设置一个表项,当进程的地址空间很大时,页表需占用很多的存储空间,造成浪费.与经典页表不同,反置页表是面向内存物理页架的,即对应内存的每个物理架设置一

个表项,表项的序号就是物理页架号f,表项的内容则为进程标识pid与逻辑页号p的有序对.系统只需设置一个反置页表,为所有进程所共用.

8.允许进程空间逻辑页号不连续带来的好处是什么?答:可以给同一进程内的多个线程预留足够的栈空间,而又不浪费实际内存页架。

9. 比较段式存储管理与页式存储管理的优点和缺点.答:页式存储管理优缺点: (1) 静态等长存储分配简单,有效地解决了内存碎片问题; (2) 共享和保护不够方便。段式存储管理优缺点: (1) 动态异长存储分配复杂,存在碎片问题; (2) 共享与保护方便; (3) 可以实现动态链接和动态扩展。

10.举例说明段长动态增长的实际意义.答:允许段长动态增长对于那些需要不断增加或改变新数据或子程序的段来说很有好处。例如,分配给进程的栈空间大小,通常预先无法准确估计,若分配过少可能不够用,分配过多则造成浪费。在栈可以动态增长的情况下,系统开始可以为进程分配一个基本长度的栈空间,这个长度浪费很小。若进程运行时发生栈溢出,通过中断可以进行动态扩展。

11. 在段式存储管理中,段的长度可否大于内存的长度?在段页式存储管理中呢?答:在段式存储管理中,段的长度不能大于内存的长度,因为一个独立的段占用一段连续的内存空间,内存分配是以段为单位进行的,如果一个段的长度大于内存的长度,那么该段将无法调入内存。在段页式存储管理中,段的长度可以大于内存的长度。因为内存分配的单位是页,一个段内逻辑上连续的页面,可以分配到不连续的内存页面中,不要求一个段的所有逻辑页都进入内存。

12.共享段表的用途何在?答:共享段表的用途主要有如下两个:(1)用来寻找共享段:根据进程首次访问某段的名称在共享段表中查找,可以得知该段是否已在内存;(2)确保一个共享段只有一组描述信息:共享段的地址、长度等信息在共享段表中仅记录一次,防止在多个进程段表中重复登记所带来的维护困难。共享段表用来实现段的共享和保护,该表中记录所有共享段。多个进程共享同一段时,这些进程段表中的相应表目指向共享段表中的同一个表目。

13. 具有两级页表的页式存储管理与段页式存储管理有何差别?答:具有两级页表的页式存储管理的地址空间依然是一维的,页的划分对于进程来说是透明的。而段页式存储管理的地址空间是二维的,段的划分用户能感觉到。

14.何谓请调?何谓预调?为何在预调系统中必须辅以请调?答:P157。

15. 段的动态连接给共享带来什么问题?如何解决?答:动态连接提高了系统的效率,但也

带来一些问题,主要是对于段共享的影响。代码段共享的必要条件是该段在运行过程中不修改

自身,即要求是“纯代码”(pure code),而动态连接需要修改连接字,这与共享的要求相矛

盾。解决这个问题的一种方法是将代码段分为“纯段”和“杂段”两个部分,即将连接字等可

修改的内容存放在“杂段”中,而将其它内容放在“纯段”中。“杂段”不共享,“纯段”可共

享。

16.在虚拟段页式存储管理中,考虑段的共享与段长度的动态变化,连接中断如何处理?答:

由段名查本进程的段名—段号对照表及共享段表,经判断可分为如下三种情形:(1) 所有进程

都未连接过(共享段表、段名-段号对照表均无): 查文件目录找到该段;为该段建立页表,

将该段由文件全部读入swap空间,部分读入内存,填写页表;为该段分配段号,填写段名-段

号对照表;如该段可共享,填写共享段表,共享记数置1;填写段表;根据段号及段内地址形

成无障碍指示位的一般间接地址。(2) 其它进程连接过但本进程未连接过(共享段表有,段名-

段号对照表无): 为该段分配段号;填写段名-段号对照表,填写段表(指向共享段表),共享段

表中共享记数加1;根据段号及段内地址形成无障碍指示位的一般间接地址。(3) 本进程已连

接过(共享段表无,段名-段号对照表有): 根据段号及段内地址形成无障碍指示位的一般间接

地址。这里,段内地址由两部分构成,即逻辑页号和页内地址。

第七章文件系统

1.举例说明何种文件长度是固定不变的,何种文件长度是动态变化的。答:某些系统可执行程序,如shell、vi的长度通常是固定不变的;而用户正在编辑的文本文件或源代码文件的长度通常是动态变化的。

2.比较文件名、文件号、文件描述符之间的关系。答:文件名是文件的外部名字,通常是一个符号名(字符串),同一文件可以有多个文件名(如通过link)。文件号是文件的内部名字,通常是一个整数,文件号与文件具有一对一的关系。文件描述符是文件打开时返回的整数(入口地址),对应用户打开文件表(如UNIX中的u_ofile)中的一个入口。同一文件可以被多个用户同时打开,此时返回的文件描述符一般不同。同一文件也可以被同一用户多次打开,每次打开时返回的文件描述符一般也不同。

3.将文件控制块被分为两部分有何好处?此时目录项中包含那些成分?答:将文件的FCB划分为次部和主部两部分具有如下两个主要的优点: (1) 提高查找速度:查找文件时,需用欲查找的文件名与文件目录中的文件名字相比较。文件目录是存于外存的,需要以块为单位将其读入内存。由于一个FCB包括许多信息,一个外存块中所能保存的FCB个数较少,这样查找速度较慢。将FCB分为两部分之后,文件目录中仅保存FCB的次部,一个外存块中可容纳较多的FCB,从而大大地提高了文件的检索速度。(2) 实现文件连接:所谓连接就是给文件起多个名字,这些名字都是路径名,可为不同的用户所使用。次部仅包括一个文件名字和一个标识文件主部的文件号,主部则包括除文件名字之外的所有信息和一个标识该主部与多少个次部相对应的连接计数。当连接计数的值为0时,表示一个空闲未用的FCB主部。

4.文件在使用之前为何需要打开?多个进程共享同一文件时,其FCB为何在内存中只能保持一个副本?答:由于文件目录和文件一起存放在外存上,当存取文件时,必须先到外存中读取文件目录信息,从中得获得文件的存放地址,然后再去存取文件。这样一来,文件信息的存取将花费很多时间。如果将整个

文件目录放入内存,又要占用很大内存空间,不可取。所以,文件在使用之前需要打开,目的是将系统中当前使用的文件的有关信息复制到系统打开表、用户打开文件表中,以建立用户和这个文件的联系。多个进程共享同一文件,即各自的用户打开文件表目对应系统打开文件表中的同一入口处。在系统打开文件表的这一入口处的表目存放的唯一的FCB主部的信息,即文件号、共享计数、修改标志。这样做的好处是FCB在内存中只有一个副本,当任何一个进程对文件的操作导致FCB内容变化时,内存中的FCB内容及时得到更新,当所有进程都不再需要该文件时,即当最后一个进程关闭该文件时,才将FCB的内容回写到外存上。这样做可以减少I/O交换次数,提高系统效率。若在系统打开文件表中又存在该文件的FCB 的另一副本,不但占用内存空间,另外无法更好实现多个进程共享同一文件。

5. 使用文件描述符存取打开文件与直接使用文件名相比有何优点?答:首先,文件名是一个字符串,操作速度慢且占空间大,而文件描述符为一整数,其处理效率明显高于字符串。其次,文件被打开后其控制信息 ( FCB )被缓冲到内存系统空间,文件描述符作为用户打开文件表中的入口地址直接与内存 FCB 建立起联系,而文件名无法做到这一点。

6.用户打开文件表中包含那些内容?为何不能将其合并到系统打开表中?答:用户打开文件表中包含以下内容:

文件描述符打开方式读写指针系统打开文件表入口

由于文件是可共享的,多个进程可能会同时打开同一文件,而其打开方式可能是不同的,当前的读写位置通常也是不一样的。如果将这些信息合并到系统打开文件表中,就会导致一个共享文件占用多个系统打开文件表表目,这些表目的大部分内容是重复的。当一个进程对文件的操作导致FCB内容变化时,该进程关闭文件时就要将FCB回写到外存。增加了内外存传输的次数,也容易导致FCB内容的不一致。因此,通常将打开方式和读写指针记录在另外一个表,即用户打开文件表中。

7. 说明对于如下文件操作命令,文件管理系统如何进行合法性检查。(1)打开文件(2)读写文件(3)删除文件答:(1)打开文件:根据打开方式、共享说明和用户身份检查访问合法性;(2)读写文件:根据用户打开文件表中所记录的打开方式和存取方式核查访问的合法性;(3)删除文件:根据共享说明和用户身份检查访问合法性。

8.采用文件连接技术后,文件名与文件是否一对一?文件号与文件是否一对一?文件描述符与文件是否一对一?答:文件名与文件是多对一。文件号与文件是一对一。文件描述符与文件是多对一。

9. 对于Hash 文件结构,回答下述顺序探查法解决冲突方面的问题。(1) 对于一个非空闲记录来说,其键值 key 的杂凑值 hash ( key )是否一定与该记录地址 addr 相同? (2) 当一记录的冲突记数为0时,该记录是否一定空闲? (3) 当一记录空闲时,该记录的冲突记数是否一定为0? 答:(1)不一定,当前面记录发生冲突时,可能在顺序探查时占用本记录。(2)不一定,可能存放冲突的记录。(3)不一定,本记录被删除后,仍可能有其它记录其 hash ( key )为本记录入口地址。

10.何谓文件连接?如何实现文件连接?答:文件连接就是给文件起多个名字,这些名字都是路径名,可为不同的用户所使用。实现文件连接时,要根据已存在的文件路径名查找目录,得到被连接文件的文件号,将该文

大明万历皇帝堪称千古一帝

大明神宗万历皇帝朱翊钧(1573~1619),一个被清史极度污蔑的皇帝,一个真正的民族英雄.中国因为他的存在而精彩!或许少一个朝代,中国早就进入君主立宪制,或许多一个万历皇帝,中国的近代史不会如此凄惨. 让我们来比较一下为明朝修史时的康熙皇帝,两个人的经历极为相似.在位时间长,最初都是有极强势的辅政大臣,有着堪称盛世的年代,有着辉煌的胜利,同样的后期倦政,也有着同样的失败.万历皇帝最大的失败是不 断被满清宣传的萨尔浒之役,损失四万;康熙最大的失败是康熙五十六年六万军队全军覆没于准葛尔;而对应万历帝的矿税,康熙年间的国库有着骇人听闻的四千三百万亏空.两个轨道非常相似的皇帝一个被大肆宣传其缺点错误,甚至推论明亡于万历,真是天下奇闻. 要是明朝后面的几个皇帝能象万历皇帝对待熊廷弼那样对待大臣,明朝的历史将会长很多.而康熙则被宣传成千古一帝,前后近三十年的战争和混乱民不聊生(到二十八年尼布楚条约的签定),后面十几年的九子夺嫡,鸡飞狗跳都被轻轻抹过.不过想想也释然.谁让他有个好孙子,借着修四库全书把史书毁得毁,改得改,文字狱那才叫恐怖,比起他儿子盛世要用禁武令来维持有效多了. 虽然说好皇帝未必就是好人,但让我们首先看看两个人的私德.毫无疑问万历皇帝用情更专,至少比起从洗衣奴到蒙古公主都兼容并蓄的几乎如种马一般的康熙好得太多了.到万历四十多年双方白头万历和郑贵妃的感情始终不变,虽然不如明孝宗,但即使放到今天来看,仍然不失为道德楷模.关于万历酒色财气的诽谤.”色” 讲过了,”财”放到后面再讲.我们来看

看酒,根据某些”历史学家”的考证,万历每餐必酒每酒必醉,整个一个大酒鬼,但是翻遍史书只有大明万历八年有一次记录,确实是喝多了.只要稍微了解明朝言官的威力,就知道明朝的起居注绝不可能隐瞒万历帝醉酒误事的事件,可是翻遍史料就是没有.而且更耸人听闻的是甚至还有人推论万历后期倦政是因为吸毒,前些日子到定陵,还听到一个导游喋喋不休,万历皇帝好酒而且后来对其骨骸监测,身前还吸过毒,这个简直就是胡扯,每餐必醉加吸毒能执掌中国四十多年?只怕不用几天就玩完了.而康熙虽然没有好酒的谣言,但是对打猎的爱好简直让人吃惊.如果说在承德是为了方便和蒙古各部联系的话,那么密度如此之大的出行这样的理由令人难以信服,一共四十八次的木兰围场,当然还有种说法康熙为了保证八旗军的战斗力,但是前二十年战事不断的时候需要这样的演习吗?后几十年需要每年重复同样的军演吗?只能让人认为康熙因为个人爱好而荒废国事.更糟糕的是康熙曾经自己宣称一日射兔三百一十八只,我说他那天绝对没有时间处理国事,这个推论应该没问题吧。四十八次出巡,这种围猎的时间和金钱的消耗,和一餐酒比起来实在是一个天上一个地下. 就算万历皇帝真天天喝酒也拍马难及,要怪就怪万历偶然一酒没有和拉动内需联系起来.最后再来说”气”的问题,所谓气无外乎万历皇帝曾经杖责过太监,实际上这种情况在清朝还要普遍和无情的多,甚至在乾隆以后入宫的太监只能姓秦,赵等几个姓.这一切是因为”英明”的满清皇帝认为明朝太监之祸尤烈,所以清朝对太监的责罚之恐怖让人震惊.不过如果麻子皇帝再活五百年,看到清朝女人之祸尤烈,会不会穿越回那个年代宣称不近女色?

基于android的简单记事本的设计大学论文

设计报告成绩评定表: 评分内容成绩 系统方案思路合理性(10%) 报告内容的完整性(10%) 硬件原理图及说明(20%) 程序流程图(20%) 程序清单(10%) 调试及结果分析(10%) 系统改进建议或者方案(10%) 格式规范(10%) 总分 备注:以上总分为该组的平均分,根据成员分工具体分数如下。 小组成员分工分数刘志负责代码的编写 云庆负责总计界面的设计与优化 负责整个设计过程中的ppt制作,以及答辩申任翔 吴宜凡负责调试整个程序,报告撰写

基于Android的简单记事本的设计 摘要 本文主要阐述了基于Android的简单记事本的设计与实现,较为系统的介绍了用户通过点击add按钮编辑事件、通过save按钮添加事件,以及在主界面查看事件列表、单击列表查看单个事件的详细内容,和通过长按列表弹出对话框,选择修改事件、删除事件等。本文主要介绍的是运用eclipse软件进行Android 应用的设计,如使用Activity类、运用Intent技术实现页面的跳转、通过数据存储实现标题、时间、内容的保存以及取出查看的功能。通过以上技术使应用中的各项操作简便易懂并且有明确的提示,让用户可以更清晰快捷地掌握该记事本的使用,为用户节省了时间,为用户提供了便利,随时随地都能记录生活。 关键词:Android、记事本、Intent、Activity

目录 绪论 (1) 一丶需求分析和概要设计 (3) 1.1需求分析 (3) 1.2整体要求 (3) 1.3开发工具和环境 (3) 二丶系统设计 (4) 2.1系统设计架构 (4) 2.2界面概述 (5) 2.3模块概述 (6) 三丶系统详细设计 (6) 四丶系统的不足及改进 (9) 五丶总结 (10) 六丶参考文献 (11)

基于单片机的电子日历时钟设计

#include #define uchar unsigned char #define uint unsigned int //----端口定义--- sbit ACC_7=ACC^7; sbit RST1=P2^5; sbit IO=P2^6; sbit SCLK=P2^7; sbit k1=P3^2; sbit k2=P3^3; sbit k3=P2^2; sbit k4=P2^3; //uchar wei[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; // 数码的位选,左到右 uchar tab_1302[7]={45,50,11,19,1,1,15}; uchar tab_time[8]={0,0,10,0,0,10,0,0}; //时间 uchar tab_day[8]={0,0,10,0,0,10,0,0,}; //年月日 uchar tab_num[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf}; //0 1 2 3 4 5 6 7 8 9 - {"0123456789-"} ////////////=============函数声明============//////////////// void display_time(); void delayms(uint); void display_day(); void ds1302(); //获取DS1302的时间 void ds1302_init(); //DS1302的初始化 void write1302(uchar,uchar); //指定地址向DS1302写数据 uchar read1302(uchar); //指定地址向DS1302读数据 void ds1302(); void int0_init(); /////////=======中断初始化=======/////////// void int0_init() { EX0=1;

明神宗朱翊钧

明神宗朱翊钧 第一节冲年即位 明神宗朱翊钧(1563—1620),是明穆宗第三子。穆宗有四子,长子朱翊釴、次子朱翊钤,俱早亡。四子朱翊镠与朱翊钧同为李氏所生,封潞王。朱翊钧幼时的命运并不好,由于明世宗晚年迷信道教,“讳言储贰,有涉一字者死”①,不要说他没有被立为皇太孙,就连他出生的消息,穆宗都不敢向世宗奏报,出生两个月不敢剃头发,甚至到了五岁还没有起名字。直到隆庆元年(1567)正月初十日,廷臣上疏请立皇太子,同月十八日穆宗才为他赐名,叫翊钧。穆宗说:赐你名字,名为钧,是说圣王制驭天下,犹如制器之转钧也,含义非常重大。你当念念不忘②。隆庆二年(1568)三月十一日,朱翊钧被立为皇太子,正位东宫。 皇太子就是未来的皇帝,将来要治国治民,必须从小接受教育,了解以往帝王承业治国的经验教训,熟悉朝章典故,掌握驾驭臣民的本领。朱翊钧虽然年幼,却很懂得这个道理。穆宗任命一批大臣为教官,辅导他读书。朱翊钧学习非常用功。其母李氏“教子颇严。帝或不读书,即召使长跪。每御讲筵入,尝令效讲臣进讲于前。遇朝期,五更至帝寝所,呼曰‘帝起’,敕左右掖帝坐,取水为盥面,挚之登辇以出”①。由于讲官的尽心辅导,李太后的严格管教,以及他本人的刻苦努力,朱翊钧年渐长而学愈进。他自己后来也常常十分得意地夸耀说:“朕五岁即能读书。” 隆庆六年(1572)五月二十六日,明穆宗终因纵欲过度,病入膏盲,病死于乾清宫。 隆庆六年六月初十日,年仅十岁的朱翊钧即皇帝位,改元万历,以翌年为万历元年。 明神宗即位时,摆在他面前一个突出的问题就是“柄臣相轧,门户渐开,而帝未能振肃朝纲,矫除积习”②。这个问题,以后变得更为激烈。穆宗弥留之际,授高拱、张居正等人为“顾命大臣”,嘱咐他们和内外文武百官一起,“协心辅佐”年幼的皇太子。神宗自己在登极诏中也命令他们:朕方在冲年,尚赖文武亲贤,“共图化理”,“与民更始”。如今,先皇尸骨未寒,小皇帝看到的却完全是另一种情景:那些“顾命大臣”,不是“协心辅佐”,顾及民族的利益、百姓的生死,而是首先顾及自己,为了争夺地位和权力,开始火并起来。同时,在经济和政治方面的问题也堆积如山。面对着这些重重的困难,这个小皇帝没有畏缩不前,为了“皇图永固”,他以“少年天子”的气派,牢牢抓住“用人唯我”、生杀予夺在朝廷这根权柄,励精图治,推行新政,在位前十年中很有所作为。 ①于慎行:《穀山笔麈》卷二《纪述一》。 ②谈迁:《国榷》卷六五。 ①《明史》卷一一四《孝定李太后传》。 ②《明史》卷二○《穆宗纪》。 第二节励精图治 万历元年(1573)到万历十年(1582),是明神宗人生的辉煌时期。在此期间,他用张居正为内阁首辅,大力支持张居正以整理赋役为中心的社会改革,从而换来了经济发展和社会相对安定的局面。 明穆宗末年,高拱为内阁首辅。高拱,“性直而傲”,“持论多偏”,说话随便,常常为此得罪人。他与徐阶有矛盾,在徐阶谢政归里以后,高拱即“扼阶不遗余力”,为此又与张居正关系破裂,成为冤家对头。高拱主阁,坚持反对宦官越权,为此触犯了当时内廷的大红人太监冯保。冯保遂与张居正内外串通起来,欲置高拱于死地。穆宗去世时,高拱以主幼国危,痛哭时说了一句:“十岁太子如何治天下。”神宗即位后,冯保将这句话加以歪曲,改成“高公讲,十岁小孩哪能决事当皇帝”。神宗听到这话,“专权之疑,深中帝心”。他不问高拱说此话的背景,是否属实,即于隆庆六年(1572)六月十六日将他免职,以张居正取代他的位置。此后神宗在位四十八年,始终坚持自操威柄。他说过“若用舍予夺,不由朝廷,朕将何

单片机课程设计题目汇总(全)

单片机原理与接口技术课程设计题目汇总 说明:为便于同学提前探讨开发思路,特将本课程设计的可选题目发给大家。 每个同学可以在以下题目中选一题要求:课程设计考核内容包括:源程序;设计报告文档基于单片机的电子时钟设计设计内容:1、用LCD液晶作为显示设备(30分) 2、可以分别设定小时,分钟和秒,复位后时间为:00: 00:00 (30 分) 3、能实现日期的设置,年、月、日(30分) 4、其他创新内容(10分)如:闹钟功能;显示星期;整点音乐报时等。 图示: 2010-04-09 MON 11:06:42 基于单片机的交通灯显示系统(一) 设计内容:1、东西方向、南北方向均有红、黄、绿三种信号灯;(30 分) 2、带紧急制动按钮,按钮按下,所有方向亮红灯;再次按下,恢复正常显 示(20分) 3、夜间模式按钮按下,所有方向显示黄灯闪烁(20分) 4、实时提醒绿灯亮的剩余时间(30分)图示: 基于单片机的交通灯显示系统(二) 设计内容:1、东西干道和南北干道的通行分左行、右行、直行,其中左行、右行固定15秒;直行固定30秒(40分) 2、信号灯分绿灯(3种)、红灯、黄灯,每次绿灯换红灯时,黄灯亮3秒 钟。(30分) 3、东西干道和南北干道交替控制,每次干道绿灯交替时,有 3 秒钟所有干道的交通灯都是黄灯闪烁3秒钟,提示已经进入路口的车辆迅速通过。(30分)

4、其他创新内容。(10分) 图示: 四、基于单片机的波形发生器设计 设计内容:1、设计一款能产生3种以上波形的波形发生器(30分) 2、设计波形选择按钮(采用3个独立按键)(10分) 3、点阵显示波形图案(20分) 4、能同时输出两种波形(30分) 5、显示频率(10分) 图示: 五、基于单片机的LED点阵广告牌设计 设计内容:1、能显示不同字符、图形的LED点阵广告牌(30分) 2、用独立按键控制不同字符的切换效果(如闪烁、静止、平移)(30 分) 3、可通过串口从电脑下载更新需要显示的字符(30分) 4、其他创新功能(10分) 图示:略 六、基于单片机的篮球计分器设计 设计内容:1、设计LCD显示篮球比分牌(30分) 2、通过加分按钮可以给A队或B队加分(20分) 3、设计对调功能,A队和B队分数互换,意味着中场交换场地。(20 分) 4、显示比赛倒计时功能(20分) 5、创新内容:如显示第几小节(10分) 显示: A 083: B 079 4th Period 10:25

android日记本代码

一、实验详细代码 (1)布局的代码 a.edit.xml代码

相关文档
相关文档 最新文档