操作系统恐龙书第九版课后答案(持续更新)_操作系统概念第九版课后答案-程序员宅基地

技术标签: 操作系统  系统架构  

第一章 导论

1.1操作系统的三个主要目的是什么?

答:
为计算机用户提供一个方便、有效地在计算机上执行程序的环境。
根据需要分配计算机的不同资源来解决给定的问题。分配过程应尽可能公平和有效。
作为一个控制程序,它有两个主要功能:(1)监督用户程序的执行,以防止错误和不适当的使用计算机(2)管理操作和控制的I/O设备。

1.3在为实时环境编写操作系统时,程序员必须克服的主要困难是什么?

答:主要的困难是保持操作系统在实时系统的固定时间限制内。如果系统没有在一定时间内完成某个任务,可能会导致正在运行的整个系统崩溃。因此,在为实时系统编写操作系统时,编写者必须确保他的调度方案不允许响应时间超过时间限制。

1.4牢记操作系统的各种定义,考虑操作系统是否应包括Web等应用程序浏览器和邮件程序。 争论它应该和它应该不是,并支持你的答案。

答:支持操作系统包括流行的应用程序:如果应用程序嵌入到操作系统,它可能更好地利用在内核中的特性,比在内核以外的应用程序具有更好的性能优势。反对在操作系统中嵌入应用程序的争论通常占主导地位:(1)应用程序是应用程序——而不是操作系统的一部分,(2)在内核中运行的任何性能好处都会被安全漏洞抵消,(3)它会导致操作系统膨胀。

1.6下列哪些指令需要拥有特权(包含在内核中执行)

a. Set value of timer.
b. Read the clock.
c. Clear memory.
d. Issue a trap instruction.
e. Turn off interrupts.
f. Modify entries in device-status table.
g. Switch from user to kernel mode.
h. Access I/O device.

答:Set value of timer, clear memory, turn off interrupts, modify entries in device-status table, access I/O device.其他指令可以在用户模块中执行

1.9可以使用计时器来计算当前时间。提供一个简短的描述,说明如何实现这一点。

答:一个程序可以使用下面的方法来计算使用定时器中断的当前时间。该程序可以为未来的某个时间设置一个计时器,然后进入睡眠状态。当它被中断唤醒时,它可以更新它的本地状态,用来跟踪到目前为止它收到的中断的数量。然后,它可以重复这个过程,不断设置计时器中断,并在中断实际引发时更新其本地状态。

1.12在多道程序和分时环境中,多个用户同时共享系统。这种情况会导致各种安全问题。

a:这两个问题是什么?
b:我们能否确保分时机器和专用机器一样的安全性?解释你的答案。
答:a.窃取或复制自己的程序或数据;在没有合理核算的情况下使用系统资源(CPU、内存、磁盘空间、外设)。
b.可能不会,因为人类设计的任何保护方案都不可避免地会被人打破,而且方案越复杂,就越难以对其正确实施有信心。

1.14在什么情况下,用户最好使用分时系统而不是 PC 或单用户工作站?

答:当其他用户很少,任务很大,而且硬件速度很快时,分时是合理的。系统的全部功能可以用来解决用户的问题。这个问题可以比在个人电脑上更快地解决。另一种情况是,许多其他用户同时需要资源。当工作足够小,可以合理地在上面执行,并且性能足够执行程序,使用户满意时,个人计算机是最好的。

1.19中断的目的是什么? 陷阱和中断之间有什么区别? 陷阱可以由用户程序有意生成吗? 如果是这样,出于什么目的?

答:中断是系统中由硬件生成的流变更。一个中断处理器被调用来处理中断的原因;然后将控制返回给中断的上下文和指令。陷阱是一种软件生成的中断。中断可以用来发出I/O完成的信号,以避免设备轮询的需要。陷阱可以用来调用操作系统例程或捕获算术错误。

1.21有些计算机系统在硬件上不提供特殊的操作模式。有可能为这些计算机系统构建一个安全的操作系统吗?给出它是和它是不可能的论据。

答:这类机器的操作系统需要始终处于控制状态(或监控模式)。这可以通过两种方法来实现:
a:所有用户程序的软件解释(例如一些BASIC、Java和LISP系统)。软件解释器可以在软件中提供硬件不能提供的东西。
b:所有的程序都要用高级语言编写,这样所有的目标代码都是由编译器生成的。编译器将生成(内联或通过函数调用)保护检查,以确定硬件是否缺失。

第二章 操作系统结构

2.1系统调用(system call)的目的是什么?

答:系统调用允许用户级进程请求操作系统的服务

2.5命令解释程序(command interpreter)的目的是什么?为什么它通常与内核分离?

答:它从用户输入或命令文件中读取命令并执行它们,通常是将它们转换为一个或多个系统调用。
命令解释程序通常不是内核的一部分,因为命令解释程序有很多变化,有的系统甚至有多个命令解释程序。

2.8系统设计的分层方法(layered approach)的主要优势是什么?使用分层方法的缺点是什么?

答:分层法作为系统模块化的一种方法,其主要优点在于简化了构造和调试。
其主要难点在于合理定义各层,由于每层只能利用更底层的功能,有必要仔细规划。并且分层法与其他方法相比效率更差。

2.12操作系统提供的服务和功能可以分为两大类。简要描述这两类并讨论它们的区别。

答:操作系统提供的一类服务是在系统中同时运行的不同进程之间实施保护。 进程只允许访问与其地址空间相关联的那些内存位置。 此外,不允许进程损坏与其他用户关联的文件。 进程也不允许在没有操作系统干预的情况下直接访问设备。 操作系统提供的第二类服务是提供底层硬件不直接支持的新功能。 虚拟内存和文件系统就是操作系统提供的两个这样的新服务示例。

2.16使用相同的系统调用接口来操作文件和设备有什么优点和缺点?

答:可以像访问文件系统中的文件一样访问每个设备。 由于大多数内核通过这个文件接口处理设备,通过实现特定于硬件的代码来支持这个抽象文件接口来添加新的设备驱动程序相对容易。 因此,这有利于开发用户程序代码(可以编写为以相同方式访问设备和文件)和设备驱动程序代码(可以编写为支持定义良好的 API)。 使用相同接口的缺点是可能难以在文件访问 API 的上下文中捕获某些设备的功能,从而导致功能损失或性能损失。 其中一些问题可以通过使用 ioctl 操作来克服,该操作为进程调用设备上的操作提供了一个通用接口。

2.17用户是否可以使用操作系统提供的系统调用接口来开发一个新的命令解释程序?

答:用户应该能够使用操作系统提供的系统调用接口开发新的命令解释程序。 命令解释程序允许用户创建和管理进程并确定它们通信的方式(例如通过管道和文件)。 由于所有这些功能都可以由用户级程序使用系统调用来访问,因此用户应该可以开发一个新的命令行解释程序。

2.21系统设计的微内核方法的主要优势是什么?在微内核体系结构中,用户程序和系统服务如何交互?使用微内核方法的缺点是什么?

答:好处通常包括以下(a)添加新服务不需要修改内核,(b)它更安全,因为在用户模式下比在内核模式下完成更多操作,(c)更简单的内核设计和功能通常 导致更可靠的操作系统。
用户程序和系统服务通过使用进程间通信机制(例如消息传递)在微内核体系结构中进行交互。 这些消息由操作系统传送。
微内核架构的主要缺点是与进程间通信相关的开销以及频繁使用操作系统的消息传递功能以使用户进程和系统服务能够相互交互。

第三章 进程

3.1在图3.30所示的程序,解释line A上的输出。在这里插入图片描述

答:使用fork()创建子进程后,子进程拥有自己的内存地址,在子进程中返回值为0,即pid=0,修改value为15,因为子进程中value和父进程的value内存地址不一样,所以父进程的value任为5;而在父进程中,fork()返回的是子进程的进程id>0,直接打印PARENT: value = 5

3.2包括初始父进程,图3.31中显示的程序创建了多少进程?

在这里插入图片描述

答:总共创建了8个进程。

3.5当一个进程使用fork()操作创建一个新进程时,父进程和子进程共享下列哪个状态? a栈 b堆 c共享内存段

答:只有共享内存段在父进程和新分叉的子进程之间共享。为新创建的进程复制堆栈。

3.8描述短期调度程序、中期调度程序和长期调度程序之间的区别。

