目录
单道、多道非抢占式和多道抢占式
PV操作
拣棋子
水果
基础版
扩展版
加强版
超市购物
开车售票
银行叫号
某银行提供1个服务窗口和10个顾客等待座位。顾客到达银行时,若有空座位则占下,然后到取号机领取一个号,坐在座位上等待叫号。取号机每次仅允许一个顾客使用。当柜员空闲时,通过叫号选取一位顾客,并为其服务。顾客和柜员的活动过程描述如下:
顾客进程:
{
从取号机获得一个号码;
等待叫号;
获得服务;
}
柜员进程:
{
叫号;
为顾客服务;
}
//定义信号量
semaphore mutex=1,seats=10,service =0;
semaphore mutex = 1,service = 0,seets = 10;
//顾客进程
void customers(){
P(seats); //首先申请座位
P(mutex); //顾客之间的取号进程互斥,用metex来实现
取号;
V(mutex);
V(service);//等待叫号
等待获取服务;
}
//营业员进程
void assistant(){
P(service); //提供服务
叫号并且为客户提供服务;
V(seats); //释放座位
}
void main(){
cobegin
customers();
assistant();
coend
}
和尚喝水
订机票
理发师
缓冲区读写
商品制约
转自https://www.renrendoc.com/paper/134699461.html
独木桥
有一个独木桥,过桥时,同一方向的行人可连续过桥;当某一方向有人过桥时,另一方向的人必须等待;当某一方向无人过桥时,另一方向的行人可以过桥。
对于A方向:
P(SA)
IF (countA=0)
THEN P(metux)
countA=countA+1
V(SA)
过桥
P(SA)
countA=countA-1
IF(countA=0)
THEN V(metux)
V(SA)
对于B方向:
P(SB)
IF (countB=0)
THEN P(metux)
countB=countB+1
V(SB)
过桥
P(SB)
countB=countB-1
IF(countB=0)
THEN V(metux)
V(SB)
读写
读者优先
int count = 0; //⽤用于记录当前的读者数量量
semaphore mutex = 1; //⽤用于保护更更新count变量量时的互斥 semaphore rw = 1; //⽤用于保证读者和写者互斥地访问⽂文件
writer () { //写者进程
while (1) {
P(rw); //互斥访问共享⽂文件
Writing; //写⼊入
V(rw); //释放共享⽂文件
}
}
reader () { // 读者进程
while (1) {
P(mutex); //互斥访问count变量量
if (count == 0) { //当第⼀一个读进程读共享⽂文件时
P(rw); //阻⽌止写进程写
}
count++; //读者计数器器加1
V(mutex); //释放互斥变量量count
reading; //读取
P(mutex); //互斥访问count变量量
count--; //读者计数器器减1
if (count == 0) { //当最后⼀一个读进程读完共享⽂文件
V(rw); //允许写进程写
}
V(mutex); //释放互斥变量量count
}
}
写者优先
int readercount = 0; //⽤用于记录当前的读者数量量
int writercount = 0; //⽤用于控制rsem信号量量
semaphore rmutex = 1; //⽤用于保护更更新readercount变量量时的互斥 semaphore wmutex = 1; //⽤用于保护更更新writercount变量量时的互斥
semaphore rw = 1; //⽤用于保证读者和写者互斥地访问⽂文件
semaphore rsem = 1; //当⾄至少有⼀一个写者申请写数据时互斥新的读者进⼊入读数据
writer() {
while (1) {
P(wmutex);
if (writercount == 0) {
P(rsem);
}
writercount++;
V(wmutex);
P(rw);
writing;
V(rw);
P(wmutex);
writercount--;
if (writercount == 0) {
V(rsem);
}
V(wmutex);
}
}
reader() {
while (1) {
P(rsem);
P(rmutex);
if (readercount == 0) {
P(rw);
}
readercount++;
V(rmutex);
V(rsem);
reading;
P(rmutex);
readercount--;
if (readercount == 0) {
V(rw);
}
V(rmutex);
}
}
读写公平
int readercount = 0; //⽤用于记录当前的读者数量量
int writercount = 0; //⽤用于控制rsem信号量量
semaphore rmutex = 1; //⽤用于保护更更新readercount变量量时的互斥 semaphore wmutex = 1; //⽤用于保护更更新writercount变量量时的互斥
semaphore rw = 1; //⽤用于保证读者和写者互斥地访问⽂文件
semaphore rsem = 1; //当⾄至少有⼀一个写者申请写数据时互斥新的读者进⼊入读数据
writer() {
while (1) {
P(wmutex);
if (writercount == 0) {
P(rsem);
}
writercount++;
V(wmutex);
P(rw);
writing;
V(rw);
P(wmutex);
writercount--;
if (writercount == 0) {
V(rsem);
}
V(wmutex);
}
}
reader() {
while (1) {
P(rsem);
P(rmutex);
if (readercount == 0) {
P(rw);
}
readercount++;
V(rmutex);
V(rsem);
reading;
P(rmutex);
readercount--;
if (readercount == 0) {
V(rw);
}
V(rmutex);
}
}
银行家算法
在银行家算法的例子中,如果出现下述资源分配情况,试问:
Process Allcation Need Available
P0 0 0 3 2 0 0 1 2 1 6 2 2
P1 1 0 0 0 1 7 5 0
P2 1 3 5 4 2 3 5 6
P3 0 3 3 2 0 6 5 2
P4 0 0 1 4 0 6 5 6
(1)该状态是否安全?
(2)进程P2提出请求Request(1,2,2,2)后,系统是否能将资源分配给它?
解:(1)利用安全性算法,对上述资源进行分配后找到可分配序列,<P0,P3,P1,P2,P4>,所以是安全的
Process Work Allcation Need work(Work+Allocation) Finish
P0 1 6 2 2 0 0 3 2 0 0 1 2 1 6 5 4 true
P1 1 9 8 6 1 0 0 0 1 7 5 0 2 9 8 6 true
P2 2 9 8 6 1 3 5 4 2 3 5 6 3 12 13 10 true
P3 1 6 5 4 0 3 3 2 0 6 5 2 1 9 8 6 true
P4 3 12 13 10 0 0 1 4 0 6 5 6 3 12 14 14 true
(2)首先Request2(1,2,2,2)<=Need2;Request2(1,2,2,2)<=Available,于是假定系统对其进行资源分配
并修改Available、Allcation2、Need2向量,修改结果为Available(0,4,0,0),Allcation2(2,5,7,6),Need2(1,1,3,4)
Process Work Allcation Need work(Work+Allocation) Finish
P0 0 0 3 2 0 0 1 2
P1 1 0 0 0 1 7 5 0
P2 2 5 7 6 1 1 3 4
P3 0 3 3 2 0 6 5 2
P4 0 0 1 4 0 6 5 6
资源分配后对程序进行安全性检查,发现对于任意Needi<=Available(0,4,0,0)不成立。即Available不能满足任何进程的请求,系统进入不安全状态。所以不能分配!
CRC
由逻辑地址转物理地址
第一类:
第二类:
计算大小多少
访问主存时间和次数
页面置换
假设有一台配置了虚拟存储器的计算机,其物理地址空间为64KB,逻辑地址空间为64KB,按字节编址。某进程正常运行最多需要6页数据存储空间,系统中每个页框的的大小是1KB,操作系统采用固定分配局部置换策略为此进程分配了4个页框。某时刻该进程占用页框情况如图所示,当该进程执行到时刻260时,要访问逻辑地址为13CAH的数据。
1.则该逻辑地址对应的页号是_____?
2.若采用先进先出(FIFO)置换算法,则最终该逻辑地址对应的物理地址是_____H(注意英文应大写)
3.若采用普通时钟(Clock)置换算法,设搜索下一页的指针按上表中的顺序循环移动,且当前指向页框号为4的条目,该逻辑地址对应的物理地址是_____H(注意英文应大写)
1.
13CAH=0001 0011 1100 1010
页的大小1KB=2^10,页内地址占10位,页号占16-10=6位
13CAH页号000100=4
2.
3号页进入时间最早,置换,即将4号页装入9号页框中,所以物理地址为0010 0111 1100 1010=27CAH
3.
根据CLOCK算法,如果当前指针所指页框的使用位为0,则替换该页;否则将使用位清零,并将指针指向下一个页框,继续查找。根据题设和示意图,将从4号页框开始,前4次查找页框号的顺序为4→2→9→7,并将对应页访问位清零。在第5次查找中,指针指向4号页框,此时4号页框访问位为0,故淘汰4号页框对应1号页,把4号页装入4号页框中,并将对应访问位设置为1,所以对应的物理地址为0001 0011 11001010B,换算成十六进制为13CAH。