[操作系统] 操作系统11-同步
作者:CC下载站 日期:2020-04-01 22:45:48 浏览:80 分类:玩电脑
信号量
就是一个整型加上一个队列
1
2
3
4
class Semaphore{
int sem;
WaitQueue q;
}
P操作
让信号量减少1,如果<0,把自己挂起
1
2
3
4
5
6
7
8
// 有原子性
P(){
sem--;
if(sem<0){
Add this thread to q;
block(t);
}
}
V操作
让信号量加1,如果≤0,唤醒挂起的一个线程
1
2
3
4
5
6
7
8
// 有原子性
V(){
sem++;
if(sem<=0){
Remove a thread t from q;
wakeUp(t);
}
}
简单的同步
这是A的代码
1
2
do a1这是B的代码
do a2
1
2
do b1我们需要保证a2在b1之后执行,应该怎么办? 我们可以让信号量设为0,如果A先执行完a1,则P()导致阻塞,当B执行完b1以后,A被唤醒,代码如下
do b2
1
2
3
do a1
P()
do a2
1
2
3
do b1
V()
do b2
生产者与消费者
任何时间只有一个线程操作缓冲区(互斥) 当缓冲区空,消费者要等待生产者(同步) 当缓冲区满,生产者等待消费者(同步) 所以我们需要一个互斥量,两个个信号量
1
2
3
mutex = 1; // 互斥量生产者
fullBuffers = 0; // 缓冲区满的信号量
emptyBuffers = n; // 缓存区空的信号量
1
2
3
4
5
emptyBuffers.P(); // 我们要生产之前需要判断空缓冲区的信号量,如果空间不足就要阻塞
mutex.P(); // 进入临界区
Add
mutex.V(); // 退出临界区
fullBuffers.V(); // 释放
消费者
1
2
3
4
5
fullBuffers.P();
mutex.P();
Del
mutex.V();
emptyBuffers.V();
mutex.V和fullBuffers.V可以交换,但是P不行,会死锁
管程
包含了一个锁,包含了很多条件变量
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Condition{想想如何用管程实现生产者消费者 一个锁lock+两个条件变量notFull和notEmpty+一个计数器记录缓冲区的食物数量
int numWaiting=0; // 队列中的元素个数
WaitQueue q;
void Wait(lock){
numwaiting++;
Add this thread to q;
release(lock);
schedule();
require(lock);
}
void Signal(){
if(numWaiting>0){
Remove a thread t from q;
wakeup(t);
numWaiting--;
}
}
}
1
2
3
4
5
6
// 生产者
lock.require();
while(count==n) notFull.Wait(&lock); // 如果满了就等待,参加上面的wait会释放锁
Add, count++;
notEmpty.Signal(); // 生产了以后就可以去唤醒别人了
lock.Release();
1
2
3
4
5
6
// 消费者
lock.require();
while(count==0) notEmpty.Wait(&lock);
Del, count--;
notFull.Signal();
lock.Release();
注意到消费者的Signal后,有两种选择,第一是继续执行,直到release,第二是将CPU交给被唤醒的线程去执行管程, 我们先考虑第一种方案,当唤醒线程以后,自己的release执行完以前,没有任何其他线程能够进入临界区,当自己release以后,我们来考虑所有的生产者,有若干个被唤醒的线程已经在临界区里面了,可能还有一些生产者也在临界区中然而没有被唤醒,这种我们不用管他,还有一种在临界区外正准备争夺临界区的控制,所以,为了避免那些临界区外和若干个临界区内被唤醒的线程发生冲突,我们必须用while来保证只有一个线程再次获得控制权。 为什么会有若干个未被唤醒的线程出现在临界区中? 我们考虑这样一种情况,此时缓冲区食物满了,一个生产者进入了临界区,发现count=n,于是开始wait,这导致了锁被释放,之后就有两个分支了,要么是又来了一个生产者争夺了锁,要么来了一个消费者开始消费,如果来的是生产者,他发现count=n,又会开始wait,这就是为什么会出现多个未被唤醒的生产者出现在临界区中。 为什么会有若干个被唤醒的线程出现在临界区中,我们先考虑现在只有一个未被唤醒的生产者在临界区,此时cpu在消费者手中,当消费者signal以后,会唤醒生产者,但是生产者不见得能拿到CPU,当消费者release以后,临界区的那个生产者跃跃欲试,然后临界区外面还有一群生产者也在等着呢,要是他们拿到了,临界区中的生产者虽然被唤醒,但是还是会被require阻塞,这种情况下,被唤醒的生产者就一个接一个的被阻塞了。 如果我们改进CPU,使用第二种方法,让被唤醒的线程去执行管程,那就不会发生上面的问题,我们的while可以换位if,但是这样的CPU难以设计。
读者与写者
两个信号量countMutex和writeMutex,一个整形Rcount # 读者优先
1
2
3
4
5
6
// write
lock(writeMutex); // 上锁,私有锁
write
unlock(writeMutex);
1
2
3
4
5
6
7
8
9
10
11
12
// 写者
lock(CountMutex); // 上私有锁
if(Rcount=0) lock(writeMutex); // 读者的锁共享
++Rcount
unlock(CountMutex);
read;
lock(CountMutex); // 上私有锁
--Rcount
if(Rcount=0) unlock(writeMutex); // 读者的锁共享
unlock(CountMutex);
写者优先
使用管程实现
1
2
3
4
5
6
7
8
9
10
void read(){
wait until no writers; // 等待所有的活跃的读者和等待的读者
read;
wakeup waiting writers; // 唤醒等待的读者
}
void write(){
wait until no readers/writers; // 等待活跃的读者和活跃的写者
write;
wakeup waiting readers/writers; // 优先唤醒等待的写者
}
哲学家进餐
错误: 先拿左边,再拿右边,如果右边没拿到则放下左边的,然后等待一段时间, 可能导致饥饿 错误: 让筷子变成互斥的,导致只有一个人能够吃面条
1
2
3
4
if(state[i]==HUNGRY&&state[LEFT]!=EATING&&state[RIGHT]!=EATING){
state[i]=EATING;
V(s[i]);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
think();
P(mutex);
state[i]=HUNGRY;
test_take_left_right_forks(LEFT); // 自己吃
V(mutex);
P(s[i])
eat();
P(mutex);
state[i]=THINKING;
test_take_left_right_forks(LEFT); // 左邻居吃
test_take_left_right_forks(RIGHT); //右邻居吃
V(mutex);
猜你还喜欢
- 09-06 [系统技巧] windows中,端口查看 关闭进程及Kill使用
- 09-06 [系统教程] Windows系统Git安装教程(详解Git安装过程)
- 06-26 [系统技巧] 远程桌面连接(mstsc)全攻略
- 03-29 [玩系统] Windows下强大的命令终端-Cmder
- 03-29 [系统技巧] Win10右键菜单添加“获取文件管理员权限”选项
- 03-29 [系统技巧] win10删除文件夹需要Administrator权限
- 03-09 [网络技巧] 如何使用IPv6地址直接访问http,https服务及Windows共享文件夹[UNC路径]
- 11-05 [系统技巧] 真的有后悔药!Win10超给力的备份功能你用过吗
- 11-05 [系统技巧] 发现Win11、Win10备份已禁用?帮你快速解决!
- 11-05 [电脑技巧] 科普|F1-F12快捷键有什么用?
- 11-05 [系统技巧] 永劫无间游戏卡顿、闪退 只需检查电脑这个设置
- 11-05 [系统技巧] Win10出现Runtime Error如何修复
取消回复欢迎 你 发表评论:
- 精品推荐!
-
- 最新文章
- 热门文章
- 热评文章
[电视剧] 芈月传 【全集81集全】【未删减版】【国语中字】【2015】【HD720P】【75G】
[电视剧] 封神榜 梁丽版 (1989) 共5集 480P国语无字 最贴近原著的一版【0.98 G】
[影视] 【雪山飞孤4个版本】【1985、1991、1999、2007】【1080P、720P】【中文字幕】【167.1G】
[资料] 24秋初中改版教材全集(全版本)[PDF]
[电影] 高分国剧《康熙王朝》(2001)4K 2160P 国语中字 全46集 78.2G
[动画] 迪士尼系列动画139部 国英双语音轨 【蓝光珍藏版440GB】
[电影] 莫妮卡贝鲁奇为艺术献身电影大合集 1080P超清 双语字幕
[电影] DC电影宇宙系列合集18部 4K 高码率 内嵌中英字幕 273G
[音乐] 【坤曲/4坤时】鸡你太美全网最全,385首小黑子战歌,黄昏见证虔诚的信徒,巅峰诞生虚伪的拥护!
[音乐] 用餐背景音乐大合集 [MP3/flac]
[书籍] 彭子益医书合集 [PDF/DOC]
[游戏] 《黑神话悟空》免安装学习版【全dlc整合完整版】+Steam游戏解锁+游戏修改工具!
[动画] 《名侦探柯南》名侦探柯南百万美元的五菱星 [TC] [MP4]
[电视剧集] [BT下载][黑暗城市- 清扫魔 Dark City: The Cleaner 第一季][全06集][英语无字][MKV][720P/1080P][WEB-RAW]
[动画] 2002《火影忍者》720集全【4K典藏版】+11部剧场版+OVA+漫画 内嵌简日字幕
[剧集] 《斯巴达克斯》1-4季合集 无删减版 1080P 内嵌简英特效字幕
[CG剧情] 《黑神话:悟空》158分钟CG完整剧情合集 4K120帧最高画质
[游戏] 黑神话悟空离线完整版+修改器
[短剧] 被下架·禁播的羞羞短剧·午夜短剧合集
[图像处理] 光影魔术手v4.6.0.578绿色版
[影视] 美国内战 4K蓝光原盘下载+高清MKV版/内战/帝国浩劫:美国内战(台)/美帝崩裂(港) 2024 Civil War 63.86G
[影视] 一命 3D 蓝光高清MKV版/切腹 / 切腹:武士之死 / Hara-Kiri: Death of a Samurai / Ichimei 2011 一命 13.6G
[影视] 爱情我你他 蓝光原盘下载+高清MKV版/你、我、他她他 2005 Me and You and Everyone We Know 23.2G
[影视] 穿越美国 蓝光原盘下载+高清MKV版/窈窕老爸 / 寻找他妈…的故事 2005 Transamerica 20.8G
[电影] 《黄飞鸿》全系列合集
[Android] 开罗游戏 ▎像素风格的模拟经营的游戏厂商安卓游戏大合集
[游戏合集] 要战便战 v0.9.107 免安装绿色中文版
[书籍] 彭子益医书合集 [PDF/DOC]
[资源] 精整2023年知识星球付费文合集136篇【PDF格式】
[系统]【黑果小兵】macOS Big Sur 11.0.1 20B50 正式版 with Clover 5126 黑苹果系统镜像下载
- 最新评论
-
谢谢分享感谢ppy2016 评论于:11-05 谢谢分享感谢ppy2016 评论于:11-05 怎么没有后续闲仙麟 评论于:11-03 怎么没后续闲仙麟 评论于:11-03 有靳东!嘻嘻奥古斯都.凯撒 评论于:10-28 流星花园是F4处女作也是4人集体搭配的唯一一部!奥古斯都.凯撒 评论于:10-28 找了好久的资源,终于在这里找到了。感谢本站的资源和分享。谢谢AAAAA 评论于:10-26 找了好久的资源,终于在这里找到了。感谢本站的资源和分享。谢谢password63 评论于:10-26 找了好久的资源,终于在这里找齐了!!!!blog001 评论于:10-21 找了好久的资源,终于在这里找齐了!!!!blog001 评论于:10-21
- 热门tag