经典进程同步问题

  • 1 )生产者—消费者问题(合作互斥)
    • 1)利用记录型信号量解决
    • 2)利用AND型信号量解决
  • 2)哲学家进餐问题(资源耗尽,避免死锁)
    • 1)利用记录型信号量解决
    • 2)利用AND型信号量解决
  • 3)读者—写者问题(互斥问题)
    • 1)记录型信号量解决 (写者优先)
    • 2)利用信号量集解决有限同时读
    • 3)读者—写者写操作优先:
    • 4)读者—写者问题公平竞争

1 )生产者—消费者问题(合作互斥)

是相互合作的进程关系的一种抽象,同时也包含着进程的互斥。

分析 :

  • 空缓冲区不为空,生产者才能将生产的数据放入缓冲区中。
  • 满缓冲区不为空,消费者才能从缓冲区中取数据。
  • 为了保证进程同步,生产者与消费者不可以同时访问缓冲区。

1)利用记录型信号量解决

in ;out;//生产者消费者指针
mutex//缓冲池互斥信号量
empty//缓冲池空缓冲区数量
full//缓冲池满缓冲区数量
/*buffer数组是用来表示缓冲区的,而empty和full是用来表示缓冲区
的空闲和使用情况的*/
//生产者
int in=0, out=0;
item buffer[n];
semaphore mutex=1, empty=n, full=0;
void proceducer() {do {producer an item nextp;//生产者生产的产品放入nextp中...wait(empty);//查看有无空闲的缓冲区wait(mutex);//使进程互斥buffer[in] =nextp;//把nextp中的产品送往buffer(in)in :=(in+l) % n;//指针偏移signal(mutex);//释放资源signal(full);//满缓冲区加1}while(TRUE);
}
//消费者
void consumer() {do {wait(full);//查看缓冲区是否有数据wait(mutex);//进程互斥nextc= buffer[out];//从buffer(out)中取出产品放入nextcout =(out+l) % n;//指针偏移signal(mutex);//释放资源signal(empty);//空缓冲区加1consumer the item in nextc;//消费nextp中产品}while(TRUE);
}
void main() {cobeginproceducer(); consumer();coend
}

注意 :

  • 互斥的wait(mutex)和signal(mutex)必须成对地出现;
  • 对资源信号量empty和full的wait和signal操作,同样需要成对地出现,但它们分别处于不同的程序中。
  • 每个程序中的多个wait操作顺序不能颠倒。应先执行对资源信号量的wait操作,然后再执行对互斥信号量的wait操作,否则可能引起进程死锁。

2)利用AND型信号量解决

即同时实现wait(empty)与wait(mutex)操作,与实现signal(mutex)与signal(full)操作。

  • Swait(empty, mutex) 代替 wait(empty)和 wait(mutex);
  • Ssignal(mutex, full) 代替 signal(mutex)和 signal(full);
  • Swait(full, mutex) 代替 wait(full)和 wait(mutex)
  • Ssignal(mutex, empty) 代替Signal(mutex)和Signal(empty)

代码如下 :

int in=0, out=0;
item buffer[n];
semaphore mutex=1, empty=n, full=0;
void proceducer() {do {producer an item nextp;Swait(empty, mutex);buffer[in] =nextp;in :=(in+1) % n;Ssignal(mutex, full);}while(TRUE);
}void consumer() {do {Swait(full, mutex);nextc= buffer[out];out =(out+l) % n;Ssignal(mutex, empty);consumer the item in nextc;}while(TRUE);
}

2)哲学家进餐问题(资源耗尽,避免死锁)

临界资源的使用,避免死锁状况的产生。

解决方法 :

  • 记录型信号量:至多只允许有四位哲学家同时去拿左边的筷子, 最终能保证至少有一位哲学家能够进餐,并在用毕时能释放出他用过的两只筷子, 从而使更多的哲学家能够进餐。

  • AND型信号量: 仅当哲学家的左、 右两只筷子均可用时,才允许他拿起筷子进餐。

  • 数学方法:规定奇数号哲学家先拿他左边的筷子,然后再去拿右边的筷子;而偶数号哲学家则相反。按此规定,将是1、 2号哲学家竞争1号筷子; 3、 4号哲学家竞争3号筷子。即五位哲学家都先竞争奇数号筷子, 获得后, 再去竞争偶数号筷子, 最后总会有一位哲学家能获得两只筷子而进餐。

1)利用记录型信号量解决

//以第i位哲学家举例
semaphore chopstick[5]={ 1, 1, 1, 1, 1};
do {wait(chopstick[i]);wait(chopstick[(i+1)%5]);//eatsignal(chopstick[i]);signal(chopstick[(i+l)%5]);//think
}while[TRUE];