答:短期调度程序(CPU调度程序)——从准备执行的进程中选择进程,并分配CPU。
中期调度程序,将进程从内存(或从CPU竞争)中移出,从而降低多道程序程度。之后进程看重新被调入内存,并从中断出继续执行。实现一种交换方案。
长期调度程序(作业调度程序)——从进程缓冲池中选择进程加到内存中,以便执行。
他们主要的区别在于执行的频率。短期调度程序必须经常为CPU选择新的进程。长期调度程序并不频繁,因为长期调度程序控制多道程序进程,必须保证多道程序进程的稳定,为此创建创建程序的平均速度必须等于进程离系统的平均速度。所以只有在进程离开系统时才会需要长期调用程序的调度。

3.9描述内核在进程之间进行上下文切换时所采取的动作。

答:内核会将旧进程状态保存在其PCB中,然后加载经调度后的要执行的新进程的上下文。上下文切换的工作量与硬件支持密切相关,例如有的处理器提供了多个寄存器组,上下文切换只需简单改变寄存器组的指针,但如果活动进程数超过寄存器组数,系统就需要在寄存器和内存之间进行数据复制。

3.12包括初始父进程,图3.32中显示的程序创建了多少个进程?

在这里插入图片描述
答:共创建16个进程。

3.13解释在什么情况下会到达图3.33中标记为printf(“line J”)的代码行。

在这里插入图片描述
答:当子进程创建成功后,调用execlp()加载/bin/ls程序的代码和静态数据,若调用成功,则永远不会执行printf(“line J”);若调用失败(如不存在/bin/ls这样的可执行程序),才会执行printf(“line J”)

3.14使用图3.34中的程序,确定A、B、C和D行的pid值(假设父进程和子进程的实际pid分别为2600和2603)。在这里插入图片描述

答:
A: pid=0
B: pid1 = 2603
C: pid = 2603
D: pid = 2600

第四章 线程

4.1提供三个编程示例,在这些示例中,多线程比单线程解决方案提供更好的性能。

答:1、一个Web服务器,需要接受有关网页、图像、声音的请求,同时处理上千个用户的访问请求。
2、一个并行的应用程序,如矩阵乘法,其中矩阵的不同部分可以并行处理。
3、一种交互式的字处理器,一个线程用于显示图形,一个线程用于响应用户键盘输入,还有一个线程用于在后台进行拼写和语法检查。

4.2用户线程和内核线程之间的两个区别是什么?在什么情况下,一种比另一种好?

答:1、用户线程位于内核之上,他的管理无需内核支持,而内核线程由操作系统来直接支持与管理。
2、在使用一对一模型或多对多模型的系统上,用户线程由线程库调度,而内核调度内核线程。
内核线程不需要与一个进程相关联,而每个用户线程都属于一个进程。内核线程通常比用户线程的维护成本更高,因为它们必须用内核数据结构表示。

4.3描述内核在内核级线程之间进行上下文切换时所采取的动作。

答:内核线程之间的上下文切换通常需要保存被切换出去的线程的CPU寄存器的值,并恢复被调度的新线程的CPU寄存器。

4.4创建线程时使用哪些资源?它们与创建进程时使用的方法有何不同?

答:因为线程比进程小,所以创建线程通常比创建进程使用更少的资源。创建一个进程需要分配一个进程控制块(PCB),这是一个相当大的数据结构。PCB包括内存映射、打开的文件列表和环境变量。分配和管理内存映射通常是最耗时的活动。创建用户或内核线程都需要分配一个小数据结构来保存寄存器集、堆栈和优先级。

4.6提供两个编程示例,在这些示例中,多线程并不比单线程解决方案提供更好的性能

答:顺序程序不适合多线程编程。例子:
1、一个计算个人纳税申报单的程序。
2、“shell”程序,如C-shell或Korn shell。这样的程序必须密切监视自己的工作空间,如打开的文件、环境变量和当前工作目录。

4.7在什么情况下,使用多个内核线程的多线程解决方案比单处理器系统中的单线程解决方案提供更好的性能?

答:当内核线程发生页面错误时,可以切换到另一个内核线程,以一种有用的方式使用交错时间。另一方面,当发生页面错误时,单线程进程将无法执行有用的工作。因此,在程序可能出现频繁的页面错误或必须等待其他系统事件的情况下,多线程解决方案甚至在单处理器系统上也能执行得更好。

4.8在多线程进程中,程序状态的下列哪些组件是跨线程共享的?a寄存器值 b堆内存 c全局变量 d栈内存

答:多线程进程的线程共享堆内存和全局变量。每个线程都有其独立的寄存器值集和独立的栈。

4.9使用多个用户级线程的多线程解决方案能否在多处理器系统上比在单处理器系统上获得更好的性能?

答:由多个用户级线程组成的多线程系统不能在多处理器系统中同时使用不同的处理器。操作系统只看到一个进程,不会将该进程的不同线程调度到不同的处理器上。因此,在多处理器系统上执行多个用户级线程不会带来性能上的好处。

4.11是否可能有并发性但没有并行性?解释一下。

答:可以,系统的并行性(parallelism)是指在同一时间执行多个任务,并发性(concurrency)是指系统能够支持多个任务,允许所有任务都能取得进展。因此没有并行,通过系统的调度也可以实现并发。

4.15考虑下面的代码段在这里插入图片描述(1)创建了多少个独特的进程?(2)创建了多少个独特的线程?

答:(1)6个进程
(2)8个线程

第五章 同步(Synchronization)

5.3 “忙等待(busy waiting)”是什么意思?在操作系统中还有什么其他类型的等待?能否完全避免繁忙的等待?解释你的答案。

答:忙等待(也叫自旋锁)意味着一个进程为了等待某个条件得到满足,连续循环的调用acquire(),不放弃处理器。忙等待是可以避免的,进程可以通过放弃处理器进入沉睡状态(阻塞)来等待,等待在未来的某个适当时间被唤醒。但将进程置于睡眠状态并且在达到适当的程序状态时将其唤醒,会导致额外的开销。

5.5 请说明,如果wait()和signal()信号量操作不是原子执行的,则可能会违反互斥原则。

答:wait()操作以原子的方式递减与信号量相关的值。如果一个信号量的值为1时,在该信号量上执行了两个等待操作,如果这两个操作不是原子执行的,那么这两个操作可能会继续减小信号量的值,从而违反互斥。

5.6 说明如何使用二进制信号量实现n个进程之间的互斥。

答:n个进程共享一个初始化为1的信号量mutex。每个过程Pi组织如下:
在这里插入图片描述

5.10 请解释:为什么在单处理器系统上通过禁止中断来实现同步原语的方法不适用于用户级程序

答:如果用户级程序具有禁用中断的能力,那么它可以禁用计时器中断并防止发生上下文切换,从而不让其他进程执行,达到独占处理器的目的。

5.11 请解释为什么禁止中断不适合在多处理器系统来实现同步原语

答:如果多个进程运行在不同的CPU上,每个进程都试图进入一个临界区,即使禁止中断,其他进程依旧能够在其他处理器上进入临界区。

5.13 请描述可能存在竞争条件的两个内核数据结构。一定要有如何可能发生竞争条件的描述。

5.23 展示如何在多处理器环境中使用TestAndSet()指令实现wait()和signal()信号量操作。方案应该表现最小的忙等待。

答:伪代码如下:
在这里插入图片描述

5.25 请解释:监控器和信号量是等价的,因为它们可以用来实现对相同类型的同步问题的解决方案。

答:可以使用下面的监视代码实现信号量:
在这里插入图片描述
监视器可以通过以下方式使用信号量来实现。每个条件变量都由一个等待条件的线程队列表示。每个线程都有一个与其队列条目相关联的信号量。当线程执行等待操作时,它会创建一个新的信号量(初始化为0),将该信号量添加到与条件变量相关的队列中,并对新创建的信号量执行阻塞信号量递减操作。当一个线程在一个条件变量上执行一个信号时,队列中的第一个进程将通过对相应的信号量执行递增操作而被唤醒。

5.32 一个文件在不同的进程之间共享,每个进程都有一个唯一的编号。该文件可以被多个进程同时访问,但有如下约束:当前访问该文件的所有进程关联的所有唯一编号之和必须小于n。通过写监视器来协调对该文件的访问。

答:
在这里插入图片描述

第六章 CUP调度

