2.5 经典进程的同步问题
- 哲学家进餐问题
至多只允许有四位哲学家同时去拿左边的筷子
eat = 4;//信号量初值为4
Pro {
wait(eat);
wait(c[i]);
wait(c[i+1]);
使用R;
signal(c[i]);
signal(c[i+1]);
signal(eat);
}
2.问题描述
两个人下棋,一方执黑棋,一方执白棋。要求双方轮流下子。给出两种情况的解决办法:
1)执黑子一方先下;
2)双方都可以先下,谁先抢到棋盘谁先下。然后开始轮流下子。
解:1)
s1 = 1,s2 = 0;
P1{
while(1)
{
wait(s1);
放黑子;
signal(s2);
}
}
P2{
while(1)
{
wait(s2);
放白子;
signal(s1);
}
}
m = 1;s1,s2;
P1{
wait(m);
s1 = 1,s2 = 0;
signal(m);
while(1)
{
wait(s1);
放黑子;
signal(s2);
}
}
P2{
wait(m);
s2 = 1,s1 = 0;
signal(m);
while(1)
{
wait(s2);
放白子;
signal(s1);
}
}
3.嗜睡的理发师问题
问题描述:一个理发店有N个沙发,1个理发椅;
理发师:
持续睡觉,理发,收钱的动作
顾客:
若有沙发,进入等待;否则离开。
理发椅空,一顾客放弃沙发,去唤醒它理发;
理发后付费,付费完毕离开理发椅,离店。
顾客之间对于椅子和沙发的关系
2.6 进程通信
1.消息传递系统(发–收方式)
- 最广泛使用的一种,进程间的数据交换,以格式化的消息为单位。屏蔽底层复杂操作。
- 单机:操作系统底层编程中的消息传递系统调用;
- 计算机网络:消息称为报文。程序员直接利用系统提供的一组通信命令(原语)进行通信。(④客户机-服务器系统)
2.单机和网络环境下的高级进程通信广泛采用“消息传递”方式,需考虑的问题: - 通信链路的建立
- 消息格式
- 同步方式
3.通信链路的建立 - 计算机网络的环境下,用原语显式建立/拆除链路;
- 单机系统只须利用系统原语,进程间链路由系统自动管理。
4.消息的格式
网络环境下,“大头+正文”,消息格式复杂。
2.7 线程(Threads)的基本概念
2.8 线程的实现
2.7和2.8节非重点。