2)利用AND型信号量解决

semaphore chopstick chopstick[5]={ 1, 1, 1, 1, 1);
do {...//thinkSswait(chopstick[(i+1)%5], chopstick[i]);//eatSsignal(chopstick[(i+1)%5], chopstick[i]);
}while[TRUE];

3)读者—写者问题(互斥问题)

互斥进程的管理 :

分析 :

  • 允许多个读者同时执行读操作
  • 不允许读者、写者同时操作
  • 不允许多个写者同时操作

1)记录型信号量解决 (写者优先)

读进程只要看到有其他读进程正在访问文件,就可以继续作读访问;写进程必须等待所有读进程都不访问时才能写文件,即使写进程可能比一些读进程更早提出申请。所以以上解法实际是 读者优先 的解法。

wmutex//读写互斥
readcount//读进程数目
rmutex//读进程计数

semaphore rmutex= 1, wmutex= 1;
int readcount=0;//读进程
void reader() {do {wait(rmutex);//申请读,对读数更改if (readcount==0) wait(wmutex);/*第一个进入进行检验,防止正在写的情况*/readcount++;signal(rmutex);//释放读...perform read operation;...wait(rmutex);//申请读,对读数更改readcount--;//读者数减1if (readcount==0) signal(wmutex);//最后一个离开,唤醒写进程signal(rmutex);//释放读}while(TRUE);
}
//写进程
void writer()
{do {wait(wmutex);//申请写互斥信号量perform write operation;signal(wmutex);//释放信号量}while(TRUE);
}
void main(){cobeginreader(); writer();coend
}

2)利用信号量集解决有限同时读

  • 允许RN个读者同时执行读操作
  • 不允许读者、写者同时操作
  • 不允许多个写者同时操作
int RN;
semaphore L=RN, mx=1;
void reader()
{do {Swait(L, 1, 1);//L,下限为1,需求量为1Swait(mx, 1, 0);/*互斥信号量,下限为1,需求为0,当有写时mx为0,读失败*/...perform read operation;...Ssignal(L, 1);//释放资源}while(TRUE);
}
void writer()
{do {Swait(mx, 1, 1; L, RN, 0);/*既无writer写(mx=1),也无reader读(L=RN),writer进入临界区写*/perform write operation;Ssignal(mx, 1);}while(TRUE);
}

3)读者—写者写操作优先:

每个读进程最开始都要申请一下S信号量,之后在真正做读操作前即让出(使得写进程可以随时申请到 S)。而只有第一个写进程需要申请 S,之后就一直占着不放了,直到所有写进程都完成后才让出。等于只要有写进程提出申请就禁止读进程排队,变相提高了写进程的优先级。

semaphore rmutex=1,wmutex= 1, S=1, w=1;
int Readcount=0, Writecount=0;//读进程
void reader() {do {wait(S);//对读进程加以限制wait(rmutex);//读计数if(Readcount=0)wait(wmutex);//在无读者的情况下检验是否在写Readcount++;//读者数加1signal(rmutex);//释放读计数signal(S);//加以限制...perform read operation;...wait(rmutex);Readcount--;if(Readcount=0)signal(wmutex);//最后一个;离开唤醒写进程signal(rmutex)}while(TRUE);
}

void writer{do {wait(w);if(Writecount=0)wait(S);//此时新的读者无法再进入读Writecount++;siganl(w);wait(wmutex);//写进程被唤醒后进行写操作...perform write operation;//此时一直占据着信号量S,写进程一旦进入则顺序执行...signal(wmutex);wait(w);Writecount--;if(Writecount=0)signal(S);//当所有写进程完成才归还信号量,读者可以再次进入临界区siganl(w);
}while(TRUE);
}

4)读者—写者问题公平竞争

方法相同,读写排队,谁先到拿到S,谁先操作。

void reader() {do {wait(S);//对读进程加以限制wait(rmutex);//读计数if(Readcount=0)wait(wmutex);//在无读者的情况下检验是否在写Readcount++;//读者数加1signal(rmutex);//释放读计数signal(S);//加以限制...perform read operation;...wait(rmutex);Readcount--;if(Readcount=0)signal(wmutex);//最后一个;离开唤醒写进程signal(rmutex)}while(TRUE);
}
void writer(){while(1){wait(S);//读写同时排队,谁先来谁先用wait(wmutex);signal(S);...perform write operation...signal(wmutex);}
}

计算机操作系统经典进程同步问题相关推荐

  1. 计算机操作系统——经典进程的同步问题

    计算机操作系统--信号量机制与经典进程的同步问题 信号量机制 随着发展,信号量从整型信号量经记录型信号量,进而发展为"信号量集"机制. 一般来说,信号量的值与相应的资源的使用情况有 ...

  2. 计算机操作系统专题一:多道环境下进程同步与互斥制约关系的学习

    1. 问题描述 设自行车生产线上有一只箱子,其中有N个位置(N≥3),每个位置可存放一个车架或一个车轮,又设有三名工人,其活动分别为: 2. 问题分析(包括涉及的知识点.制约关系分析.问题的解决思路等 ...

  3. 面试「计算机操作系统」知识点大集合!

    作者:CyC2018 链接:https://github.com/CyC2018/CS-Notes/blob/master/docs/notes/计算机操作系统.md 一.概述 基本特征 1. 并发 ...

  4. 操作系统04进程同步与通信

    4.1 进程间的相互作用 4.1.1 进程间的联系 资源共享关系 相互合作关系 临界资源应互斥访问. 临界区:不论是硬件临界资源,还是软件临界资源,多个进程必须互斥地对它们进行访问. 把在每个进程中访 ...

  5. 计算机操作系统课程有什么关系,计算机操作系统课程教学大纲(洪联系).doc

    计算机操作系统课程教学大纲(洪联系) 附件2:集美大学 操作系统课程 课程教学大纲 第 1 页共 6 页课程名称中文:计算机操作系统英文:Computer Operating System课程编号80 ...

  6. 计算机操作系统 学习笔记(第四版 汤小丹)(上)

    第一章-操作系统概述 操作系统基本概念 操作系统(Operation System),简称OS,是管理计算机『硬件』与『软件』资源的计算机程序.它负责计算机的全部软.硬资源的分配.调度工作,控制和协调 ...

  7. 《计算机操作系统》复习提纲

    第一章 操作系统引论 *1 操作系统的定义.作用 定义: 操作系统是计算机系统中的一个系统软件,它是这样一些程序模块的集合:能有效地组织和管理计算机系统的硬件和软件资源,合理地组织计算机工作流程,控制 ...

  8. 天津理工大学计算机操作系统期末知识点复习

    天理计算机中加专业期末操作系统复习 文章目录 天理计算机中加专业期末操作系统复习 第一章(操作系统导论) 第二章(进程管理) 第三章(处理机调度) 第四章(存储器系统) 第五章(设备管理) 学弟学妹们 ...

  9. 计算机操作系统(第四版)

    计算机操作系统(第四版) 引论 目标:方便性,有效性,可扩展性,开放性 作用 用户与计算机硬件系统之间的接口 计算机系统资源的管理者 对计算机资源的抽象 发展动力 不断提高计算机资源利用率 方便用户 ...

最新文章

  1. macos关闭软件更新小红点_如何一键消除手机上的小红点?请看这招...
  2. Java中字符串工具类继承org.apache.commons.lang3.StringUtils类代码
  3. 企业网站 源码 服务邮箱:_口碑营销:乌海腾讯企业邮箱服务报价
  4. ASP渲染下拉框使时间依次减少
  5. leetcode1267. 统计参与通信的服务器(dfs)
  6. Awesome Tools Site
  7. mysql3.5 所有表_mysql学习笔记3.5
  8. Oracle物化视图和普通视图区别
  9. UIWindow statusBar消失
  10. 软件项目版本号命名规则
  11. springboot批量更新实体_springboot使用druid批量更新报错
  12. 值得推荐的13款可视化软件,快收藏!
  13. 08.第三章 数字特征与特征函数(1)
  14. 6种方法轻松将PDF转换为Word文档,办公必备!
  15. Ionic页面的生命周期 (事件)
  16. python中sys模块下载_怎样进行python sys模块安装及使用
  17. WPS--world使用格式刷
  18. 《编程之美》学而思 - 最大公约数问题
  19. 个人理财类书籍推荐 -- From一亩三分地 帖子
  20. dell服务器设置CPU高性能,DellR720服务器提示cpu1 internal error (IERR)

热门文章

  1. word文档画笔添加后灰色无法启用!
  2. 关键词排名提升(提升关键词排名的方法)
  3. 【区块链基础】4——ETH区块结构
  4. android和chrome的发展与未来[j].移动通信,基于Android手机app开发与设计 毕业设计 开题报告...
  5. 走近棒球运动·韩国职业棒球联盟·MLB棒球创造营
  6. 解决潘多拉路由器固件使用AIDISK共享优盘,出现U盘每次爆满问题
  7. 2018年就要过去了
  8. 25 岁,毕业写前端的这三年,多益网络java面试
  9. evc小项目:Gps功分器测试
  10. 计算机专升研学院推荐,【解析】专升硕院校专业推荐