操作打卡
PV操作类大题
历年题目类型
生产者消费者问题—— 进程间关系为“生产资源-消费资源”🍈理发师问题—— 进程关系为“服务-被服务”🎉读者写这问题—— 同类进程不互斥、异类进程互斥🏆哲学家进餐问题—— 只有一类进程,每个进程需要同时拥有多种资源单纯同步问题—— 前驱后继图
生产者消费者问题
5步骤
- 理清楚有几类进程?一个进程对应一个函数。
- 每个函数内部,中文描述动作,(
只执行1次,不加while();重复执行,加while()) - 分析每个动作之前需要
P(占用)什么? 动作结束需要V(释放)什么? - 所有P、V写完之后再去定义信号量,思考初值是多少?
- 检查P连续出现的地方,是否存在死锁?有,则适当调整P的前后顺序。
2.3-7
答案👇
- 定义的信号量,最好用//在后面加注释
2.3-8
答案👇
info 提示塊標籤
2.3-12
哲学家进餐问题
- 哲学家问题的关键点是限制并行,主要是三种思路
- 1.
限制申请资源的顺序(不建议)
如:规定单号哲学家先取筷子,双号先取右筷子 - 2.
限制并发进程数(通用,并发度不高)
如:规定同一时间只能有一个哲学家就餐 - 3.
让进程一口气取的所有资源后,再运行(通用,并发度较高)
如:哲学家只有能够取的两个筷子的时候才能就餐
2.3-24
答案👇
n个哲学家围坐圆桌,由于哲学家左边的筷子,同时是上一位哲学家右边的筷子。
- 用数组
chopsticks[]表示筷子资源 - 第i号哲学家左筷子为
chopsticks[i];右筷子为chopsticks[(i+1)%n] - 本题采用方案3,
一次性申请完所有资源。同一时刻只允许一个哲学家申请资源。
semaphore mutex; //互斥信号量; semaphore bowl; //碗资源; semaphore chopsticks[i]; //筷子资源;哲学家i(){
while(1){
P(mutex);
P(chopsticks[i]); //拿左筷子;
P(chopsticks[(i+1)%n]);//拿右筷子;
P(bowl);//拿碗;
V(mutex);
吃饭;
V(bowl); //还碗;
V(chopsticks[(i+1)%n]); //还右筷子;
V(chopsticks[i]); //还左筷子
}
}
单纯同步互斥问题
2.3-27
答案👇
2017-46
答案👇
2023-45
答案👇
Swap指令由硬件实现,原理如下
2023-46
答案👇
理发师问题
理发师问题拆解:
- 顾客(被服务)
- 如何使用代码表示“
取号”? - 是否有等待区“
座位上限”?- 有座位上限的->
信号量(empty、full) or int变量都可以 - 没有座位上限的->只能
int 变量
- 有座位上限的->
- 座位满时,是
等待还是直接离开?- 座位满等待时->可以是
信号量 or int变量 - 直接离开时->只能是
int变量,不能阻塞直接return
- 座位满等待时->可以是
- 如何使用代码表示“
- 服务人员(提供服务)
- 如何使用代码表示“
叫号”? - 没有顾客时,应该”
盲等(一直循环检查)“还是“睡觉”?
- 如何使用代码表示“
2.3-14
答案👇
- 本题空座椅有数量限制->即可选择int变量,也可选择信号量,但是题目要求是没有座位直接离开
return,那么就只能用int变量,如果用信号量就会阻塞而不是直接离开 - 开始时的
semaphore service = 0;因为只有叫号后,才提供服务
2.3-6
答案👇
- 本题有叫号,实际中叫号取号都是有
顺序的,所以需要int 型变量。 - 有顾客数量
限制可以用信号量机制,没有数量上限就用int变量。 - 注意,一开始的
semaphore service = 0;因为只有叫号后才提供服务服务
int waiting = 0; //表示已取的号码/顾客数量
semaphore mutex=1; //互斥信号量
semaphore service=0; //服务员资源Customer_i(){
P(mutex);
取号;
wating++;
V(mutex);
等待被叫号;
P(service);
被服务;
}Service_j(){
while(1){
P(mutex);
if(waiting>0){
叫号;
waiting–;
V(mutex);
V(service);
提供服务
}
else(){
V(mutex);
做其他事;
}
}
}
2.3-19
答案👇
1 | //我写的,不太对 |
读者写者问题
- 多个读者可以并行的读,由第一个读进程
lock,由最后一个读进程unlock - 写进程永远只能一个一个写,所以每个写都要对文件
lock与unlock
2.3-15
答案👇
1 |
|
测试8
答案👇
读优先: 常规写法,写会被阻塞,读能一直进入,会导致写饥饿.写优先: 比较复杂,不容易考读写公平: 利用排队队列,实现先来先服务。
读优先🥝
1 | semaphore lock=1; //⽤于实现对共享⽂件的互斥访问 |
读写公平🎄
1 | semaphore lock=1; //⽤于实现对共享⽂件的互斥访问 |
文件系统
文件系统整理👇
- 将文件的各种
属性的信息包括地址的信息存放在索引结点中,使得FCB变得更加简洁。 - 其中inode中的
地址信息,分为直接地址、一级间接地址、二级间接地址
- 直接地址:指向的物理块存放的就是文件信息。
- 一级间接地址:指向的整个物理块存放的全是直接地址。
- 二级间接地址:指向的整个块存放的全是一级间接地址。
- 注意,inode结点,并不是一整个块的大小
2011-46 顺序分配
答案👇
2016-47 链式分配(显式)
答案👇
FAT-File Allocation Table 文件分配表 - 显示链接分配标志
2012-46 索引分配
答案👇
2014-46
答案👇
2018-46
答案👇
考点
- 操作系统的概念、特征和功能
- 内核态和用户态
- 中断、异常
- 系统调用
- 操作系统的引导
- 进程与线程
- 进程状态与进程控制
- 处理及机制
- 进程同步与互斥
- 经典同步问题
- 死锁
- 内存管理概念
- 连续分配管理方式
- 非连续分配管理方式
- 虚拟页式存储管理
- 文件元数据和索引结点
- 文件的操作
- 文件共享和保护
- 磁盘组织与管理
- IO控制方式
- IO软件的层次结构
- IO调度和缓冲区
- 设备分配与回收











































