【考研计算机操作系统】 强化笔记

文章目录:

一:PV题型分类

1.生产者消费者问题(套各种马甲)

2.理发师问题(涉及取号叫号、忙则跑路)

3.读者写者问题——同类不互斥、异类互斥

4.哲学家进餐问题

5.单纯同步问题

二:内存大题考察形式

1.各种概念之间的推导计算

2.从示意图图中挖掘出隐含信息

3.基于地址转化过程的分析

三:TLB、页表、Cache的关系

四:文件系统示意图


一:PV题型分类

1.生产者消费者问题(套各种马甲)

1. 有哪几类进程?——每类进程对应一个函数
2. 用中文描述每一类进程的动作顺序
3. 检查每一个动作之前,是否需要P操作,如果P了,那么记得补上配套的V(同步:哪些动作必须保证“一前一后”关系?
    互斥:注意隐含的互斥条件,通常是缓冲区、或某种独占资源)
4. 所有PV都写完之后,再逆向的定义各种信号量。
5. 检查多个P操作在一起的地方,有没有可能产生死锁(产生死锁的必要条件:保持和请求)

举例

某工厂有两个生产车间和一个装配车间,两个生产车间分别生产A、B两种零件,装配车间的任务是把A、B两种零件组装成产品。
两个生产车间每生产一个零件后,都要分别把它们送到装配车间的货架F1、F2上。
F1存放零件A,F2存放零件B,F1和F2的容量均可存放10个零件。
装配工人每次从货架上取一个零件A和一个零件B后组装成产品。请用P、V操作进行正确管



Semaphore mutex1=1; //互斥访问货架F1
Semaphore mutex2=1; //互斥访问货架F2
Semaphore empty1=10; //货架F1上有几个空位
Semaphore full1=0; //货架F1上有几个A零件
Semaphore empty2=10; //货架F2上有几个空位
Semaphore full2=0; //货架F2上有几个B零件

A车间的工作过程可描述为:
while(1){
生产一个产品A;
P(empty1);
P(mutex1);
将产品A存放到货架F1上;
V(mutex1);
V(full1);
}

B车间的工作过程可描述为:
while(1){
生产一个产品B;
P(empty2);
P(mutex2);
将产品B存放到货架F2上;
V(mutex2);
V(full2);
}

装配车间的工作过程可描述为:
while(1){
P(full1);
P(mutex1);
从货架F1上取一个A产品;
V(mutex1);
V(empty1);
P(full2);
P(mutex2);
从货架F2上取一个B产品;
V(mutex2);
V(empty2);
将取得的A产品和B产品组装成产品;
}
某寺庙有小和尚、老和尚若干,有一水缸,由小和尚提水入缸供老和尚饮用。
水缸可容10桶水,水取自同一井中。水井径窄,每次只能容一个桶取水。水桶总数为3个。
每次入缸取水仅为1桶水,且不可同时进行。试给出有关从缸取水、入水的算法描述



semaphore well=1;  //用于互斥地访问水井
semaphore vat=1;  //用于互斥地访问水缸
semaphore empty=10;  //用于表示水缸中剩余空间能容纳的水的桶数
semaphore full=0;  //表示水缸中的水的桶数
semaphore pail=3;  //表示有多少个水桶可以用,初值为3

//老和尚
while(1){
P(full);
P(pail);
P(vat);
从水缸中打一桶水;
V(vat);
V(empty);
喝水;
V(pail);
}

//小和尚
while(1){
P(empty);
P(pail);
P(well);
从井中打一桶水;
V(well);
P(vat);
将水倒入水缸中;
V(vat);
V(full);
V(pail);
}

2.理发师问题(涉及取号叫号、忙则跑路)

 理发师、营业员都是这一类,顾客需要取号,没人的时候工作人员在摸鱼,一旦有客人完成取号,就需要唤醒
• 同步:只要有客人在等,店员就得工作
• 互斥:取号和叫号的时候同一时刻只能有一个人叫号,通过mutex实现互斥

举例

理发店理有一位理发师、一把理发椅和n把供等候理发的顾客坐的椅子。如果没有顾客,理发师便在理发椅上睡觉,一个顾客到来时,
顾客必须叫醒理发师,如果理发师正在理发时又有顾客来到,则如果有空椅子可坐,就坐下来等待,否则就离开。



int waiting =0;  //正在等候理发的顾客数
semaphore mutex =1; //互斥地访问waiting变量
semaphore customers =0; //用于实现“理发师等待顾客”的同步关系
semaphore tony =0; //用于实现“顾客等待理发师”的同步关系