6.1 cpu调度算法决定了被调度进程的执行顺序。给定在一个处理器上调度n个进程,可能有多少种不同的调度?给出一个用n表示的公式。

答:n!种调度

6.2 解释抢占式调度和非抢占式调度的区别。

答:抢占式调度允许进程在执行过程中被中断,将CPU取走并分配给另一个进程。非抢占式调度,一旦CPU分配给一个进程,那么这个进程会一直使用CPU知道进程终止,或切换到等待状态。

6.3 假设以下进程在指定的时间到达执行。每个进程将按照列出的时间运行。在回答这些问题时,使用非抢占式调度,并根据你所掌握的信息做出所有决策。在这里插入图片描述

a.使用FCFS调度算法,这些流程的平均周转时间是多少?
b.使用SJF调度算法,这些进程的平均周转时间是多少?
c. SJF算法应该是为了提高性能,但是请注意,我们选择在时间0运行进程P1,因为我们不知道两个更短的进程将很快到达。如果第一个单元的CPU处于空闲状态,计算平均周转时间,然后使用SJF调度。请记住,进程P1和P2在这段空闲时间内正在等待,因此它们的等待时间可能会增加。这种算法可以称为未来知识调度。
答:
a. 10.53
b. 9.53
c. 6.86
记住,周转时间是完成时间减去到达时间,所以您必须减去到达时间来计算周转时间。
如果你忘记减去到达时间的话,FCFS是11

6.4 在多级排队系统的不同级别上拥有不同的时间片(time quantum)大小有什么好处?

答:需要更频繁服务的进程(例如,编辑器等交互进程)可以在一个时间量较小的队列中。不需要频繁服务的进程可以在一个具有更大时间片的队列中,需要更少的上下文切换来完成处理,从而更有效地利用计算机。

6.6 调度算法(在短期CPU调度级别上)偏爱最近使用了最少处理器时间的那些进程。为什么这个算法更青睐I/O密集型程序,且不会饿死cpu密集型程序?

答:它将有利于I/ o限制程序,因为它们的CPU突发请求相对较短;但是,CPU绑定的程序不会饿死,因为I/O绑定的程序会相对频繁地放弃CPU来执行它们的I/O操作。

6.10 为什么区分CPU密集型程序和I/O密集型程序对调用程序很重要?

答:I/O密集型程序具有在执行IO之前只执行少量计算的特性。这类程序通常不会使用它们的全部CPU量。另一方面,CPU密集型程序使用它们的整个CPU,而不执行任何IO阻塞操作。因此,通过赋予I/O密集型程序更高的优先级,并允许它们在CPU密集型程序之前执行,可以更好地利用计算机资源。

6.11 讨论以下几对调度标准在某些情况下如何冲突。

a. CPU利用率和响应时间
b.平均周转时间和最小等待时间
c. I/O设备利用率和CPU利用率
答:CPU利用率和响应时间:如果最小化与上下文切换相关的开销,CPU利用率就会增加。通过不频繁地执行上下文切换,可以降低上下文切换的开销。然而,这可能会增加流程的响应时间。
平均周转时间和最小等待时间:通过先执行最短的任务来最小化平均周转时间。然而,这样的调度策略可能会耗尽长时间运行的任务,从而增加它们的等待时间。
I/O设备利用率和CPU利用率:在不进行上下文切换的情况下,运行长时间与CPU绑定的任务,可以最大化CPU利用率。在I/O密集型程序准备好运行时立即进行调度,可以最大化I/O设备利用率,但会因此增加上下文切换造成的开销。

6.14 假设采用指数平均公式来预测下一个CPU执行的长度。当采用如下参数数值时,该算法的含义是:在这里插入图片描述

答:
a、α为0,则最近信息对预测没有影响,公式总是预测为100ms。
b、α为0.99,则赋予最近信息很大的权重,几乎无需考虑过去历史,只用前一个CPU执行长度简单的预测下一个CPU执行。

6.15 循环调度程序的一个变体是回归轮转调度程序。这个调度器为每个进程分配一个时间片和优先级。时间片的初始值为50ms。但是,每当一个进程获得CPU并用完它的整个时间片(不会因为I/O而阻塞)时,它的时间片就会增加10ms,它的优先级也会提高。(进程的时间片最多可以增加到100ms)当一个进程在用完它的整个时间片之前阻塞,它的时间片会降低5ms,而它的优先级保持不变。回归轮转调度程序偏爱哪种类型的进程(cpu密集型或I/ o密集型程序)?解释一下。

答:偏爱I/O密集型程序,因为它总是能在时间片结束之前发生I/O阻塞,优先级不变,那么他就可以长期处于CPU的高优先级队列中,长期霸占CPU

6.16 假设有如下一组进程,其CPU执行的时间以毫秒为单位:

在这里插入图片描述
假设进程以P1、P2、P3、P4、P5的顺序到达,都是在时刻0到达。
a、画出4个Gantt图,分别演示采用每种调度算法(FCFS、SJF、非抢占优先级(一个较大优先级意味着更高优先级)和RR(时间片=2))的进程执行。
b、每个进程在a里的每种调度算法下的周转时间是多少?
c、每个进程在a里的每种调度算法下的等待时间是多少?
d、哪一种调度算法的平均等待时间(对所有进程)最小?
答:
a、在这里插入图片描述
b、在这里插入图片描述
c、在这里插入图片描述
d、SJF的平均等待时间最小

6.17 下面的进程正在使用一种抢占轮转调度算法进行调度。每个进程都被分配了一个优先级数值,较高的数字表示较高的相对优先级。除了下面列出的进程之外,系统还有一个空闲任务(它不消耗CPU资源,被标识为Pidle)。此任务的优先级为0,当系统没有其他可用进程可运行时,将调度该任务。时间片的长度是10个单位。如果一个进程被高优先级的进程抢占,则被抢占的进程被放置在队列的末尾。

在这里插入图片描述
a、采用Gantt图,演示进程的调度顺序
b、每个进程的周转时间是多少?
c、每个进程的等待时间是多少?
d、CPU使用率是多少?
答:a、
在这里插入图片描述
b、在这里插入图片描述

c、在这里插入图片描述
d、105/120 = 87.5%

6.19 下面哪个调度算法会导致饥饿?

在这里插入图片描述
答:b、SJF d、priority

6.24 解释下列调度算法在偏好短进程方面的区别:

在这里插入图片描述
答:a、FCFS不偏好短进程,位于长进程之后的短进程将会等待很长时间
b、RR对长短进程一视同仁都执行相同的时间片,短周期能够最早的完成执行
c、多级反馈队列类似于RR,赋予短进程较高的优先级,而长进程优先级会逐渐降低,最先完成短进程

第七章 死锁

7.1 列出三个与计算机系统环境无关的死锁示例。

答:四辆车同时穿过一个十字路口;
哲学家就餐问题;
一条轨道上两辆相向行驶的火车。

7.3 考虑系统中一个快照:在这里插入图片描述使用银行家的算法回答以下问题:a.矩阵Need的内容是什么?b.系统是否处于安全状态?c.如果来自进程P1的请求到达(0,4,2,0),请求可以立即被批准吗?

答:a、Need = Max - Allocation
在这里插入图片描述
b、是安全状态,首先p0和p3可直接在一开始运行,结束后释放资源,Available变为(1,11,6,4),满足其他所有进程的需求
c、在银行家算法中,若给p1立即分配资源,则Available变为(1,1,0,0),系统依旧处于安全状态

7.6 考虑一个每月运行5,000个作业的计算机系统,该系统没有死锁避免和死锁预防的方案。死锁大约每个月发生2次,每次死锁后必须终止并重新运行大约10个作业。每个作业的价值约为2美元(以CPU时间计算),而终止的作业往往是完成了一半。系统程序员估计,如果在系统中安装死锁避免算法(如银行家算法),每个作业的平均执行时间将增加约10%。由于机器目前有30%的空闲时间,每个月所有5000个工作仍然可以运行,尽管周转时间将平均增加20%左右。

问:a、安装死锁避免算法的理由是什么?
b、反对安装死锁避免算法的理由是什么
答:a、安装死锁避免算法能有效避免死锁的发生,减少因死锁带来损失,并且虽然安装了死锁避免算法后,系统依旧可以每月运行5000个job,不影响任务的完成。
b、由于死锁发生的概率很小,造成的损失只有20/5000可以忽略不计,不必要安装死锁避免算法

