目录

1. Reader-Writer问题

2. 共享缓冲区问题

3. 面包师问题

4. 吸烟者问题

1. Reader-Writer问题

多个Reader进程,多个Writer进程,共享文件F

允许多个Reader进程同时读文件

不允许任何一个Writer进程与其他进程同时访问(读或写)文件

写出 Reader-Writer 问题的改进算法

避免由于不断有 Reader 出现而使得 Writer 无限期等待

int rc = 0; //reader的个数
Semaphore_t mutex = 1; //互斥对 rc 的访问
Semaphore_t f = 1; // 互斥对文件 F 的访问
Semaphore_t writer_wait = 1; // 当前是否有 writer 正在等待void reader() {while (1) {P(&writer_wait)P(&mutex); // 互斥对 rc 的访问rc++;if (rc == 1) P(&f);//第一个读者V(&mutex);V(&writer_wait);read_file(); //读文件 FP(&mutex);rc--;if (rc == 0) V(&f);//最后一个读者V(&mutex);use_data();}
}void writer() {while (1) {form_data();//准备数据P(&writer_wait);P(&f);write_file();//写文件V(&f);V(&writer_wait);}
}

2. 共享缓冲区问题

三个进程P1、P2、P3互斥使用一个包含N(N>0)个单元的缓冲区。
P1每次用produce()生成一个正整数并用put()送入缓冲区某一空单元中;
P2每次用getodd()从该缓冲区中取出一个奇数并用countodd()统计奇数个数;
P3每次用geteven()从该缓冲区中取出一个偶数并用 counteven()统计偶数个数。
试用信号量的P、V操作设计该问题的同步算法,给出所用共享变量(如果需要)和信号量及其初始值,并说明各自的含义。

Semaphore_t mutex = 1; //互斥对缓冲区的访问
Semaphore_t buffer = N; //缓冲区剩余资源数
Semaphore_t cur_odd = 0; //目前缓冲区中的奇数个数
Semaphore_t cur_even = 0; //目前缓冲区中的偶数个数P1() {while (true) {data = produce();P(&buffer);P(&mutex);put();V(&mutex);if (data % 2 == 1) V(&cur_odd);else V(&cur_even);}
}P2() {while (true) {P(&cur_odd);P(&mutex);getodd();countodd();V(&mutex);V(&buffer);}
}P3() {while (true) {P(&cur_even);P(&mutex);geteven();counteven();V(&mutex);V(&buffer);}
}

3. 面包师问题

面包师有很多面包和蛋糕,由N个销售人员销售。
每个顾客进店后先取一个号,并且等着叫号。
当一个销售人员空闲下来,就叫下一个号。
试用信号量的P、V操作设计该问题的同步算法,给出所用共享变量(如果需要)和信号量及其初始值,并说明各自的含义。