TonyTeacher(){ //理发师进程
while(1){
P(customers); //等待顾客到来,无顾客则睡眠
P(mutex);  //互斥访问waiting变量
waiting--;  //等候顾客-1
V(mutex);  //开放临界区
V(tony);  //唤醒一个正在等待的顾客
为顾客理发;
}
}

customer(){ //顾客进程
P(mutex);  //互斥访问waiting变量
if(waiting<n){ //是否还有空椅子
waiting++;  //等候顾客数加1
V(mutex);  //访问完waiting变量
V(customers);  //唤醒理发师
P(tony);  //等待tony老师
接受tony的改造;
}
else
V(mutex);  //无座,转身离开
}
面包师有很多面包,由n个销售人员推销。每个顾客进店后取一个号,并且等待叫号,当一个销售人员空闲
下来时,就叫下一个号。试设计一个使销售人员和顾客同步的算法。



int i = 0; //顾客取到哪个号了
int j = 0; //销售员叫到哪个号了
semaphore mutex_i = 1; //互斥访问 i
semaphore mutex_j = 1; //互斥访问 j

Consumer() { //顾客
进入面包店;
P(mutex_i); //互斥访问i
取号i;
i++;
V(mutex_i); //释放对i的访问
等待叫号i并购买面包;
}

Seller() { //销售人员
while (1){
P(mutex_j); //互斥访问j
if (j < i){ //还有顾客在等待
叫号j;
j++;
V(mutex_j); //释放对j的访问
销售面包;
} else{ //暂时没有顾客在等待
V(mutex_j); //释放对j的访问
休息片刻;
}
}
}



Semaphore Sm=0; //实现同步关系:销售员叫号后唤醒正在等待的顾客
Semaphore Cs=0; //有几个已取号顾客

//第i个顾客,i∈[1,+∞)
consumer_i(){
进店;
取号;
V(Cs);
等待被叫号;
P(Sm);
被服务;
}

//第j个销售员,j∈[1,n]
salesman_j(){
while(1) {
P(Cs);
叫号;
V(Sm);
为顾客服务;
}
}

3.读者写者问题——同类不互斥、异类互斥

读者写者问题主要是解决互斥,他的访问关系分为两种类型,一种是可以同时访问(读和读),另一种是必须互斥访问(写和读,写和写),因为多种关系,所以引入了计数器count


互斥:mutex。写过程是不容其他过程的,所以直接P(mutex),而读过程P(mutex)受计数器count影响,需要考虑是不是第一个读进程(负责P),
以及退出时是不是一个最后一个退出的(负责V)rw。读写之间的互斥

举例

有桥如图2-12所示。车流方向如箭头所示。回答如下问题:
1)假设该桥上每次只能有一辆车行驶,试用信号灯的P、V操作实现交通管理。
2)假设该桥上不允许两车交会,但允许同方向多个车一次通过(即桥上可有多个同方向行驶的车)。试用信号灯的P、V操作实现桥上交通管理



semaphore bridge=1; //用于互斥地访问桥
NtoS(){ //从北向南的车
P(bridge);
过桥;
V(bridge);
}
StoN(){ //从南向北的车
P(bridge);
过桥;
V(bridge);
}

 

读者与写者互斥:第一个读者负责上锁,最后一个读者负责解锁



int countSN=0; //正在从南到北过桥的汽车数量
int countNS=0; //正在从北到南过桥的汽车数量
semaphore mutexSN=1; //用于保护countSN
semaphore mutexNS=1; //用于保护countNS
semaphore bridge=1; //用于互斥地访问桥

StoN(){ //从南向北
P(mutexSN);
if(countSN==0)
P(bridge);
countSN++;
V(mutexSN);
过桥;
P(mutexSN);
countSN--;
if(countSN==0)
V(bridge);
V(mutexSN);
}

NtoS(){ //从北向南
P(mutexNS);
if(countNS==0)
P(bridge);
countNS++;
V(mutexNS);
过桥;
P(mutexNS);
countNS--;
if(countNS==0)
V(bridge);
V(mutexNS);
}
假设一个录像厅有1、2、3三种不同的录像片可由观众选择放映,录像厅的放映规则为:
1)任一时刻最多只能放映一种录像片,正在放映的录像片是自动循环放映的,最后一个观众主动离开时结
束当前录像片的放映;
2)选择当前正在放映的录像片的观众可立即进入,允许同时有多位选择同一种录像片的观众同时观看,同
时观看的观众数量不受限制;
3)等待观看其他录像片的观众按到达顺序排队,当一种新的录像片开始放映时,所有等待观看该录像片的
观众可依次序进入录像厅同时观看。用一个进程代表一个观众,要求:用信号量方法PV操作实现,并给出
信号量定义和初始值



