山东大学操作系统课后作业1-7章

第一章

1.1在多道程序和分时环境中,多个用户同时共享一个系统,这种情况导致多种安全问题。a.列出此类的问题b.在一个分时机器中,能否确保像在专用机器上一样的安全度?并解释之。

a.窃取或者复制某用户的程序或数据;没有合理的预算来使用资源(CPU,内存,磁盘空间,外围设备)

b.应该不行,因为人类设计的任何保护机制都会不可避免的被另外的人所破译,而且很自信的认为程序本身的实现是正确的是一件困难的事。

 

1.10中断(interupt)的目的是什么?陷阱(trap)与中断的区别是什么?陷阱可以被用户程序(user program)有意地的产生吗?如果可以,那目的是什么?

事件的发生通常是通过硬件或软件中断来表示。中断是一种在系统内硬件产生的流量变化。

中断操作装置是用来处理中断请求;然后返回控制中断的上下文和指令。

陷阱是软件产生的中断。中断是硬件产生的中断。前者是从应用端进入操作系统,后者是从硬件端进入操作系统。

陷阱可以通过人为的调用,用来调用操作系统的程序或者捕捉到算术错误。

 

1.12一些计算机系统没有在硬件中提供特权模式(privileged mode)。对于这种计算机系统来说,可能构成安全的操作系统吗?对可能和不可能两种情况分别给出理由。

一种类型处理器的操作系统需要在任何时候都被控制(或监测模式)。

有两种方法可以完成这个操作:

a.所有用户程序的软件翻译(像一些BASIC,Java,LISPsystems)。在软件中,软件解释程序能够提供硬件所不能提供的。

b.要求所有程序都用高级语言编写,以便于所以目标代码都被编译出来。编译器将会产生硬件忽略的防护性检查(in-line或功能调用)。

 

1.17列出下列操作系统的基本特点:

a.批处理:具有相似需求的作业被成批的集合起来,并把它们作为一个整体通过一个操作员或自动作业程序装置运行通过计算机。通过缓冲区,线下操作,后台和多道程序,运用尝试保持CPU和I/O一直繁忙,从而使得性能被提高。批处理系统对于运行那些需要较少互动的大型作业十分适用。它们可以被更迟的提交或获得。

b.交互式:这种系统由许多短期交易构成,并且下一个交易的结果是无法预知的。从用户提交到等待结果的响应时间应该是比较短的,通常为1秒左右。

c.分时:这种系统使用CPU调度和多道程序来经济的提供一个系统的人机通信功能。CPU从一个用户快速切换到另一个用户。以每个程序从终端机中读取它的下一个控制卡,并且把输出的信息正确快速的输出到显示器上来替代用soopled card images定义的作业。

d.实时:经常用于专门的用途。这个系统从感应器上读取数据,而且必须在严格的时间内做出响应以保证正确的性能。

e.网络:提供给操作系统一个特征,使得其进入网络,比如;文件共享。 f.并行式:每一个处理器都运行同一个操作系统的拷贝。这些拷贝通过系统总线进行通信。

g.分布式:这种系统在几个物理处理器中分布式计算,处理器不共享内存或时钟。每个处理器都有它各自的本地存储器。它们通过各种通信线路在进行通信,比如:一条高速的总线或一个本地的网络。

h.集群式:集群系统是由多个计算机耦合成单一系统并分布于整个集群来完成计算任务。

i.手持式:一种可以完成像记事本,email和网页浏览等简单任务的小型计算机系统。手持系统与传统的台式机的区别是更小的内存和屏幕以及更慢的处理能力。

第二章

2.1操作系统提供的服务和功能可以分为两个类别。简单的描述一下这两个类别并讨论他们的不同点。

第一种操作系统提供的服务是用来提供对用户很有用的函数。如用户界面,程序执行,I/O操作,文件系统操作,通信,错误检查等等。

第二种由操作系统提供的服务不是帮助用户而是确保系统本身高效运行。多用户系统通过共享计算机资源可以提高效率。如资源分配,统计,保护和安全。这种服务可以保护在系统中同时运行的不同进程。进程只被允许获得与它们地址空间有联系的内存位置。同样,进程不允许破坏和其他用户有关的文件。一个进程同样不允许在没有操作系统的干预下直接进入设备。

 