int num_clerk = 0; //销售人员叫号值
int num_customer = 0; //顾客取号值
Semaphore_t clerks = N; //销售人员个数
Semaphore_t customers = 0; //正在等待的顾客数
Semaphore_t mutex_clerk = 1; //互斥取号操作
Semaphore_t mutex_customer = 1; //互斥叫号操作//销售
Clerk() {while (true) {P(&customers);P(&mutex_clerk);num_clerk++;V(&mutex_clerk);sell_items(); //销售商品V(&clerks);}
}//顾客进店排队
//顾客买完面包就走了,不需要循环。
Customer() {P(&mutex_customer);get_number(); //取号num_customer++;V(&mutex_customer);V(&customers);P(&clerks);consume(); //购买
}

4. 吸烟者问题

三个吸烟者在一个房间内,还有一个香烟供应者。
为了制造并抽掉香烟,每个吸烟者需要三样东西:烟草、纸和火柴,供应者有丰富货物提供。
三个吸烟者中,第一个有自己的烟草,第二个有自己的纸,第三个有自己的火柴。
供应者随机地将两样不同的东西放在桌子上,允许一个吸烟者进行对健康不利的吸烟。
当吸烟者完成吸烟后唤醒供应者,供应者再随机地把两样不同的东西放在桌子上,唤醒一个吸烟者。
试用信号量的P、V操作设计该问题的同步算法,给出所用共享变量(如果需要)和信号量及其初始值,并说明各自的含义。

Semaphore_t wake = 1; // 香烟供应者状态
Semaphore_t smoker1 = 0; // 第一个吸烟者状态
Semaphore_t smoker2 = 0; // 第二个吸烟者状态
Semaphore_t smoker3 = 0; // 第三个吸烟者状态//香烟提供者
vender() {while (1) {P(&wake);num = Random() % 3; //得到 0 - 2 的随机数if (num == 0)V(&smoker1);else if (num == 1)V(&smoker2);elseV(&smoker3);}
}//第一个吸烟者
smoker1() {while (1) {P(&smoker1);make(); //制作香烟smoke(); //抽烟V(&wake);}
}//第二个吸烟者
smoker2() {while (1) {P(&smoker2);make(); //制作香烟smoke(); //抽烟V(&wake);}
}//第三个吸烟者
smoker3() {while (1) {P(&smoker3);make(); //制作香烟smoke(); //抽烟V(&wake);}
}

[操作系统]进程同步 Reader-Writer问题 共享缓冲区问题 面包师问题 吸烟者问题相关推荐

  1. potplayer 多个进程_操作系统 | 进程同步与进程互斥

    主题            进程同步与进程互斥            01 进程同步  问题 在多道批处理系统中,多个进程是并发执行的,而并发执行的进程具有异步性,也就是说,各个进程以各自独立的.不可 ...

  2. 计算机操作系统进程同步实验报告,操作系统进程同步和互斥的实验报告

    操作系统进程同步和互斥的实验报告 (5页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 9.9 积分 湖南农业大学信息科学技术学院学生实验报告姓名: 年级专 ...

  3. 进程同步算法实现实验报告Linux,操作系统进程同步实验报告.doc

    操作系统进程同步实验报告 实验三:进程同步实验 一.实验任务: (1)掌握操作系统的进程同步原理: (2)熟悉linux的进程同步原语: (3)设计程序,实现经典进程同步问题. 二.实验原理: (1) ...

  4. Go编程技巧--io.Reader/Writer

    Go原生的pkg中有一些核心的interface,其中io.Reader/Writer是比较常用的接口.很多原生的结构都围绕这个系列的接口展开,在实际的开发过程中,你会发现通过这个接口可以在多种不同的 ...

  5. 两台笔记本的操作系统都为xp的共享上网教程

    两台笔记本的操作系统都为xp的共享上网教程(可上网的机器为p1,需要共享上网的机器为p2): 1, 保证p1可以通过有线网上网. 2, 将p1的无线网络配置设置成仅计算机到计算机,路径:无线连接-&g ...

  6. Python CSV Reader/Writer

    Python CSV Reader/Writer 一. 基础背景: Python 天生支持读取CSV 格式数据并且是可配置的. 在 Python 里边有个模块 csv , 它包含了CSV 读取/生成所 ...

  7. 操作系统进程同步例题(三)汽车过桥2

    操作系统进程同步例题(三)汽车过桥2 题目1: 在一个只允许单向行驶的十字路口,分别有若干由东向西,由南向北的车辆在等待通过十字路口.为了安全,每次只允许一辆车通过(比如:东到西或南到北).当有车辆通 ...

  8. golang中的io.Reader/Writer

    本文整理自Go编程技巧–io.Reader/Writer Go原生的包中有一些核心的interface,其中io.Reader/Writer是比较常用的接口.很多原生的结构都围绕这个系列的接口展开,在 ...

  9. 操作系统进程同步例题(一)上机实习

    操作系统进程同步例题(一)上机实习 题目: 某高校计算机系开设网络课并安排上机实习,设机房有共有2m台机器,有2n名学生选该课,规定: (1)每2个学生组成一组,各占一台机器,合作完成上机实习 (2) ...

  10. Java Reader/Writer

    Java Stream相关类是用来处理字节流的,但不适合用来字符流.因为一个字节是8bit,而一个字符是16bit.字符串是由字符组成,字符串类型天然处理的是字符而不是字节.更重要的是,字节流无法知道 ...

最新文章

  1. 创建物化视图commit_oracle 中物化视图讲解
  2. Lucene:依据索引查找文档
  3. OVS 非VXLAN的收发包调用栈(二十二)
  4. 机器学习知识点(三十六)分类器性能度量指标f1-score
  5. hdu 2830(矩形dp)
  6. springboot中的过滤器、拦截器、监听器整合使用
  7. dubbo-go v1.5.6来喽!
  8. 第四章 C++数据类型
  9. .1 matlab,1 MATLAB集成环境
  10. 6种字符串数组的java排序 (String array sort)
  11. Mac下IDEA使用优化
  12. c语言中数组结尾的0的作用,C语言里面一个数组最后的\0表示什么意思?
  13. ad19pcb所有元件都在报错_AD09如何放置过孔阵列?Allegro PCB,元器件高度限制区域设置?...
  14. MFC操作Access数据库
  15. 【Visio】 Visio的安装
  16. Java保留2位小数 JS保留2位小数 Java截取2位小数 Math.round((1.0/3)*100)/100.0
  17. linux僵尸程序,什么是僵尸进程(zombie)?
  18. 休眠后网络无法自动连接——网卡属性没有电源管理选项
  19. 写给自己——瞎写瞎画坑规(自己挖坑自己填啊!!)
  20. 解决笔记本,如微星GS65偶尔卡顿,黑屏或者死机的优化小技巧!

热门文章

  1. 2021最常见的网络原理面试题【好文收藏】
  2. Unity支持的C#版本
  3. 慎用!wordpress的额外css功能会浪费id资源!
  4. Enzo高灵敏度检测——Arg8-Vasopressin ELISA kit
  5. 周跳探测——历元间差分法
  6. 无穷积分 ∫e^(-x^2)dx 的几种巧妙解法
  7. pyTest官方手册(Release 4.2)之蹩脚翻译(6)
  8. 聚币网API使用教程 demo
  9. WordPress如何添加canonical标签
  10. 使用Memberane Moniter监控HTTP SOAP requests