7.7 系统能否检测到它的一些进程正在挨饿?如果你的答案是肯定的,解释一下为什么会这样。如果您的回答是否定的,请解释系统如何处理饥饿问题。

答:饥饿是一个很难定义的主题,因为它对不同的系统可能意味着不同的东西。出于这个问题的目的,我们将饥饿定义为这样一种情况:在接收到请求的资源之前,进程必须等待超过一段合理的时间(可能是无限期的)。检测饥饿的一种方法是首先确定一段时间T,它被认为是不合理的。当进程请求资源时,将启动计时器。如果运行时间超过T,则认为进程处于饥饿状态。解决饥饿问题的一种策略是采用一种策略,将资源只分配给等待时间最长的进程。例如,如果进程Pa等待资源X的时间比进程Pb更长,那么来自进程Pb的请求将被延迟,直到进程Pa的请求得到满足。另一种策略可能没有刚才提到的那么严格。在这种情况下,可以将资源授予等待时间少于另一个进程的进程,前提是另一个进程没有饿死。但是,如果另一个进程被认为处于饥饿状态,那么它的请求将首先得到满足。

7.17 考虑一个由四个相同类型的资源组成的系统,它们由三个进程共享,每个进程最多需要两个资源。显示系统是无死锁的。

答:系统要想成为死锁,则必须每个进程占有并请求资源,假设三个进程都占有一个资源,每个进程恰好都请求一个资源,而系统刚好能为其中一个进程提供一个资源,当该进程完成后释放全部资源,并不会造成死锁的情况。

7.19考虑哲学家就餐的问题,把筷子放在桌子中央,哲学家可以使用任意两根筷子。假设一次对筷子的请求只能拿一根筷子。请描述一个简单的规则,用于判断一个请求是否可以被满足且不会导致死锁。

答:只有当所有哲学家都没有两支筷子且只剩一直筷子时,若哲学家请求的是他第一支筷子,该请求会被拒绝。

7.23 考虑下列系统快照:在这里插入图片描述问:a、通过演示可能的安全序列来说明系统处于安全状态。b.如果来自进程P1的请求到达(1,1,0,0),请求可以立即被批准吗?c.如果来自进程P4的请求到达(0,0,2,0),可以立即批准该请求吗?

答:a、安全序列可以是:p0、p3、p1、p2、p4处于安全状态
b、可以立即批准,当批准p1的请求后,依旧存在安全序列p0、p3、p1、p2、p4处于安全状态
c、不可以,若批准p4(0,0,2,0)的请求,则Available变为(3,3,0,1)其中c资源不满足任意进程的需求量,系统不安全

7.25 一座单车道的桥连接着两个佛蒙特州的村庄北滕布里奇和南滕布里奇。这两个村庄的农民用这座桥把农产品运到邻近的城镇。如果一个向北行驶的农民和一个向南行驶的农民同时上桥,大桥就会陷入僵局。(佛蒙特州的农民很固执,不会放弃过桥),请使用信号量和/或互斥锁,在伪代码中设计一个防止死锁的算法。不必担心饥饿(北行农民阻止南行农民使用桥梁的情况,反之亦然)。

答:

semaphore bridge = 1;
void cross(){
	while(true){
		wait(bridge);
		//过桥并离开后
		signal(bridge);
	}
}

第八章 内存管理策论

8.2 考虑一个系统,其中一个程序可以被分成两部分:代码和数据。CPU知道它是需要一条指令(取指令)还是需要数据(取数据或存储数据)。因此,提供了两个基址限制寄存器对:一个用于指令,一个用于数据。基址限制寄存器对是自动只读的,因此程序可以在不同的用户之间共享。讨论该方案的优点和缺点

答:优点:1、它是一种有效的代码和数据共享机制。
2、防止代码被错误修改。
缺点:代码和数据必须分离。

8.3 为什么页的大小总是2的幂

答:分页是将二进制地址分为x位表示页,y位表示偏移量,因此每一页的大小都为2^y,即大小为2的幂。

8.4 考虑一个64页,每页1024个word的逻辑地址空间,映射到一个32帧的物理内存。a.逻辑地址有多少位?b.物理地址中有多少位

答:(a)逻辑地址16位(b)物理地址15位

8.5 允许一个页表中的两个条目指向内存中的相同页帧会有什么影响?请解释如何使用这种效果来减少将大量内存从一个地方复制到另一个地方所需的时间。更新一个页面上的某个字节会对另一个页面产生什么影响

答:允许页表中的两个条目指向内存中的相同页帧,使得可实现代码和数据的共享。如果代码是可重入的,那么可以通过共享使用大型程序(如文本编辑器、编译器和数据库系统)来节省大量内存空间,无需将他们反复进行复制。但是,共享不可重入的代码或数据意味着任何访问代码的进程都可以修改它,并且这些修改将反映在其他用户的副本中。

8.7 在动态链接的分段系统中,在进程之间共享分段而不要求它们具有相同的分段号是可能的。a.定义一个系统,允许静态连接和共享段,而不要求段号相同。b.描述一种分页方案,允许页面共享而不要求页码相同。

答:这两个问题都归结为程序能够引用自己的代码和数据,而不知道与地址相关联的段或页码。MULTICS通过将四个寄存器与每个进程关联来解决这个问题。一个寄存器有当前程序段的地址,另一个寄存器有堆栈的基址,另一个寄存器有全局数据的基址,等等。其思想是,所有的引用都必须通过一个映射到当前段或页码的寄存器间接地进行。通过改变这些寄存器,可以在没有相同页号或段号的情况下,为不同的进程执行相同的代码。

8.12 大多数系统允许程序在执行期间为其地址空间分配更多的内存。在程序的堆段中分配的数据就是这种分配内存的一个例子。在以下方案中,支持动态内存分配需要什么:a.连续内存分配b.纯分段c.纯分页

答:
连续内存分配:可能需要重新定位整个程序,因为没有足够的空间让程序增长其分配的内存空间。
纯分段:也可能需要重新定位需要扩展的段,因为没有足够的空间让段增长其分配的内存空间。
纯分页:在这种方案中,新页面的增量分配是可能的,而不需要重新定位程序的地址空间。

8.13 比较连续内存分配、纯分段和纯分页的主要内存组织方案,可以考虑以下问题:a.外部碎片b.内部碎片c.跨进程共享代码的能力

答:
由于地址空间是连续分配的,并且随着旧进程的死亡和新进程的启动,洞就会出现,因此相邻的内存分配方案存在外部碎片问题。它也不允许进程共享代码,因为进程的虚拟内存段没有分解成非连续的细粒度段。
纯分段会受到外部碎片的影响,因为进程的一个段是连续地放置在物理内存中,当死进程的段被新进程的段取代时,就会出现碎片。然而,分段使进程能够共享代码;例如,两个不同的进程可以共享一个代码段,但有不同的数据段。
纯分页不会受到外部碎片的影响,而是会受到内部碎片的影响。进程是按页粒度分配的,如果没有完全利用页,就会导致内部碎片化和相应的空间浪费。分页还允许进程以页面的粒度共享代码。

8.14 在有分页功能的系统上,进程不能访问不属于它的内存;为什么?操作系统如何允许访问其他内存?为什么它应该或不应该

答:分页系统中的地址是一个逻辑页码和一个偏移量。通过根据逻辑页码搜索表来生成物理页码,从而找到物理页。因为操作系统控制该表的内容,所以它可以限制一个进程只能访问那些分配给该进程的物理页。进程无法引用它不拥有的页,因为该页不在页表中。为了允许这样的访问,操作系统只需要允许将非进程内存的条目添加到进程的页表中。当两个或多个进程需要交换它们刚刚读和写到相同物理地址(可能位于不同的逻辑地址)的数据时,这很有用。这使得进程间通信非常高效。

8.17 从将虚拟地址转换为物理地址的地址转换结构所需的内存数量方面,比较分页和分段。

答:分页需要更多的内存开销来维护转换结构。每个段只需要两个寄存器:一个维护段的基址,另一个维护段的范围。另一方面,分页要求每页有一个条目,这个条目提供了页面所在的物理地址。

8.19 在许多系统中,程序二进制文件的结构通常如下所示。代码以一个小的固定虚拟地址(如0)开始存储。代码段后面是用于存储程序变量的数据段。当程序开始执行时,堆栈被分配到虚拟地址空间的另一端,并允许向较低的虚拟地址增长。上述结构在以下方案中有什么意义:a.连续内存分配b.纯分段c.纯分页