2.3讨论向操作系统传递参数的三个主要的方法。

1.通过寄存器来传递参数。最简单的方法。

2.寄存器传递参数块的首地址。当参数数量比寄存器数量多时。

3.参数通过程序存放或压进堆栈中,并通过操作系统弹出堆栈。不限制所传递的参数的数量或长度。

 

2.4描述你怎样能够统计到一个程序运行其不同部分代码时,它的时间花费数量的数据图表,并说明它的重要性。

许多操作系统都提供程序的时间表,以表示一个程序在某个位置或某些位置执行所花的时间。时间表要求具有跟踪功能或定时时间中断。在每次出现定时中断时,会记录程序计数器的值。如果有足够频繁的时间中断,就可得到程序各部分所用时间的统计数据。

一个满意的配置文件,其中的代码块都应积极覆着被程序在代码的不同的部分花费时间。一旦这个配置文件被获得,程序员可以尽可能的优化那些消耗大量CPU资源的代码段。

 

2.12采用微内核方法来设计系统的主要优点是什么?在微内核中如何使客户程序和系统服务相互作用?微内核方法的缺点是什么?

优点:1.便于扩充操作系统。所有的新服务可以在用户空间增加,因为并不需要修改内核。当内核确实需要修改时,所做的改变也会很小,因为微内核本身很小。

2.采用微内核的操作系统很容易从一种硬件平台设计移植到另一种硬件平台设计。

3.提供了更好的安全性和可靠性。因为绝大多数的服务是作为用户而不是作为内核进程来运行的,如果一个服务器出错,那么操作系统其他部分并不受影响。

如何:用户程序和系统服务通过微内核的消息传递来通信。

缺点:系统功能总开销的增加而导致系统性能的下降。与进程间通信的过度联系和为了保证用户程序和系统服务相互作用而频繁使用操作系统的消息传递功能。

 

2.14操作系统设计员采用虚拟机结构的主要优点是什么?对用户来说主要有什么好处?

操作系统设计员:1.安全。每个虚拟机完全独立于其他虚拟机,因此没有安全问题,但同时也没有直接资源共享。

2.操作系统运行并控制整个机器,因此必须停止当前系统,暂停其使用以便进行改变和测试。这个周期称为系统开发时间,该时间内系统不能被用户使用。但虚拟机系统可能基本取消这个问题。系统程序有自己的虚拟机,系统开发刻在虚拟机而不是真正的物理机器上进行,正常系统操作无需进行中断来开发系统。

用户:用户拥有自己的虚拟机后,他们能运行原来机器所具有的任何操作系统或软件包。

 

第三章

3.1论述短期,中期和长期调度之间的区别。

短期调度(CPU调度程序):在内存作业中选择就绪执行的作业,并为他们分配CPU。

中期调度:作为一种中等程度的调度程序,尤其被用于分时系统,其核心思想是能将进程从内存(或从CPU竞争)中移出,从而降低多道程序设计的程度。之后,进程能被重新调入内存,并从中断出继续执行。

长期调度(作业调度程序):确定哪些作业调入内存以执行.

它们主要的不同之处是它们的执行的频率。短期调度必须经常调用一个新进程,一般而言至少每100ms就要至少执行一次。由于在系统中,长期调度处理移动的作业时,并不频繁被调用,可能在进程离开系统时才被唤起,可能有数分钟间隔。

 

3.2描述一下内核在两个进程间进行上下文功换的动作。

将CPU切换到另一个进程需要保存当前进程的状态并恢复另一个进程的状态,这一任务称为上下文切换。进程上下文是由进程的PCB来表示的,它包括CPU寄存器的值,进程状态和内存管理信息等。

当发生上下文切换时,内核会将旧进程的状态保存在其PCB中,然后装入经调度要执行的新进程的已保存的新进程的上下文。

 

3.4使用图3.24所示的程序,说明LINE A可能输出什么。

输出:PARENT:value=5

父进程中value初始值为5,,value+=15发生在子进程,输出发生在父进程中,故输出value的值为5。

 

3.5下面设计的优点和缺点分别是什么?系统层次和用户层次都要考虑。