semaphore room=1, mutex1=1, mutex2=1, mutex3=1;
int count1=0,count2=0,count3=0;

P1() {//看第一部影片的观众
P(mutex1);
count1++;
if(count1==1) //第一个上锁
P(room);
V(mutex1);
看影片1;
P(mutex1);
count1--;
if(count1==0) //最后一个解锁
V(room);
V(mutex1);
}

P2() {//看第一部影片的观众
P(mutex2);
count2++;
if(count2==1)
P(room);
V(mutex2);
看影片2;
P(mutex2);
count2--;
if(count2==0)
V(room);
V(mutex2);
}

P3() {//看第一部影片的观众
P(mutex3);
count3++;
if(count3==1)
P(room);
V(mutex3);
看影片3;
P(mutex3);
count3--;
if(count3==0)
V(room);
V(mutex3);
}
南开大学和天津大学之间有一条弯曲的路,每次只允许一辆自行车通过,但中间有小的安全岛M(同时允
许两辆车通过),可供已进入两端的两辆小车错车,如下图所示。设计算法并使用P、V操作实现


int T2N=1; //从T到N的互斥信号量
int N2T=1; //从N到T的互斥信号量
int L=1; //经过L路段的互斥信号量
int K=1; //经过K路段的互斥信号量

Procedure Bike T2N{
P(T2N);
P(L);
从T进入L;
进入M;
V(L);
P(K);
从K到N;
V(K);
V(T2N);
}

Procedure Bike N2T{
P(N2T);
p(K);
从N进入K;
进入M;
V(K);
P(L);
从L到T;
V(L);
V(N2T);
}

 

4.哲学家进餐问题

哲学家问题关键点是限制并行,主要是三种思路
• 1.限制申请条件(对应破坏死锁循环等待条件)解法一不通用
比如规定单号哲学家先取左筷子,双号先取右筷子
• 2.信号量限制并行数(解法二通用,参考2.4小题第8题确定最大
进程数)
如p89代码就是同一时间只能有一个哲学家就餐(禁止并行)
• 3.限制哲学家只有能够取得两个筷子的时候才会就餐(对应破坏
死锁条件)(解放三很通用,暴力美学,P(Lock);if(检查是全否
满足);V(Lock))

举例

【2011统考真题】某银行提供1个服务窗口和10个供顾客等待的座位。
顾客到达银行时,若有空座位,则到取号机上领取一个号,等待叫号。取号机每次仅允许一位顾客使用。
当营业员空闲时,通过叫号选取一位顾客,并为其服务。顾客和营业员的活动过程描述如下:



cobegin(
process    顾客i
{
    从取号机获取一个号码;
    等待叫号;
    获取服务;
}
process营业员{
    while (TRUE){
        叫号;
        为客户服务;
                }
    )
} coend

请添加必要的信号量和PV〔或wait(), signal()]操作,实现上述过程中的互斥与同步。要求写出完整的过程,说明信号量的含义并赋初值。

• 同步:顾客的取号和工作人员的叫号通过同步信号量实现,顾客到达取号后就行p操作排队(这种方式等于是让计算机来实现排队过程),
        因为信号量机制中p会把自己阻塞,并进入拥塞队列,先来的顾客就在前面
• 互斥:取号机只有一个,可以通过队列实现叫号

5.单纯同步问题

这类题只有多个工作的同步,只要能画出图找到同步关系即可,送分题,不需要过多关注

二:内存大题考察形式

1.各种概念之间的推导计算

Key:熟悉掌握各种概念之间的关系(做题的时候注意总结)
一级页表+TLB+请求分页
二级页表+请求分页+TLB
    页目录号的位数+每个页目录项的大小→页目录表的大小?
    页目录号+页目录表的起始地址+页目录项的长度→页目录项的物理地址?

 

2.从示意图图中挖掘出隐含信息

Key:
    ·多做题,多看,多积累,熟悉各种常见图示
    ·特别注意:TLB组相联映射、全相联映射的图示画法
    ·深入理解组相联映射、全相联映射方式下查询TLB的原理区别

 

3.基于地址转化过程的分析

Key:自己手绘流程图,捋一遍
熟悉各种状况下地址转化的过程(自己画图复习)
    一级页表+虚拟内存+TLB
    二级页表+虚拟内存+TLB

三:TLB、页表、Cache的关系

四:文件系统示意图

猜你喜欢

转载自blog.csdn.net/liu17234050/article/details/124369317