答:
1)连续内存分配要求操作系统在程序开始执行时将整个虚拟地址空间分配给程序。这可能比进程的实际内存需求高得多。
2)纯分段给操作系统灵活性,在每个程序启动时分配一个小范围的段,如果需要则扩展段。
3)纯分页不需要操作系统在启动时为进程分配最大范围的虚拟地址空间,但它仍然需要操作系统分配一个大的页表,跨越程序的所有虚拟地址空间。当一个程序需要扩展栈或堆时,它需要分配一个新页,但相应的页表条目是预先分配的。

8.20 假设页面大小为1 kb,以下地址引用的页码和偏移量是多少(以十进制数提供):a. 3085 b. 42095 c. 215201 d. 650000 e. 2000001

答:

地址 页码 平偏移量
a 3 13
b 41 111
c 210 161
d 634 784
e 1953 129

8.22 物理内存的最大容量是多少?

答:若地址空间为x位,则物理内存最大容量为2^x byte

8.24 考虑一个具有32位逻辑地址和4 kb页面大小的计算机系统。系统最大支持512mb的物理内存。则页表中有多少个条目

答:2^20个

8.25 考虑一个分页系统,其中的页表存储在内存中。a.如果一个内存引用需要50纳秒,那么一个分页的内存引用需要多长时间?b.如果我们添加tlb,并且75%的页表引用都在tlb中,那么有效的内存引用时间是多少?(假设在tlb中查找页表条目需要2纳秒,如果存在该条目的话。)

答:
a、100ns,其中50ns用于引用页表,50ns用引用物理内存
b、0.75*(50ns + 2ns) + 0.25*100ns = 64ns

8.27 解释为什么使用分段比使用纯分页更容易共享可重入模块

答:由于分段是基于内存的逻辑划分而不是物理划分,因此每个用户的段表中只能有一个条目共享任何大小的段。对于分页,对于每个共享的页,页表中必须有一个公共条目。

8.28 考虑下面段表: 在这里插入图片描述以下逻辑地址的物理地址是什么

a. 0,430
b. 1,10
c. 2,500
d. 3,400
e. 4,112
答:
a. 219 + 430 = 649
b. 2300 + 10 = 2310
c. illegal reference, trap to operating system
d. 1327 + 400 = 1727
e. illegal reference, trap to operating system

8.29 分页表的目的是什么?

答:在某些情况下分页的页表可以变得足够大的页表,可以简化内存分配问题(通过确保所有分配固定大小的页而不是可变大小的块),也可以交换目前不使用的页表部分。

8.31 比较用于处理大地址空间的分段分页方案与散列页表方案。在什么情况下,一种方案比另一种更可取

答:当一个程序只占用其大虚拟地址空间的一小部分时,可能会首选散列页表,因为它的大小更小。然而,散列页表的缺点是,将多个页映射到相同的散列页表条目时会产生冲突。如果许多页映射到相同的表项,那么遍历对应于该哈希表项的列表可能会引起很大的开销;在分段分页方案中,这种开销是最小的,因为每个页表条目只维护关于一个页的信息。

第九章 虚拟内存管理

9.1 在什么情况下会发生页面错误?描述发生页面错误时操作系统所采取的操作。

答:当进程视图访问尚未调入主存中的页面时,就会发生缺页错误。此时进程会被陷阱中断,操作系统检查进程的内部表,确认该引用是否为有效引用,若为无效引用,则终止该进程,若为有效引用,则将该页从磁盘读取到主存中。

9.2 假设一个页表包含m帧(最初全部为空),您的进程的页面引用串长度为p,其中有n个不同的页码。对于任何页面替换算法,请回答以下问题:a.页面错误数量的下限是多少?b.页面错误数的上限是多少?

答:a、因为每种页码都必须被读入内存一次,所以缺页错误至少有n次;b、当每次要引用的页面都不在内存中时,缺页错误数最大为p次。

9.3 如图所示的页表,它是一个包含12位虚拟地址和物理地址以及256字节大小页的系统。空闲页帧的列表是D, E, F(也就是说,D在列表的顶部,E是第二个,F是最后一个)。 将下列虚拟地址转换为其等效的十六进制物理地址。所有数字都是十六进制数。(页帧的破折号表示该页不在内存中。)

• 9EF
• 111
• 700
• 0FF
答:0EF 211 D00 EFF

9.5 讨论支持请求分页所需的硬件支持。

答:对于每个内存访问操作,都需要咨询页表,以检查相应的页是否常驻,以及程序是否具有访问该页的读写权限。这些检查必须在硬件中执行。TLB可以用作缓存并提高查找操作的性能。

9.6 某操作系统支持页式虚拟存储管理,其中央处理器的周期是1μs。当不是处于同一页面时,访问另一个页面耗时1μs。一个页面含1K字。使用磁盘作为外存,其转速为3000r/min,传输率1M字/s。还测得下列数据:磁盘平均寻道时间为19ms,1%的指令要访问不处于同一页面的其他页面内容,这当中,80%的被访问页已经在内存中。需要新页面时,50%的被换出页面已经修改过了。 请计算该系统的有效指令时间,假设系统只有一个CPU,而且它在磁盘传输数据时是空闲的。(假设逻辑相邻的页面在磁盘上都不相邻。)

答:
先计算磁盘传送1个页面的时间: 平均寻道时间+旋转延迟时间+传送时间 =19ms+10ms+lK/(1M/s) =19ms+10ms+1ms =30ms 所有指令都需要一个执行指令时间,即处理机周期1μs。1%的指令还需要访问另一个页面,需要另外耗时1μs。 其中有(1-80%)的指令不在内存中,需要从外存换入,需要另外耗时30ms。 其中有50%的情况下,被换出的页面已被修改过,需要另外耗时30ms换出,就得到下列表达式: 有效指令时间 =1μs+1%(1μs+(1-80%)(30ms+50%×30ms)) =91.01μs

9.7 考虑二维数组A:int A[][] = new int[100][100];在一个页面大小为200的分页内存系统中,[0][0]位于位置200。操作矩阵的一个小进程驻留在第0页(位置0到199)。因此,每条指令都将从第0页获取。对于三个页面帧,下面的数组初始化循环产生了多少个页面错误?使用LRU替换,并假设页面帧1包含进程,而其他两个最初是空的。在这里插入图片描述

答:a:5000 b:50(数组的两行为一个页面)

9.8 考虑下面的页面引用串

1, 2, 3, 4, 2, 1, 5, 6, 2, 1, 2, 3, 7, 6, 3, 2, 1, 2, 3, 6
在假设1、2、3、4、5、6和7帧的情况下,以下替换算法会出现多少个页面错误?请记住,所有帧最初都是空的
• LRU replacement
• FIFO replacement
• Optimal replacement
答:
Number | of | frames | LRU | FIFO | Optimal
1 | 20 | 20 | 20
2 | 18 | 18 | 15
3 | 15 | 16 | 11
4 | 10 | 14 | 8
5 | 8 |10 |7
6 | 7 |10 |7
7 | 7 | 7 | 7

9.15 线程状态的简化视图是Ready、Running和blocked,在这些视图中,线程要么就绪并等待调度,要么正在处理器上运行,要么被阻塞(例如,等待I/O)。如图所示。在这里插入图片描述假设一个线程处于运行状态,回答以下问题,并解释你的答案:

a.如果发生缺页错误,线程会改变状态吗?如果是,它会变成什么状态?
会改变状态,首先进程被陷阱中断,检查进程内部表后若为无效引用,则进程直接进入终止状态,若为有效引用,则系统请求调页后进程进入就绪态等待被处理器重启。
b.如果在页表中解决了一个TLB miss,线程会改变状态吗?如果是,它会变成什么状态?
不会改变状态,继续在访问页表
c.如果在页表中解决了队列地址引用,线程会改变状态吗?如果是这样,它会变成什么状态

9.17 什么是write -on- copy特性,在什么情况下使用它是有益的?实现这个特性需要什么样的硬件支持

答:当两个进程要访问相同的页面时,如父进程与其创建的子进程,一般的方式是直接复制该页面,而采用写时复制的方式时,在一开始两进程共享该页面,并将页面标记为写时复制,则无需在起初就复制全部页面,只有当进程向共享页面写入时,才创建该页面飞副本供进程写入,未被修改的页面依旧共享。
硬件支持:对标记为写时复制的页面进行写入保护,一旦进程对该页面发起写入,操作系统需要查看页表确认该页面是否写入保护,若是,则发起对该进程的陷阱中断,操作系统再进行对该页面的复制,让进程向页面副本写入。

9.18 某台计算机为其用户提供232字节的虚拟内存空间。这台计算机有222字节的物理内存。虚拟内存通过分页实现,页面大小为4,096字节。用户进程生成虚拟地址11123456。解释系统如何建立相应的物理位置。区分软件和硬件操作。

答:该虚拟地址的二进制共有32位,则其中高20位为虚拟地址在页表中的偏移量,低12位为虚拟地址在页面中的偏移量

9.21 考虑下面的页面引用串 7, 2, 3, 1, 2, 5, 3, 4, 6, 7, 7, 1, 0, 5, 4, 6, 2, 3, 0 , 1 假设使用三个帧进行分页,那么对于以下替换算法,会发生多少个页面错误 LRU replacement FIFO replacement Optimal replacement

答:LRU 18
FIFO 17
Optimal 13

9.22 如图所示的页表是一个包含16位虚拟地址和物理地址以及4,096字节页的系统。当页面被引用时,引用位被设置为1。线程周期性地清除引用位的所有值。页帧的破折号表示该页不在内存中。页面替换算法是本地化的LRU,所有数字都是十进制的。在这里插入图片描述

a.将以下虚拟地址(十六进制)转换为等效的物理地址。您可以提供十六进制或十进制的答案。还要为页表中条目设置正确引用位。
• 0xE12C
• 0x3A9D
• 0xA9D9
• 0x7001
• 0xACA1
b.以上述地址为指导,提供一个导致缺页错误的逻辑地址(十六进制)示例。
c.在解决缺页错误时,LRU的页面替换算法会选择哪一组页面帧
答:将15、3、10、7条目引用为设置为1
• 0xE12C ->312C
• 0x3A9D->AA9D
• 0xA9D9->59D9
• 0x7001->E001
• 0xACA1->5CA1
b、4A9D
c、会选择替换掉最近最少使用的页面帧

9.27 考虑一个请求分页系统,它具有以下时间测量的利用率在这里插入图片描述对于以下每一项,指出它是否将(或可能)提高CPU利用率。解释你的答案。

a.安装速度较快的CPU。–no
b.安装更大的分页磁盘。 --no
c.增加多道编程的度。–no
d.降低多道编程的度。–yes 减少不断调用不同分页的操作
e.增加主存。–yes,更多的也能够驻留在主存中,减少请求调页操作
f.安装较快硬盘或多控制器多硬盘。 --yes,更快的磁盘响应能够减少请求调页操作的时间
g.在取页算法中增加预处理。–yes,CPU将更快地获得更多数据,所以它将被更多地使用。只有在分页操作可以预取的情况下才会出现这种情况(即,一些访问是顺序的)。
h.增大页面大小 --不一定,因为当页面增加后,若程序是按顺序读取磁盘,那么就会减少页面调用的操作,若程序随机读取,则因为页面变大,所以和在内存驻留的页面减少,需要缺页错误也就越多。

9.30 页面替换算法应该最小化页面错误的数量。我们可以通过将大量使用的页面均匀地分布在所有内存中,而不是让它们竞争少量的页面帧来实现这一最小化。我们可以将记录与每个页面帧相关联的页面数量的计数器与该页面帧相关联。然后,要替换一个页面,我们可以搜索带有最小计数器的页面帧。

a.使用这个基本思想定义一个页面替换算法。具体解决这些问题:
1.计数器的初始值是多少? 初始值为0
2什么时候增加计数器? 当一个新页面与该页帧相关联时。
3什么时候减少计数器? 当该页帧其中一个关联页面未来不再被需要时
4要替换的页面是如何选择的? 选择计数器最小的页帧,当计数器相同时,使用FIFO
b.对于以下4个页面帧的引用字符串,在你的算法中发生了多少个页面错误? 12
1, 2, 3, 4, 5, 3, 4, 1, 6, 7, 8, 7, 8, 9, 7, 8, 9, 5, 4, 5, 4, 2

c.对于b部分中包含4个页面帧的参考字符串,最佳页面替换策略的最小页面错误数是多少? 11

9.32 系统抖动的原因是什么?系统如何检测抖动?一旦检测到抖动,系统可以做什么来消除这个问题?

答:抖动是由进程所需的最小页面数分配不足引起的,这会导致进程出现连续的缺页错误。系统可以通过评估CPU利用率水平与多道编程水平的比较来检测抖动。它可以通过降低多道程序的程度来消除。

9.33 一个流程是否可能有两个工作集,一个代表数据,另一个代表代码?解释一下。

答:是的,事实上许多处理器都为此提供了两个TLB。例如,进程访问的代码可能在很长一段时间内保持相同的工作集。然而,代码访问的数据可能会改变,因此反映了数据访问工作集中的变化。

第十章 大容量存储结构

10.1 磁盘调度(除了FCFS调度)在单用户环境中有用吗?解释你的答案。

答.在单用户环境中,I/O队列通常是空的。对于一个块或一系列连续的块,请求通常来自单个进程。在这种情况下,FCFS是一种经济的磁盘调度方法。但是,当多个进程同时执行I/O时,例如当一个web浏览器在后台检索数据,而操作系统正在分页,而另一个应用程序在前台处于活动状态时,LOOK几乎同样容易编程,并且可以提供更好的性能。

10.2 解释为什么SSTF调度倾向于选择中间的磁道,而不是最内层和最外层的磁道。

答.磁盘中心位置的磁道距离其他磁道的平均距离最小,从而使磁头移动到其他位置的时间最短

10.3 为什么在磁盘调度中通常不考虑旋转延迟?如何修改SSTF、SCAN和C-SCAN以包括延迟优化?

答.
操作系统向控制器发送的请求是以逻辑块的形式,而在现代磁盘中没有透露逻辑块的物理位置,因而操作系统无法通过判断旋转的具体位置。如果将磁盘调度算法在磁盘驱动器的控制器上用硬件实现,使控制器能够对操作系统的调度请求进行排队和调度,那么就可以优化旋转延迟

10.4 在多任务环境中,为什么在系统上的磁盘和控制器之间平衡文件系统I/O很重要?

答.系统只能以最慢瓶颈的速度运行。磁盘或磁盘控制器常常是现代系统中的瓶颈,因为它们各自的性能无法跟上CPU和系统总线的速度。通过均衡磁盘和控制器的IO,单个磁盘和控制器都不会过载,从而避免了瓶颈的产生。

10.9 除了FCFS,没有任何磁盘调度规则是真正公平的(饥饿可能发生)a.解释为什么这个断言是正确的。b.描述一种修改SCAN等算法以确保公平性的方法。c.解释为什么公平是分时系统的一个重要目标。d.给出三个或更多的例子,说明操作系统在处理I/O请求时不公平是很重要的。

a.除了FCFS其他调度算法都是抢占式的调度算法,当不断有新的靠近磁头的调度请求出现时,远离磁头的调度请求就会饥饿。b.设置一个定时器,所有超过固定时长的调度请求被安排到等待队列队首。c.分时系统要求计算机能够快速响应所有用户的请求,所以要避免某些用户的进程因为不公布导致长时间等待。d.内核的IO请求优先于用户的IO请求;高优先级进程的IO请求优先于低优先级的进程IO请求;分页和交换优先于用户IO请求

10.11 假设一个磁盘驱动器有5000个气缸,编号为0到4999。驱动器目前正在为2150汽缸的请求提供服务,而之前的请求是1805汽缸。等待请求的队列,按照FIFO的顺序是2, 069 , 1 , 212 , 2 , 296 , 2 , 800 , 544 , 1 , 618 , 356 , 1, 523 , 4, 965 , 3681 从当前头部位置开始,对于下面的每个磁盘调度算法,磁盘臂为满足所有未决请求所移动的总距离(以磁道为单位)是多少

a. FCFS
b. SSTF
c. SCAN
d. LOOK
e. C-SCAN
f. C-LOOK
答.分别是13011 、7586、7492、9205、7424、9137

第十一章

11.2 为什么一些系统跟踪文件的类型,而另一些则将其留给用户,而另一些则不实现多种文件类型?哪个系统“更好”?