a.同步和异步通信:同步通信要求接收时钟和发送时钟同频同相,通过特定的时钟线路协调时序,传输效率高。异步通信不要求接收时钟和发送时钟完全同步,对时序的要求较低,传输效率低。同步通信的影响是它允许发送者和接收者之间有一个集合点。缺点是阻塞发送时,不需要集合点,而消息不能异步传递。因此,消息传递系统,往往提供两种形式的同步。

 

b.自动和显式缓冲:自动缓冲提供了一个无限长度的队列,从而保证了发送者在复制消息时不会遇到阻塞,如何提供自动缓存的规范,一个方案也许能保存足够大的内存,但许多内存被浪费缓存明确指定缓冲区的大小。在这种状况下,发送者不能在等待可用空间队列中被阻塞。然而,缓冲明确的内存不太可能被浪费。

c.复制发送和引用发送:复制发送不允许接收者改变参数的状态,引用发送是允许的。引用发送允许的优点之一是它允许程序员写一个分布式版本的一个集中的应用程序。

d.固定大小和可变大小信息:一个拥有具体规模的缓冲可容纳及已知数量的信息缓冲能容纳的可变信息数量是未知的。信息从发送者的地址空间被复制至接受进程的地址空间。更大的信息可使用共享内存传递信息。

 

第四章

4.1举两个多线程程序设计的例子来说明多线程不比单线程方案提高性能

1.任何形式的顺序程序对线程来说都不是一个好的形式。例如一个计算个人报酬的程序。

2.另外一个例子是一个“空壳”程序,如C-shell和kornshell。这种程序必须密切检测其本身的工作空间。如打开的文件、环境变量和当前工作目录。

 

4.2描述一下线程池采取行动进行用户级线程上下文切换的过程

答:用户线程之间的上下文切换和内核线程之间的相互转换是非常相似的。但它依赖于线程池和怎样把用户线程指给内核程序。一般来说,用户线程之间的上下文切换涉及到用一个用户程序的轻量级进程(LWP)和用另外一个线程来代替。这种行为通常涉及到寄存器的节约和释放。

 

4.4以下程序中的哪些组成部分在多线程程序中是被线程共享的?

a.寄存值b.堆内存c.全局变量d.栈内存

一个线程程序的线程共享堆内存和全局变量,但每个线程都有属于自己的一组寄存值和栈内存。

共享:代码段,数据段和其他操作系统资源,如打开文件和信号。

不共享:寄存器,栈内存。

 

第五章 

5.1为什么对调度来说,区分I/0限制的程序和CPU限制的程序是重要的?

I/0约束程序通常具有很多短CPU区间,不会使用很多的CPU。CPU约束程序可能有少量的长CPU区间,不做任何阻碍I/O操作的工作。有助于选择合适的CPU调度算法,可以很好的利用计算机资源。

 

5.2讨论以下各对调度标准在什么情况下会有冲突?

a.CPU利用率和响应时间:上下文切换会降低CPU的利用率,但会减少程序的响应时间。

b.平均周转时间和最大等待时间:通过最先执行最短作业优先调度(SJF)可以使平均周转时间最短。然而,这种调度策略可能会使需要长时间运行的任务永远得不到调度且会增加他们的等待时间。

c.I/O设备利用率和CPU利用率:CPU利用率的最大化可以通过长时间运行CPU限制的任务和同时不实行上下文切换。I/O设备利用率的最大化可以通过尽可能调度已经准备好的I/O限制的任务。因此,频繁的上下文切换会降低CPU利用率但是回提高I/O设备的利用率。

 

5.4考虑下列进程集,进程占用的CPU区间长度以毫秒来计算:

进程             区间时间          优先级

P1                10                3

P2                 1                 1

P3                 2                 3

P4                 1                 4

P5                 5                 2

假设在时刻0以进程P1,P2,P3,P4,P5的顺序到达。  

a.画出4个Gantt图分别演示用FCFS、SJF、非抢占优先级(数字小代表优先级高)和RR(时间片=1)算法调度时进程的执行过程。

b.在a里每个进程在每种调度算法下的周转时间是多少? 

c.在a里每个进程在每种调度算法下的等待时间是多少? 

d.在a里哪一种调度算法的平均等待时间对所有进程而言最小?

山东大学操作系统课后作业1-7章

SJF算法平均等待时间最短

5.5下面哪些算法会引起饥饿 

a.先到先服务 b.最短工作优先调度 c.轮换法调度 d.优先级调度

