操作系统
信号量:边
进程:点
实现一个银行系统,该银行设置有M个窗口。每个用户需要先取号,只有一台取号机。用户分为对公用户,私人用户。私人用户又分为普通用户,VIP用户。其中窗口的柜员在服务时,按优先级给用户服务,其中对公用户的优先级最高,VIP用户次之,普通用户优先级最低。请使用同步与互斥解决此银行的叫号服务系统。
https://blog.csdn.net/Yun_Ge/article/details/89048991
- 几个关系=几个信号量,相当于点之间的线段
对公-VIP,VIP-私人,共2个关系,设置2个信号量 - 实现进程互斥
semaphore mutex;
mutex=1; // 互斥,初始化为 1
while(1){
wait(mutex); //p操作-1且阻塞
临界区;
signal(mutex); //v操作+1且唤醒
剩余区;
}
- 实现前趋关系
main(){
Semaphore a,b,c,d,e,f,g;
a.value=0;b.value=0;c.value=0;
d.value=0;e.value=0;f.value=0;g.value=0;
//以下代码并发执行
{ S1;signal(a);signal(b); }
{ wait(a);S2;signal(c) ;signal(d);}
{ wait(b);S3;signal(e); }
{ wait(c);S4;signal(f); }
{ wait(d);S5;signal(g); }
{ wait(e);wait(f);wait(g);S6; }
}
4. 实现进程同步
用户态转内核态
主动系统调用sysCall (系统接口)
中断 (I/O设备完成I/O任务)
异常 (÷0)
I/O操作都会让running陷入waiting
快表节省了找页表的时间,但找到后仍要从内存访问取出数据
读者优先:插队读者一起读,读者可插 写者 的队;写者无限等待
写者优先:连续读者一起读,读者不可插写者队;读写公平