答:跟踪文件类型的系统,会基于文件的不同类型会其进行文件操作,而不跟踪文件类型的系统,将对文件数据进行解释的操作留给进程,两种系统都能适应于不同的需求,比如在处理多种数据类型时,最好让不同的进程来解释数据,而在单一数据处理时,如在大型数据库系统,只需让操作系统实现对数据库文件的数据解释即可,无需在每个进程重复代码。

11.4 您能否用可以使用任意长名称的单层目录结构来模拟多层目录结构?如果答案是肯定的,请解释如何做到这一点,并将此方案与多级目录方案进行对比。如果你的答案是否定的,请解释是什么阻碍了你的模拟成功。如果文件名被限制为7个字符,你的答案会发生什么变化?

答:当任意长的字符作为文件名来模拟多层目录结构是可行的,只需要用特殊字符表示不同的层级关系,如A/b/1.png表示1.png位于b目录中,b又位于A根目录中,当限定了字符串长度时,则不可直接用文件名称来模拟,而需要专门对层级关系进行记录,在访问文件时查找记录来得到层级关系。

11.5 解释open()和close()操作的目的。

答:open()操作通知系统指定的文件即将被激活。close()操作通知系统指定的文件不再被发出close操作的用户活跃使用

11.6 在某些系统中,子目录可以由授权用户读写,就像普通文件一样。

a.描述可能出现的保护问题。
b.提出解决这些保护问题的方案。
答:a.保存在目录条目中的一条信息是文件位置。如果用户可以修改这个位置,那么他就可以访问其他文件,从而破解访问保护方案。b.禁止用户直接写入子目录,由系统操作来写入。

11.10 打开文件表用于维护关于当前打开文件的信息。操作系统应该为每个用户维护一个单独的表,还是只维护一个包含当前所有用户访问的文件的引用的表?如果同一个文件被两个不同的程序或用户访问,那么open-file表中应该有单独的条目吗?解释一下。

答:只维护一个包含所有用户访问文件的表。当首次访问某文件时,将其添加在打开文件表中,后面的进程在访问该文件时通过表中条目指定文件。同样只有在所有进程都不在使用改文件时才将其从系统文件表中删除。另一方面,如果两个进程正在访问该文件,则需要维护单独的状态,以跟踪两个进程正在访问文件的哪些部分的当前位置。这需要操作系统为两个进程维护单独的条目

11.11 提供强制锁而不是由用户自行决定使用的建议锁的优点和缺点是什么?

答:操作系统强制阻止其他进程访问已加锁的文件,能够最大限度的保证互斥,而在许多情况下,不需要如此严格的方法保证互斥,降低了系统的并行性。可以通过其他程序结构来保证互斥,比如内存锁。而且强制锁将限制访问文件的灵活性,还可能导致死锁,并可能增加与访问文件相关的开销。

11.12 提供典型的应用程序的例子,根据以下方法访问文件:

•顺序访问
•随机访问
答:顺序访问:编辑器和编译器; 随机访问:大型数据库计算

11.15 给出一个应用程序的例子,该应用程序可以受益于操作系统对索引文件的随机访问。

答:维护条目数据库的应用程序可以从这种支持中受益。例如,如果一个程序正在维护一个学生数据库,那么对数据库的访问就不能用任何预先确定的访问模式来建模。对记录的访问是随机的,如果操作系统提供某种形式的基于树的索引,那么定位记录将更加有效。

11.17 有些系统通过维护一个文件的单一副本来提供文件共享。其他系统维护多个副本,每个共享文件的用户都有一个副本。讨论每种方法的相对优点。

答:对于单个副本,对一个文件的多个并发更新可能会导致用户获取不正确的信息,并使文件处于不正确的状态。如果有多个副本,就会产生存储浪费,而且多个副本之间可能不一致。

第十二章

12.2 如果一个系统允许在多个位置同时挂载一个文件系统,会发生什么问题?

答:导致相同的文件会有不同的文件路径,会导致一致性问题

12.3 为什么文件分配的位图必须保存在大容量存储中,而不是在主存中?

答:当位图存储在主存中,如系统崩溃,则位图会丢失,而存储在大容量存储设备上时,位图不会丢失

12.4 考虑一个支持连续、链接和索引分配策略的系统。在决定哪种策略最适合特定文件时,应该使用什么标准?

答:当文件较小且常被顺序访问时,可采用连续分配策略,当文件较大且常被连续访问时,可采用索引分配的策略,当文件较大且常被随机访问时可采用索引分配策略

12.6 缓存如何帮助提高性能?既然缓存如此有用,为什么系统不使用更多或更大的缓存呢?

答:缓存可以进行高速数据交换,由局部性原理实现将经常使用的数据读取到缓存中,提高将数据从低速存储设备传输到高速计算设备的效率,然而缓存的成本十分昂贵。

12.7 为什么操作系统动态分配内部表对用户有利?操作系统这样做的惩罚是什么?

答:动态分配内部表使得用户不会使用超过内部表的大小,提高了灵活性。然而动态改变内部表会增加内核结构的复杂性,使操作系统变得更复杂,增大开销。

12.9 考虑一个文件系统,它使用修改后的连续分配模式,并支持区段。文件是区段的集合,每个区段对应于一组连续的块。在这样的系统中一个关键问题是区段大小的可变性程度。以下方案的优缺点是什么:

a.所有区段的大小是相同的,大小是预先确定的。
b.区段可以是任意大小的,并且是动态分配的。
c.区段可以有几个固定的大小,这些大小是预先确定的。
答:对于区段大小相同的方案,则其为简化后的连续分配,使用较小的空闲空间列表,结构简单,灵活性低。对于区段大小自由的方案,可根据文件大小调整区段大小,同时存在外部碎片的可能,需要更复杂的结构来实现动态的区段,但是可以提高分配的灵活性,复杂度较大。对于最后一种,不同大小的区段需要不同的空闲空间列表,复杂度和灵活性介于ab之间。

12.10 对比为顺序和随机文件访问分配磁盘块(连续、链接和索引)的三种技术的性能。

答:连续分配对于两种访问方式都只需访问一次即可获得磁盘块;链接分配可以在内存中保留下一块的地址,实现顺序访问,而在随机访问时,若要访问第i块,则需访问i次磁盘访问性能较差。而在索引分配时,若索引块在内存中,则可直接访问,若由多级索引结构,则在访问文件末尾的块时,需要读取所有的索引块,其性能取决于索引的结构。

12.12 考虑这样一个系统,空闲空间保存在空闲空间列表中。

a.假设指向空闲列表的指针丢失。系统能否重建空闲空间列表?解释你的答案。
b.考虑一个类似于UNIX使用索引分配的文件系统。在/a/b/c读取一个小的本地文件的内容可能需要多少磁盘I/O操作?假设当前没有磁盘块被缓存。
c.提出一个方案,确保指针不会因为内存故障而丢失。
答:a要重建空闲空间列表,需要遍历目录结构,确定磁盘空间中未被文件或目录使用的空间,将其链接在空闲空间列表中。b c
为了重建空闲列表,需要执行“垃圾收集”。这将需要搜索整个目录结构,以确定哪些页面已经分配给了作业。那些剩余未分配的页可以作为空闲空间列表重新链接。

12.14 讨论在计算机崩溃的情况下,对文件系统的性能优化如何导致难以维护系统的一致性。

答:当采用延迟更新来优化系统性能,如果系统在没有提交延迟更新的情况下崩溃,那么文件系统的一致性就会被破坏。

第十三章 I/O系统

13.1 说明将功能放置在设备控制器而不是内核中的三个优点。说明三个缺点。

答:优点:1.设备出现问题不会导致系统崩溃 2.使用专用的硬件和硬编码算法可以提高性能 3.将控制设备的算法移出内核,简化内核大小 缺点: 1.新的固件版本更难修复bug,需要新的硬件 2.改进算法同样需要更新硬件,使得迭代更加繁琐 3.嵌入的算法可能与应用程序使用的设备冲突,导致性能下降。

13.3 为什么系统会使用中断机制来管理单个串口,使用轮询机制来管理前端处理器(如终端集中器)?

答:对于I/O操作频繁且实践短的情况,采用轮询机制比中断更高效和简单,适合于处理集中串口;而中断机制适合于操作不频繁且时间长的I/O请求,这种情况使用轮询机制会降低处理器的效率,因此单个串口采用中断机制。