最短工作优先调度和优先级调度算法会引起饥饿,因为这两个会使CPU区间相当长的进程和优先级相当低的进程很长一段时间内都不会被执行。

 

5.10解释下面调度算法对短进程偏好程度上的区别:

a.FCFS     b.RR    c.多级反馈队列 

FCFS区别短任务是因为任何在长任务后到达的短任务都将会有很长的等待时间。

RR对所有的任务都是能够相同的(给它们相同的CPU时间区间),所以短任务可以很快的离开系统,只要它们可以先完成。

多级反馈队列和RR调度算法相似,它们不会先选择短任务。

 

第六章

6.3忙等待的含义是什么?在操作系统中还有哪些其他形式的等待?忙等待能完全避免吗?给出你的答案。

忙等待是指当一个进程位于其临界区内时,任何其他试图进入其临界区的进程都必须再起进入代码中连续的循环。忙等待浪费了CPU时钟,这本来是可以有效的位其他进程所使用。

其他类型的等待:与忙等待需要占用处理器不同,另外一种等待则允许放弃处理器。进程阻塞自己并且等待在合适的时间被唤醒。

不能完全取消忙等。可以采用更为有效的办法来避免因忙等待而带来的CPU资源浪费。

(1)如:执行请求(类似于中断)。P1通过操作系统先向设备请求,然后操作系统转去执行其它任务。当设备完成请求时再通过中断通知操作系统,操作系统再重新唤醒P1。这样系统中可以同时存在多个未完成的任务。

(2)采用PV信号量,当进程执行wait操作时,若信号量不为正则阻塞自己。阻塞操作将一个进程放入到于信号量相关的等待队列中,且该进程的状态被切换成等待状态。若需要重新执行,则通过wakeup操作把进程从等待状态切换到就绪状态,从而放入就绪队列。但这样只是取消了应用程序进入临界区的忙等,并没有完全取消忙等。

 

 

6.4解释为什么自旋锁不适合在单处理器系统,而经常在多处理器系统下使用?

自旋锁有其自身的优点,进程在等待锁时不进行上下文切换,而上下文切换可能需要花费相当长的时间。因此,如果锁的占用时间短,那么自旋锁就有用了。自旋锁常用于多处理器系统中,这样一个线程在一个处理器自旋时,另一线程刻在另一处理器上在其临界区执行。在单处理器系统上会造成忙等待,浪费CPU时针。

 

6.5如果一个同步元是在一个用户级程序中使用的,解释在一个单处理器系统中为什么通过停止中断去实现这个同步元是不适合的?

答:如果一个用户级程序具有停止中断的能力,那么它能够停止计时器中断,防止上下文切换的发生,从而允许它使用处理器而不让其他进程执行。

 

6.9证明如果wait()和signal()操作不是原子化操作,那么互斥可能是不稳定的。

原子操作的定义是不可中断的一个或一系列操作,就是该操作绝不会在执行完毕前被任何其他任务或事件打断,也就是说,它是最小的执行单位,不可能有比它更小的执行单位。如果wait()和signal( )操作不是原子化操作,那么互斥锁(二进制信号量)就有可能在进程执行中被修改,那么互斥就会变得不稳定。

 

6.10试采用TestAndSet指令,实现用于多处理器环境的信号量的wait()和signal()操作。该实现应具有最小忙等待。

int guard = 0;

int semaphore value = 0;

wait()

{

while (TestAndSet(&guard) == 1);

if (semaphore value == 0) {

//自动添加到等待信号量的队列中

guard = 0;

}

else {

semaphore value--;

guard = 0;

}

}

 

signal()

{

while (TestAndSet(&guard) == 1);

if (semaphore value == 0 &&等待队列中有进程)

唤醒并且执行队列中第一个进程

guard =0;

else{

semaphore value++;

guard = 0;

}

}

 

6.11理发店问题。一家理发店有一间有n把椅子的等待室和一间有一把理发椅的理发室。如果没有顾客,理发师就去睡觉。如果顾客来时所有的椅子都有人,那么顾客将会离去。如果理发师在忙,而又有空闲的椅子,那么顾客会坐在其中一个空闲的椅子上。如果理发师在睡觉,顾客会摇醒他。编写一个程序来协调理发师和顾客。

