n>=Lt时,Bt(n)=Bt(n+1)
n表示分配给程序的实页数,Bt(n)表示t时刻在n个实页中的虚页集合,Lt为t时刻不同虚页的页面数。
由于在主存中保留的是最近使用过的页面。
如果先给某一个程序分配n个主存页面,那么在t时刻,这n个主存页面都是最近使用过的页面。
如果再给这个程序多分配一个主存页面,那么在t时刻,这n+1个主存页面也都是最近使用过的页面。
因此,在这n+1个主存页面中必然包含了前面的n个主存页面。
所以,opt算法是堆栈型算法。
1.读着优先、写者优先(代码)。
读者优先
如果有读者来时,
无读者和写者,新读者可以读;
如有写者等待,但有其他读者正在读,则新读者可以读;
有写者写,新读者则等待
Varwsem:
semaphore;(initialvalue:
1)
Writer:
while
(1){
P(wsem);
V(wsem);
}
intreadCount=0;
semaphorewsem=1;
semaphoremutex=1;
reader():
while
(1){
P(mutex);
readCount=readCount+1;
if(readCount==1)
P(wsem);
V(mutex);
P(mutex);
readCount=readCount-1;
if(readCount==0)
V(wsem);
V(mutex);
}
写者优先
如果有写者来时,
无读者,新写者可以写;
如有读者正在读,则新读者等待;
有其他写者正在写,新写者则等待。
intwriteCount=0;
semaphorewsem,rsem=1;
semaphoremutexY=1;
writer():
while
(1){
P(mutexY);
writeCount=writeCount+1;
if(writeCount==1)
P(rsem);
V(mutexY);
P(wsem);
V(wsem);
P(mutexY);
writeCount=writeCount-1;
if(writeCount==0)
V(rsem);
V(mutex);
}
intreadCount=0;
semaphorewsem,rsem=1;
semaphoremutexX,mutex=1;
reader():
while
(1){
P(mutex);
P(rsem);
P(mutexX);
readCount=readCount+1;
if(readCount==1)
P(wsem);
V(mutexX);
V(rsem);
V(mutex);
P(mutexX);
readCount=readCount-1;
if(readCount==0)
V(wsem);
V(mutexX);
}
变量wsem用来保证读者与写者之间的互斥,以及写者与写者之间的互斥;变量writeCount用来记录写者的数目;变量mutexY用来实现读者对于变量writeCount访问的互斥;变量readCount用来记录读者的数目;变量mutexX用来实现读者对于变量readCount访问的互斥;mutex用来实现rsem上不要有长的排队等待。
2.资源分配图的化简。
可以通过对资源分配图的约简,来判断系统是否处于死锁状态.
资源分配图中的约简方法如下:
(1)寻找一个非孤立且没有请求边的进程结点pi,若无算法结束;
(2)去除所有pi的分配边使pi成为一个孤立结点;
(3)寻找所有请求边均可满足的进程pj,将pj的请求边全部改为分配边;
(4)转步骤
(1).
若算法结束时,所有结点均为孤点,则称资源分配图是可以完全约简的,否则称为不可完全约简的.文献已经证明,系统处于死锁状态的充分必要条件是资源分配图不可完全约简.这一结论称为死锁定理.
定理:
S为死锁状态的充分必要条件是S的资源分配图不可完全约简.
对于问题1,假设进程p3申请资源类r2中的一个实例,由于没有空闲的资源实例,将增加一条申请边(p3,r2),形成图5-2.此时,出现了两个环路:
p1®r1®p2®r3®p3®r2®p1和p2®r3®p3®r2®p2.进一步分析可以验证,此时系统已经发生死锁,且进程p1、p2和p3都参与了死锁.
对于问题2,此图中亦有一个环路:
p1®r2®p4®r1®p1
然而并不存在死锁.注意观察p2可能会释放资源类r1中的一个资源实例,该资源实例可分配给进程p3,从而使环路断开.
综合上述分析可以看出,如果资源分配图中不存在环路,则系统中不存在死锁;反之,如果资源分配图中存在环路,则系统中可能存在死锁,也可能不存在死锁.
3.扔球问题。
(1)有一个充分大的池子,两个人分别向池中扔球,甲扔红球,乙扔蓝球,一次扔一个,开始时池中有红、蓝球各一个,要求池中球满足条件:
1<=红球数/蓝球数<=2,用PV操作描述两个进程
信号量初值:
r=1;b=0
扔红扔蓝
P(r)P(b)
扔一个红扔一个蓝
V(b)V(r)
V(r)
(2)一个充分大的池子,甲乙丙三人扔球,甲扔红,乙扔蓝,丙扔绿。
开始时池子中又红绿蓝球各一个。
要求:
池中球满足要求:
1<=红/蓝<=2,且蓝<=绿<=红+蓝
信号量初值:
r,b1,g=1;b2=0
扔红扔蓝扔绿
P(r)P(b1)P(g)
扔一个红P(b2)扔一个绿
V(b1)扔一个蓝V(b2)
V(g)V(r)
V(r)
V(g)
4.最佳页面尺寸算法例:
在一个分页系统中,设计算机的内存大小为M,作业平均尺寸为J,一个页表项占x个存储单位,问最佳页面尺寸P是多少?
每个进程需要的页数:
J/P
占用x·J/P个存储单位
每个进程的内部碎片平均为:
P/2
由页表和内部碎片带来的总开销:
x·J/P+P/2=M
对P求导,令其等于0,得到方程:
-x·(J/P^2)+1/2=0
由此得到最佳页面尺寸公式P=2xJ^(1/2)
5.安全性检测算法(已知流程图,写代码)。
数据结构:
Available:
array[1..m]ofinteger;//系统可用资源
Claim:
array[1..n,1..m]ofinteger;//进程最大需求
Allocation:
array[1..n,1..m]ofinteger;//当前分配
Need:
array[1..n,1..m]ofinteger;//尚需资源
Request:
array[1..n,1..m]ofinteger;//当前请求
intWork[m];工作变量,记录可用资源.
intFinish[n];工作变量,记录进程是否可进行完.
1.Work=Available;Finish=false;
2.寻找满足如下条件的i:
(1)Finish[i]==false;
(2)Need[i]≤Work[i];
如果不存在,则转步骤4;
3.Work=Work+Allocation[i];Finish[i]=true;
转步骤2
4.如果对于所有i,Finish[i]=true,则系统处于安全状态,否则处于不安全状态.
6.进程的状态及其转移。
运行:
进程当前处于运行状态。
·就绪;进程已准备好运行。
·阻塞;进程等待某些事件发生(如I/O操作)后才能运行。
·创建:
进程刚产生,但还未被操作系统提交到可运行进程池中。
·消失:
进程被操作系统从可运行进程池中释放。
带有挂起状态的进程状态图:
(a)带有一个挂起状态的进程转换图
(b)带有两个挂起状态的进程转换图
7.进程的状态转换原因:
(1)处于就绪状态的进程,当进程调度程序为之分配了处理机后,该进程就由就绪状态变为执行状态
(2)正在执行的进程因发生某事件而无法执行,如暂时无法取得所需资源,则由执行状态转变为阻塞状态。
(3)正在执行的进程,如因时间片用完或被高优先级的进程抢占处理机而被暂停执行,该进程便由执行转变为就绪状态。