13.8当来自不同设备的多个中断几乎同时出现时,可以使用优先级方案来确定处理这些中断的顺序。讨论在为不同中断分配优先级时需要考虑哪些问题。

答:1.设备中断的优先级要大于用户程序的陷阱中断 2.设备中断优先级应大于简单任务的中断优先级,将不急迫的中断放在之后执行 3.对数据处理时间有实时限制的设备应该比其他设备拥有更高的优先级 4.也要避免部分设备中断被饿死的情况

13.9 支持内存映射I/O到设备控制寄存器的优点和缺点是什么?

答:优点:通过标准数据传输指令读写映射到物理内存的设备控制器,消除了对特殊I/O指令的需要。缺点是其产生的灵活性会带来潜在的危险,内存转换单元需要确保与设备控制寄存器相关联的内存地址不能被用户程序访问。

13.11 在大多数多程序系统中,用户程序通过虚拟地址访问内存,而操作系统使用原始物理地址访问内存。对于用户程序发起I/O操作以及操作系统执行这些操作,这种设计意味着什么?

答:用户程序通常指定一个缓冲区,用于向设备进行数据传输。这个缓冲区存在于用户空间中,由一个虚拟地址指定。内核需要发出I/O操作,需要在I/O操作之前或之后在用户缓冲区和自己的内核缓冲区之间复制数据。为了访问用户缓冲区,内核需要在用户程序的虚拟地址空间上下文中将用户程序提供的虚拟地址转换为相应的物理地址。这种转换通常在软件中执行,因此会产生开销。此外,如果用户缓冲区当前不在物理内存中,则需要从交换空间中获取相应的页。此操作可能需要谨慎处理,并可能延迟数据复制操作。

13.12 与服务中断相关的各种性能开销有哪些?

答:当中断发生时,当前正在执行的进程被中断,它的状态被存储在适当的进程控制块中。为了处理中断,中断服务程序随后被调度。在中断处理完成后,进程的状态被恢复。因此,性能开销包括保存和恢复进程状态的成本,以及在进程重新启动时刷新指令管道并将指令恢复到管道中的成本。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/s2765504026/article/details/123389522

智能推荐

linux配置的jmeter环境变量_linux配置jmeter环境变量-程序员宅基地

在CentOS 7系统中配置非root用户的jmeter环境变量,通过编辑.bash_profile文件并添加export JMET命令来配置。确保配置生效后,可通过java -version命令查看java版本信息。参考链接:知乎和程序员宅基地。

L2-039 清点代码库 - java_l2-039 清点代码库 java-程序员宅基地

文章浏览阅读7.6k次。L2-039 清点代码库 (25 分)Java (javac)时间限制1500 ms内存限制128 MBPython (python3)时间限制1500 ms内存限制64 MB其他编译器时间限制500 ms内存限制64 MB上图转自新浪微博:“阿里代码库有几亿行代码,但其中有很多功能重复的代码,比如单单快排就被重写了几百遍。请设计一个程序,能够将代码库中所有功能重复的代码找出。各位大佬有啥想法,我当时就懵了,然后就挂了。。。”这里我们把问题简化一下:首先假设两个功能模_l2-039 清点代码库 java

PTA:完全二叉搜索树 (25 分)_完全二叉搜索树 分数 10 作者 陈越 单位 浙江大学 一个无重复的非负整数序列,必定-程序员宅基地

文章浏览阅读922次,点赞2次,收藏6次。题目详情:一个无重复的非负整数序列,必定对应唯一的一棵形状为完全二叉树的二叉搜索树。本题就要求你输出这棵树的层序遍历序列。输入格式:首先第一行给出一个正整数N(≤1000),随后第二行给出N个不重复的非负整数。数字间以空格分隔,所有数字不超过 2000。输出格式:在一行中输出这棵树的层序遍历序列。数字间以 1 个空格分隔,行首尾不得有多余空格。输入样例:101 2 3 4 5 6 7 8 9 0结尾无空行输出样例:6 3 8 1 5 7 9 0 2 4..._完全二叉搜索树 分数 10 作者 陈越 单位 浙江大学 一个无重复的非负整数序列,必定

[2020.8.3]联想 ZUK Z1 Magisk ROOT 纯净无推广 一键刷机 ZUI_-程序员宅基地

文章浏览阅读72次。教程本刷机包比一般的大,是因为同时适配recovery卡刷和酷卓一键刷机。但是刷进系统后和普通刷机包都是一样的。注意事项(务必细读) 联想 ZUK Z1 免解锁BL(bootloader),一键ROOT是保资料的,刷机是会清空数据的(无论如何都请备份重要数据)卡刷方法卡刷需要已经安装了twrp recovery,直接传入手机后用twrp recovery刷机,和普通刷机包使用无区别..._zukz1被root了怎么办

数据结构与算法分析 3.26 — 双端队列的实现-程序员宅基地

文章浏览阅读590次。一、题目 编写支持双端队列的例程,插入与弹出操作均花费 O(1)时间二、解答 双端队列(deque,全名double-ended queue)是一种具有队列和栈性质的数据结构。 双端队列中的元素可以从两端弹出,插入和删除操作限定在队列的两边进行。 基本操作:在双端队列两端插入与删除。 ADT术语: ..._编写算法实现双端队列。数据结构分析

centos7安装clion_clion centos-程序员宅基地

文章浏览阅读4.2k次。centos7安装clion下载clion的linux包。上传到linux服务器下。scp -P 20211 E:\迅雷下载\cmake-3.14.3.tar.gz 用户名@服务器地址:/home/bob/解压并到解压的文件夹bin目录下。运行命令“./clion.sh”。(需在centos7图形界面模式下才能启动clion)启动之后还不能运行c语言程序,我们还需要安装gcc、..._clion centos

随便推点

multi-head attention 是什么-程序员宅基地

文章浏览阅读382次。Multi-head attention 是一种在深度学习中的注意力机制。它在处理序列数据时,通过对不同位置的特征进行加权,来决定该位置特征的重要性。Multi-head attention 允许模型分别对不同的部分进行注意力,从而获得更多的表示能力。这在自然语言处理中,特别是在处理长文本时,可以显著提高模型性能。..._multi-head attention是什么

linux上修改php.ini配置添加扩展时不生效_php.ini加入了extension 不生效-程序员宅基地

文章浏览阅读2.1k次。因初次编译安装php时没有开启openssl, 导致请求https网站报错, 为此需要手动编译openssl扩展然后添加到php.ini中. 问题就在自己明明已经编译安装生成openssl.so的步骤都没有错, 也已经将extension=openssl.so加入php.ini中,服务器也重启了, 但是无论是访问phpinfo()打印的出内容还是直接命令行php -m打印加载的模块都没有显示有加载..._php.ini加入了extension 不生效

linux中如何建立连接文件_linux建立文件链接-程序员宅基地

文章浏览阅读8.1k次。这是linux中一个非常重要命令,请大家一定要熟悉。它的功能是为某一个文件在另外一个位置建立一个同不的链接,这个命令最常用的参数是-s,具体用法是:ln -s 源文件 目标文件。当 我们需要在不同的目录,用到相同的文件时,我们不需要在每一个需要的目录下都放一个必须相同的文件,我们只要在某个固定的目录,放上该文件,然后在其它的 目录下用ln命令链接(link)它就可以,不必重复的占用磁盘空间..._linux建立文件链接

Kafka在Windows安装运行_kafak windows版-程序员宅基地

文章浏览阅读5.2w次,点赞27次,收藏102次。摘要:本文主要说明了如何在Windows安装运行Kafka_kafak windows版

formatter是什么?-程序员宅基地

文章浏览阅读4.3k次,点赞2次,收藏11次。element里面表格的一个属性 formatter 叫格式化内容的_formatter

(MIT6.828) 1.实验环境搭建_mit6.828实验是否能在虚拟机上完成-程序员宅基地

文章浏览阅读897次。(MIT6.828) 1.实验环境搭建参考官网:https://pdos.csail.mit.edu/6.828/2018/tools.html在ubuntu14中安装x86模拟器QEMU.1. 检查工具链objdump -i会看到elf32-i386等信息gcc -m32 -print-libgcc-file-name会看到/usr/lib/gcc/i486-linux-gnu..._mit6.828实验是否能在虚拟机上完成

推荐文章

热门文章

相关标签