理发师进程和顾客进程共享以下数据结构:

  Semaphore mutex =1,barber =1,cutomers =0;

   int  waiting =n;

理发师:

do while(1){

      wait(cutomers); //如果没有顾客,理发师睡觉

      wait(mutex);   //进入临界区

      freeChair++;   //临界区,空位多了一个

      signal(mutex);   //离开临界区

      signal(barber);  //理发师去为一个顾客理发

      cut-hair();     //正在理发

}

 顾客

do while(1) {

      wait(mutex);  //进入临界区

      if(freeChair >0) {

              freeChair--  //临界区,空位少一个

              signal(mutex);    //离开临界区

              signal(customers); //声明有顾客,唤醒理发师

              wait(barber);   //理发师没有空闲,顾客等待

              get-haircut(); //理发

      }

      else {

              signal(mutex);  //当前等待顾客人数已满,新来的顾客离开

      }

}

 

第七章

7.1假设有如图7.1所示的交通死锁。

a. 证明这个例子中实际上包括了死锁的四个必要条件。

b. 给出一个简单的规则用来在这个系统中避免死锁。

a. 死锁的四个必要条件: (1)互斥;(2)占有并等待;(3)非抢占;(4)循环等待。

互斥的条件是只有一辆车占据道路上的一个空间位置。占有并等待表示一辆车占据道路上的位置并且等待前进。非抢占就是一辆车不能从道路上当前的位置移动开。最后就是循环等待,因为每个车正等待着随后的汽车向前发展。循环等待的条件也很容易从图形中观察到。

b. 一个简单的避免这种的交通死锁的规则是,汽车不得进入一个十字路口如果明确地规 定,这样就不会产生相交。  ??设置红绿灯

 

7.2当哲学家一次只拿一只筷子时,哲学家就餐问题会出现死锁。请讨论这种情况下的四个死锁必要条件确实存在,并讨论如何通过取消四个中的一个必要条件来避免死锁。

死锁的四个必要条件:(1)互斥;(2)占有并等待;(3)非抢占;(4)循环等待。

互斥:筷子一次只能在一个哲学家手里。占有并等待:每个哲学家都占有一根筷子,并且等待另外一根筷子。非抢占:哲学家不能抢走其他哲学家的筷子。循环等待:每个哲学家都在等待另一个哲学家手中的筷子。

解决方法:(1)允许同时分享筷子(2)如果有哲学家无法获得其他筷子,则放弃第一根筷子(3)如果筷子已经被一位哲学家了占有了很长一段时间,允许筷子被强行拿走(4)实施编号筷子,总是获得较低编号的筷子,之后才能获得较高的编号的筷子。这样就能打破循环。

 

7.6假设系统中有四个相同类型的资源被三个进程共享。每个进程最多需要两个资源。证明这个系统不会死锁。

由题意易得,三个进程中必定至少存在一个进程可以满足其资源条件。例如112分配,这样就不会符合占有并等待的特性。因为必定会有至少一个进程可以获得其所需的全部资源,即该系统时刻都处于安全状态,也就不会发生死锁。

 

7.7假设一个系统有m个资源被n个进程共享,进程每次只请求和释放一个资源。证明只要系统符合下面两个条件,就不会发生死锁:

a.每个进程需要资源的最大值在1到m之间

b.所有进程需要资源的最大值的和小于m+n

 

 

7.11 考虑下面的一个系统在某一时刻的状态。

Allocation              Max               Available

         A B C D               A B C D              A B C D

P0        00 1 2                0 0 1 2               1 5 2 0

P1        10 0 0                1 7 5 0

P2        13 5 4                2 3 5 6

P3        06 3 2                0 6 5 2

P4        00 1 4                0 6 5 6

a.Need矩阵的内容是怎样的?

b.系统是否处于安全状态?

c.如果从进程P1发出一个请求(0 4 2 0),这个请求能否被满足?

 

a.      A BC D

   P0   00 0 0

   P1   07 5 0

   P2   10 0 2

   P3   00 2 0

   P4   06 4 2

b.系统处于安全状态。目前的状态,P0和P3都可以继续运行,并且在运行完之后释放自己之前所占有的资源。使得其他程序继续运行。

c. 可以被满足,满足以后,Available矩阵等于(1 1 0 0),当以次序P0,P2,P3, P1 ,P4运行时候,可以完成运行。