设备管理
5.对磁盘存在如下5个请求,假如当前磁头位于1号柱面,试分析对这5个请求如何调度可使得磁盘的旋转圈数最少?
答:按照次序5、3、2、1、4进行调度可使磁盘的旋转圈数最少。平均用1/2周定位,再加上1/4周读出记录,总处理时间=1/2+1/4+1/2+1/4+1+1/2+1/4+1=4.25圈。
7.假定一个磁盘有200个柱面,编号为0一199,在完成了磁道125外的请求后,当前正在磁道143处为一个请求服务。若请求队列的先后顺序为86,147,91,177,94,1 50,102,175,130;试问:为了完成上述请求,下列算法存取臂所以移动的总量是多少?并计算存取臂移动的顺序。(1)FCFS(先来先服务);(2)SSTF(最短寻道时间优先);(3)SCAN(扫描)算法;(4)电梯调度算法。
(1)FCFS(先来先服务)算法
磁头移动顺序为:143→86→147→91→177→94→150→102→175→130,
磁头移动总量是:(143-86)+(147-86)+(147-91)+(177-91)+(177-94)+(150-94)+(150-102)+(175-102)+(175-130)=565(柱面)
(2)SSTF(最短寻道时间优先)算法
磁头移动顺序为:143→147→150→130→102→94→91→86→175→177,
磁头移动总量是:(147-143)+(150-147)+(150-130)+(130-102)+(102-94)+(94-91)+(91-86)+(175-86)+(177-175)=162(柱面)
(3)SCAN(扫描)算法
磁头移动顺序为:143→147→150→175→177→199→130→102→94→91→86→0,
磁头移动总量是:(199-143)+200=256(柱面)
(4)电梯调度算法。
磁头移动顺序为:143→147→150→175→177→130→102→94→91→86,
磁头移动总量是:(177-143)+(177-86)=125(柱面)
分页存储管理和分段存储管理
1.采用相联存储器后地址转换过程,用图表示出来
2.详述分段管理和分页管理的区别。
3.P249 习题11。
解:
1、
2、
分段是信息的逻辑单位,由源程序的逻辑结构及含义所决定,是用户可见的,段长由用户根据需要来确定,段起始地址可从任何内存地址开始。在分段方式中,源程序(段号、段内位移)经链接装配后仍保持二维(地址)结构,引入目的是满足用户模式化程序设计的需要。
分页是信息的物理单位,与源程序的逻辑结构无关,是用户不可见的,页长由系统(硬件)确定,页面只能从页大小的整数倍地址开始。在分页方式中,源程序(页号、页内位移)经链接装配后变成一维(地址)结构,引入目的是实现离散分配并提高内存利用率。
3、
(1)649
(2)1727
(3)2301
(4)140
(5)1956
存储管理
- 试述计算机系统中的存储器层次。为什么要配置层次式的存储器?
- 简述不同编译、链接、装载与地址定位过程。
- 什么是逻辑地址、物理地址?什么是静态地址重定位、动态地址重定位?
- 固定分区管理的缺点是什么?
- 简述固定分区存储管理和可变分区存储管理的区别
6. 某系统采用可变分区方式管理主存储器,在主存分配情况如图所示时,有4个作业要求装入主存,它们各自所需的主存空间为:J1:8KB,J2:15KB,J3:30KB,J4:115KB,系统不允许移动。
用最先适应分配算法,按2341的作业顺序装入,描述作业装入内存的过程。
7.
答:
1、计算机中的存储器有寄存器、缓存、内存、磁盘、磁带5个层次,多层次的存储体系十分有效和可靠,能达到很高的性能价格比,目前,计算机系统均采用层次结构的存储子系统,以便在容量大小、速度快慢、价格高低等诸多因素中取得平衡点,获得较好的性能价格比。
2、源程序经过编译程序或汇编程序的处理生成目标模块(也称目标代码)。链接程序的作用是根据目标模块之间的调用和依赖关系,将主调模块、被调用模块以及所用到的库函数装配和链接成一个完整的可装载执行模块。装载有绝对装载:装在模块中的指令地址始终与其内存中的地址相同,即在模块中出现的所有地址都是内存绝对地址;可重定位地址:根据内存当时使用情况,决定将装载代码模块放入内存的物理位置;动态运行时装载:为提高内存利用率,装入内存的程序可换出到磁盘上,适当时候再换入到内存中,对换前后程序在内存中的位置可能不同,即允许进程的内存映像在不同时候处于不同位置,此时模块使用的地址为相对地址。
3、逻辑地址是指在计算机体系结构中是指应用程序角度看到的内存单元、存储单元、网络主机的地址。物理地址是指在存储器里以字节为单位存储信息,为正确地存放或取得信息,每一个字节单元给以一个唯一的存储器地址,称为物理地址(Physical Address)。静态地址重定位是在虚拟空间程序执行之前,由装配程序完成的地址映射工作。动态地址重定位是程序在执行过程中,在CPU访问内存之前,将要访问的程序或数据地址转换为内存地址。
4、
(1)由于预先已规定分区大小,使得大作业无法装入,用户不得不采用覆盖等技术加以补救,这样不但加重用户负担,而且极不方便。
(2)内存空间利用率不高,作业很少会恰好填满分区。
(3)如果一个作业在运行过程中要求动态扩充内存空间,采用固定分区是相当困难的。
(4)分区数目是在系统初启时确定的,这就会限制多道运行程序的道数,特别不适应分时系统交互型用户及内存需求变化很大的形情。
5、固定分区存储管理基本思想是:内存空间被划分成数目固定不变的分区,各分区大小不等,每个分区只装入一个作业,若多个分区中都装有作业,则他们可以并发执行。可变分区存储管理按照作业大小来划分分区,但划分的时间、大小、位置都是动态的。
6、作业2需要15kb大小的空间,从上面往下找,第二个分区有16kb大小,可以容纳下作业2,所以作业2存入第二个分区里,剩下1kb的空间碎片;以此类推,作业3存入第四个分区,剩下120kb空间大小;作业4也存入剩下的第四个分区120kb内存里,第四个分区剩下5kb空间大小;作业1存入第三个分区里,剩下1kb空间碎片。
一、实验目的
(1)加深对进程并发执行的理解,认识多进程并发执行的实质。
(2)观察进程共享资源的现象,学习解决进程互斥和同步的方法。
二、实验要求:
本实验要求用高级语言,启动多进程并发运行,设计相应代码,显示进程无关并发、进程共享变量并发的运行结果。并完成实验报告。
三、实验内容:
分别实现以下四种情况的并发:
1.并发的进程之间无关,显示进程名称,开始与结束时间。
模拟多终端售票情况,并发的多个终端进程之间共享剩余票数这个共享变量。
2.用全局变量实现。
3.用进程间共享数据机制实现。
4.用进程间共享数据机制和加锁机制实现。
四、实验过程与结果
- 算法思想与设计
- 算法实现代码
用信号量及其PV操作处理实际问题
P187-43
Cemaphore
empty=1;橘子精=0;糖=0;水=0;
Process product(){
While(true){
P(empty);
产生一个随机数s;
If(s==0) V(橘子精);
If(s==1) V(水);
If(s==2) V(糖);
}
}
Process P1(){ | Process P2(){ | Process P3(){
While(true){ While(true){ While(true){
P(橘子精); P(糖); P(水);
取走橘子精; 取走糖; 取走水;
V(empty); V(empty); V(empty);
} } }
} } }
Coend
2.IPO问题:有多个输入进程、多个处理进程和多个输出进程。输入进程把数据逐步输入到一个有M个单位缓冲区B1上,经处理进程处理之后放到有N个单位的缓冲区B2上,由输出进程进行输出。
a.这个问题有哪些进程?进程之间有什么样的制约关系?
b.用信号量及PV操作写出这些进程之间的同步算法
解:
a:有输入进程、处理进程、输出进程,进程之间有同步关系。
b: semaphore B1;B1=M; /*B1可用的空缓存区*/
semaphore B2;B2=N; /*B2可用的空缓存区*/
semaphore mutex;mutex=1; /*同步信号*/
cobegin
process input(){
while(true){
p(mutex);
输入;
B1--;
v(mutex);
}
}
process chuli(){
while(true){
p(mutex);
处理;
B1++;
B2--;
v(mutex);
}
}
process output(){
while(true){
p(mutex);
输出;
B2++;
v(mutex);
}
}
coend
用信号量进程同步与互斥
1. 理解生产者和消费者问题
没有引入信号量时的生产者和消费者进程,什么情况下会出现结果不唯一?什么情况下会出现永远等待?
用信号解决生产者和消费者的同步与互斥,要求能自己写出来。
答:生产者进程和消费者进程对counter的交替操作会使其结果不唯一。
生产者进程和消费者进程的交替执行会导致进程永远等待,造成系统死锁。
Int k;
Typedef anyitem item;
Item buffer[k];
Int in=0,out=,counter=0;
Process producer(void){
While(true){
{produce an item in nextp};
If(counter==k)
Sleep(producer);
Buffer[in]=nextp;
In-(in+)%k;
Counter++;
If(counter==1)
Wakeup(consumer);
}
}
Process consumer(void){
While(true){
If(counter==0)
Sleep(consumer);
Nextc=buffer[out];
Out=(out+1)%k;
Counter__;
If(counter==k-1)
Wakeup(producer);
{consume the item in nextc};
}
}
6. 某银行有人民币储蓄业务,由n个储蓄员负责。每个顾客进入银行后先取一个号,并且等着叫号。当一个储蓄人员空闲下来,就叫下一个号。请用P,V操作正确编写储蓄人员和顾客进程的程序。
Var mutex=1,customer_count=0:semaphore;
cobegin
process customer
begin
repeat
P(mutex);
取号码,进入队列;
V(mutex);
V(customer_count);
untile false;
end
process serversi(i=1...n)
begin
repeat
P(customer_count);
P(mutex);
从队列中取下一个号码;
V(mutex);
为该号码持有者服务;
untile false;
end
coend
7. 下面是两个并发执行的进程。它们能正确运行吗?若不能请举例说明,并改正之。
parbegin
var X:integer;
process P1 process P2
var y,z:integer: var t,u:integer;
begin begin
x:=1; x:=0:
y:=0: t=0;
if x≥l then y:=y十1; if x≤l then t:=t+2;
z:=y; u:=t;
end; end;
parend.
parbegin
var x:integer; var s:semaphore:=1;
process P1 process P2
var y,z:integer ; var ,t,u:integer ;
begin begin
P(s); P(s);
x:=1; x:=0;
y:=0; t:=0;
if x>=1 then y:=y+1; if x<=1 then t:=t+2
V(s); V(s);
z:=y; u:=t;
end end
parend
8. 九、在一个盒子里,混装了相等数量的黑棋子和白棋子,现要用自动分拣系统把黑棋子和白棋子分开,该系统由两个并发执行的进程P1和P2组成,其中进程P1专门拣黑子,进程P2专门拣白子。规定两个进程轮流拣子且每个进程每次只拣一个子。当一个进程在拣子时不允许另一个进程去拣子,并设P1先拣。请用P,V操作管理这两个并发进程,使其能正确实现上述功能。
semaphore S1,S2;
S1=1;S2=0;
cobegin
process P1(){
begin
repeat
P(S1);
拣黑子
V(S2);
until false;
end
}
process P2(){
begin
repeat
P(S2);
拣白子
V(S1);
until false;
end
}
coend.
进程互斥于同步
一、理解并行和并发的关系
(一)、程序的并发执行是指一组程序的执行在时间上是重叠的,所谓时间重叠是指一个程序执行第一条指令是在另一个程序完最后一条指令之前开始的,或者说,多个程序处于都已开始但未执行完成状态。
比如:你在吃饭的同时受到一条微信,你放下了筷子回信息,等信息回完之后你拿起筷子继续吃饭,这说明你是支持并发的。
(二)、并行是指在时间上是同步的,即“同时”。
比如:你在吃饭的时受到一天微信消息,没有放下筷子而回微信消息,这说明你是支持并行的。
(三)、并发是指你有处理多个任务的能力,但不一定要同时;并行是指你有同时处理多个任务的能力,二者的关键在于是否同时;
比如:你在吃饭的同时受到一条微信消息,要把饭吃完才能回消息,说明你既不支持并发又不支持并行。
二、进程间有哪几种关系?分别要采取什么策略?
(一)竞争关系。进程互斥是指若干进程因互相争夺独占资源而产生的竞争制约关系。
比如:若干名同学去图书馆借书是间接制约,即互斥关系,其中书是临界资源。
资源竞争会引发两个控制问题,一个是死锁,一个是饥饿。解决饥饿问题的最简单策略是FCFS资源分配策略,等待最久的进程会是下一个被调度的进程,随着时间流逝,每个进程都会有机会变成最“老”进程,因而能获得资源并完成任务。
(二)协作关系。进程同步是指为完成共同任务的并发进程给予某个条件来协调其活动,因为需要在某些位置上排定执行的先后次序而等待、传递信号或消息所产生的协作制约关系。
比如:流水线生产的各道工序是直接制约,需要互相合作,每道工序的开始都依赖前一道工序的完成。
进程间的协作可以是双方不知道对方的名字的间接协作,如通过访问共享资源进行松散式协作;也可以是双方知道对方名字,通过通信机制进行的紧密协作,允许进程协同工作有利于共享信息、加快计算速度、实现模块化的程序设计。
三、为什么说进程互斥也是一种同步?
在操作系统中,当某一进程正在访问某一存储区域时,就不允许其他进程进行读写或者修改该存储区的内容,否则就会发生后果无法估计的错误。进程之间的这种相互制约的关系成为进程互斥。
并发进程在一些关键点上可能需要互相等待与互通消息,这种相互制约的等待与互通信息称为进程同步。
实际上进程互斥也是一种同步,他协调多个进程互斥进入同一个临界资源对应的临界区。
四、解释死锁与“饥饿”,并说明两者关系。
(一)死锁:死锁的产生一定是我们在为了确保同步多线程多进程的时候为临界资源加锁(互斥锁,信号量)造成的。因为一但加锁就会有不可剥夺的资源产生,这也是死锁产生的最重要的条件。
(二)死锁产生的必要条件:
互斥(临界资源):一个资源某一时刻只能一个进程占用
不可抢占(锁的本质):别人用着没用完你不能抢
占有与请求:占有一个资源时候请求别的资源
循环:在上述三个条件下,由于运行时间巧合产生死锁A占用a资源申请b阻塞住,B占有b申请a被阻塞住了。
(三)饥饿:是指系统不能保证某个进程的等待时间上界,从而使该进程长时间等待,当等待时间给进程推进和响应带来明显影响时,称发生了进程饥饿。当饥饿到一定程度的进程所赋予的任务即使完成也不再具有实际意义时称该进程被饿死。(两个以上优先级高的线程一直生产消费通过临界资源,一个线程旁边看,忙等待)
(四)相同点:二者都是由于竞争资源(未解决则会加锁)而引起的。
(五)不同点:从进程状态考虑,死锁进程都处于等待状态,忙等待(处于运行或就绪状态)的进程并非处于等待状态,但却可能被饿死;
1、死锁进程等待永远不会被释放的资源,饿死进程等待会被释放但却不会分配给自己的资源,表现为等待时限
2、没有上界(排队等待或忙式等待);
3、死锁一定发生了循环等待,而饿死则不然。这也表明通过资源分配图可以检测死锁存在与否,但却不能检测是否有进程饿死;
4、死锁一定涉及多个进程,而饥饿或被饿死的进程可能只有一个。
5、在饥饿的情形下,系统中有至少一个进程能正常运行,只是饥饿进程得不到执行机会。而死锁则可能会最终使整个系统陷入死锁并崩溃。
五、什么是临界区?如何解决进程对临界资源的访问冲突?
(一)每个进程中访问临界资源的那段程序称为临界区(临界资源是一次仅允许一个进程使用的共享资源)。每次只准许一个进程进入临界区,进入后不允许其他进程进入。
(二)1、如果有若干进程要求进入空闲的临界区,一次仅允许一个进程进入;
2、任何时候,处于临界区内的进程不可多于一个。如已有进程进入自己的临界区,则其它所有试图进入临界区的进程必须等待;
3、进入临界区的进程要在有限时间内退出,以便其它进程能及时进入自己的临界区;
4、如果进程不能进入自己的临界区,则应让出CPU,避免进程出现“忙等”现象。
理解并发进程
一、顺序程序设计
程序顺序执行是指其在处理器 上的执行是严格有序的,即只有在前一个操作结束后,才能开始后继操作,这种称为程序内部顺序性:如果一个计算任务需要若干不同的程序完成,这些程序也按照用次序严格有序执行,这种称为程序外部顺序性。传统程序设计方法是顺序程序设计方法是顺序程序设计,把程序设计成顺序执行的指令序列,不同程序也按先后顺序执行。
顺序程序设计具有以下特性:
(1)执行的顺序性。一个程序在处理器上是严格按序执行的,每个操作必须在一个操作开始前结束。
(2)环境的封闭性。运行程序独占全机资源,资源状态只能由此程序本身决定和改变,也不受外界因素影响。
(3)结果的确定性。程序在执行过程中允许出现中断,但这种中断不会对程序最终结果产生影响,也就是说程序执行结果与他的执行速度无关。
(4)过程的可再现性。程序针对同一个数据结构的执行过程再下一次执行时会重现,及重复执行程序会获得相同的执行过程和计算结果。
二、并发进程的特性
(1)若为单处理器系统,可以有效的利用资源,让处理器和设备、设备和设备同时工作,充分发挥硬部分间的并行工作能力。
(2)若为多处理系统,可让进程在不同处理器上物理的并行工作,加快计算速度。
(3)简化程序设计任务,一般来说,编制并发执行的小程序进度快,容易保证正确性,可见,计算机硬部件能并行工作仅具备提高效率的可能性,而并行工作的实现要通过并发程序设计和操作系统引入并发技术来发挥。
三、举例说明
(1)顺序程序:当一天我要炒青菜的时候,要先去菜市场买菜,然后洗菜、切菜,当这些都做好以后,我才能把菜放进锅里面开始炒菜。
(2)并发进程:当我要泡茶的时候,我先把开始煮水,在煮水的同时,我把杯子洗好,把茶叶准备好,然后水煮好了,我开始把茶叶放进茶壶,并倒水进去开始泡茶。
(3)代码实现
操作系统实验一:处理器管理
一、实验目的
(1)加深对处理机调度的作用和工作原理的理解。
(2)进一步认识并发执行的实质。
二、实验要求:
本实验要求用高级语言,模拟在单处理器情况下,采用多个调度算法,对N个进程进行进程调度。语言自选。
并完成实验报告。
三、实验内容:
在采用多道程序设计的系统中,往往有若干个进程同时处于就绪状态。
当就绪状态进程个数大于处理器数时,就必须依照某种策略来决定哪些进程优先占用处理器。
- 进程及进程队列的表示。
- 处理器调度算法:FCFS,SJF,RR,HRRN,MLFQ等
- 跟踪进程状态的转化
- 输出:系统中进程的调度次序,计算CPU利用率,平均周转时间和平均带权周转时间
四、实验过程与结果
1.FCFS:
1.1算法思想:按照作业进入系统后备作业队列的先后次序来挑选作业,先进入系统的作业将优先被挑选进入内存,创建用户进程,分配所需资源,然后移入就绪队列。
1.2算法设计:
2.SJF:
2.1算法思想:以进入系统作业所需要求的CPU运行时间的长短为标准,总是选取预计计算时间最短的作业投入运行。
2.2算法设计:
3.RR:
3.1算法思想:调度程序每次把CPU分配给就绪队列首进程/线程使用规定的时间间隔,称为时间片,通常为10ms~200ms,就绪队列中的每个进程/线程轮流的运行一个时间片,当时间片消耗尽时就强迫当前运行进程/线程让出处理器,转而排列到就绪队列尾部,等候下一轮调度。
3.2算法设计: