操作系统是大学里非常重要的课程,对于科班出身的同学来说,把这门课程学号是非常必要的,下面我将我的课堂笔记整理好跟大家分享,虽然这些例子都是很简单的,代码也都能在网上找到,但是我想经过自己整理的代码,才能把知识固定在脑子里,希望我的笔记对大家操作系统的学习有利,特别是非科班出身而且对计算机感兴趣的同学;

正文:

信号量的本质是一种数据操作锁,它本身不具有数据交换的功能,而是通过控制其他的通信资源(文件,外部设备)来实现进程间通信,它本身只是一种外部资源的标识。信号量在此过程中负责数据操作的互斥、同步等功能。

当请求一个使用信号量来表示的资源时,进程需要先读取信号量的值来判断资源是否可用。大于0,资源可以请求,等于0,无资源可用,进程会进入睡眠状态直至资源可用。

信号量结构体:

struct{ unsigned short semval;

pid_t          sempid;

unsigned short semncent;

.....

};

信号量的两个操作:

1、阻塞操作——Wait

2、唤醒操作——Signal

信号量分类

1、技数信号量:

使用范围:资源数量有多个(共享资源有多个备份,他们的使用是互斥的);

取值范围:大于1的整数值,

2、二元信号量:

取值范围:0、1

使用范围:实现互斥;

Semaphore S;

Wait(S):

Critical Section;

Signal(S);

二元信号量其实就是一个锁;

Wait——获取锁的钥匙

Signal——钥匙扔掉

二元信号量比较简单,比较复杂的计数信号量可以用二元信号量来实现:

Data Structures:

Int c;//计数信号量的取值

Binary-Semaphore  S1,S2;//对C的操作要求互斥,S1作为C的互斥锁;

//S2做为技术信号量的wait的等待;

Initialization:

S1 = 1

S2 = 0

C= intial value of semaphore S;

Wait(C) operation

Wait(S1)l;

C--;

If(C<0){

Signal(S1);//唤醒S1

Wait(S2);

}

Signal(S1);

Signal(C) operation

Wait(S1);

C++;

If(C<=0)

Signal(S2);

Else

Signal(S1);

同步问题的例子

解决同步问题思路步骤:

参与者与规则;

资源:具体问题所涉及的资源,而这些资源一般都是共享的,资源的数量也是有限的;

继续处理前必须获得资源——技术信号量或者变量计数;

共享变量

必须保护访问——二元信号量;

1、有限缓存问题(生产者消费者问题):

问题描述:两个共享固定大小缓冲区的线程——即所谓的“生产者”和“消费者”——在实际运行时会发生的问题。生产者的主要作用是生成一定量的数据放到缓冲区中,然后重复此过程。与此同时,消费者也在缓冲区消耗这些数据。该问题的关键就是要保证生产者不会在缓冲区满时加入数据,消费者也不会在缓冲区中空时消耗数据。

游戏参与者:生产者、消费者

活动限制:共享一个固定大小的缓冲区;

对共享数据的访问要求:互斥(生产消费操作必须互斥),缓存区满后停止生产,有产品后才消费;

怎样保证互斥:设置一个信号量,用信号量保证互斥;

缓存区满后停止生产:获得空的缓存去单元,用一个计数信号量表示空的单元数,empty;

有生产后才消费:有一个“满”的资源才能进行消费;

一个生产者,一个消费者,公用一个缓冲区

定义两个同步信号量:

empty——表示缓冲区是否为空,初值为1。

full——表示缓冲区中是否为满,初值为0。

生产者进程

while(TRUE){

生产一个产品;

P(empty);

产品送往Buffer;

V(full);

}

消费者进程

while(TRUE){

P(full);

从Buffer取出一个产品;

V(empty);

消费该产品;

一个生产者,一个消费者,公用n个环形缓冲区

——N个缓冲区形成一个环形缓冲区要利用指针。缓冲区的指向则通过模运算得到。

empty——表示缓冲区是否为空,初值为n。

full——表示缓冲区中是否为满,初值为0。

设缓冲区的编号为1~n-1,定义两个指针in和out,分别是生产者进程和消费者进程使用的指针,指向下一个可用的缓冲区。

生产者进程

while(TRUE){

生产一个产品;

P(empty);

产品送往buffer(in);

in=(in+1)mod n;

V(full);

}

消费者进程

while(TRUE){

P(full);

从buffer(out)中取出产品;

out=(out+1)mod n;

V(empty);

消费该产品;

}

一组生产者,一组消费者,公用n个环形缓冲区

——在这种情况中,生产者与消费者存在同步关系,而且各个生产者之间、各个消费者之间存在互斥关系,他们必须互斥地访问缓冲区。

定义四个信号量:

empty——表示缓冲区是否为空,初值为n。

full——表示缓冲区中是否为满,初值为0。

mutex1——生产者之间的互斥信号量,初值为1。

mutex2——消费者之间的互斥信号量,初值为1。

设缓冲区的编号为1~n-1,定义两个指针in和out,分别是生产者进程和消费者进程使用的指针,指向下一个可用的缓冲区。

生产者进程

while(TRUE){

生产一个产品;

P(empty);

P(mutex1);

产品送往buffer(in);

in=(in+1)mod n;

V(mutex1);

V(full);

}

消费者进程

while(TRUE){

P(full);

P(mutex2);

从buffer(out)中取出产品;

out=(out+1)mod n;

V(mutex2);

V(empty);

2、读者\写者问题:

问题描述:读者—写者问题(Readers-Writers problem)也是一个经典的并发程序设计问题,是经常出现的一种同步问题。计算机系统中的数据(文件、记录)常被多个进程共享,但其中某些进程可能只要求读数据(称为读者Reader);另一些进程则要求修改数据(称为写者Writer)。就共享数据而言,Reader和Writer是两组并发进程共享一组数据区,要求:

游戏参与者:读者、写者

活动限制:读写操作是在同一个临界区;

对共享数据的访问要求:(互斥)读和写不能同时进行,允许多个读者同时执行读操作,不允许读者、写者同时操作,不允许多个写者同时操作;

许多个读者同时执行读操作,第一个读者解锁;最后一个读者加锁,使用一个计数器readcount来计算读者的数量;

Shared data

Semaphore mutex 保证读者对readcount访问的互斥

Wrt: 保证读写互斥

Readcount:记录读者数量

3、哲学家问题

问题描述:在餐桌旁的哲学家有两种操作,思考,就餐,餐桌上每个哲学家的右边有一只筷子,两只筷子才能就餐;

游戏参与者:哲学家

共享资源:筷子(二元信号量);

对共享数据的访问要求:每个筷子的使用是互斥的,每个哲学家只能使用身边的筷子;

哲学家就餐防止死锁:

当一个哲学家身边的两个筷子都可以用才可以允许它拿筷子;

给所有哲学家编号,奇数号的哲学家首先拿左边的筷子;偶数号的哲学家先拿右边的筷子;

如果哲学家总数已知,可以让控制最多让总数-1的哲学家就餐;

4、理发师问题:

问题描述:

1、休息的理发师是坐地自己专用的理发椅上,不会占用顾客的沙发;

2、处理休息状态的理发师可为在沙发上等待时间最长的顾客理发;

3、理发时间长短由理发师决定;

4、在站席区等待时间最长的顾客可坐到空闲的理发上;

5、任何时刻最多只能有一个理发师在收银。

游戏参与者:理发师,顾客

伪代码:

semaphore stand_capacity=5;semaphore sofa=4;semaphore barber_chair=3;semaphore customer_ready=0;semaphore mutex=3;semaphore mutex1=1;semaphore finished[3]={0,0,0};semaphore leave_barberchair=0;semaphore payment=0;semaphore receipt=0;void customer(){

顾客:int barber_number;wait(stand_capacity); //等待进入理发店enter_room(); //进入理发店wait(sofa); //等待沙发leave_stand_section(); //离开站席区signal(stand_capacity);sit_on_sofa(); //坐在沙发上wait(barber_chair); //等待理发椅get_up_sofa(); //离开沙发signal(sofa);wait(mutex1);sit_on_barberchair(); //坐到理发椅上signal(customer_ready);barber_number=dequeue(); //得到理发师编号signal(mutex1);wait(finished[barber_number]); //等待理发结束pay(); //付款signal(payment); //付款wait(receipt); //等待收据get_up_barberchair(); //离开理发椅signal(leave_barberchair); //发出离开理发椅信号exit_shop(); //了离开理发店}

对于理发师:void barber(int i){while(true){wait(mutex1);enqueue(i); //将该理发师的编号加入队列signal(mutex1);wait(customer_ready); //等待顾客准备好wait(mutex);cut_hair(); //理发signal(mutex);signal(finished[i]); //理发结束wait(leave_barberchair); //等待顾客离开理发椅信号signal(barber_chair); //释放barber_chair 信号}}void cash() //收银{while(true){wait(payment); //等待顾客付款wait(mutex); //原子操作get_pay(); //接受付款give_receipt(); //给顾客收据signal(mutex);signal(receipt); //收银完毕,释放信号}}

6、过桥问题

问题:一座小桥(最多能承重两个人)横跨南北两岸,任意时刻同一方向只允许一个人过桥;南侧的桥段和北侧的桥段较窄只能一个人通过,桥中央一处宽敞,允许两个人通过或者休息。

游戏参与者:南北过桥者;

资源:桥的承重(对多两人,相当于资源的两个份额)

信号量使用:

Load:(技术信号量)

North:(二元信号量)

South:(二元信号量)

伪代码:

int countSN=0;

int countNS=0;

semaphore mutexSN=1;

semaphore mutexNS=1;

semaphore bridge=1;

6、和尚打水问题(生产消费变种):

问题描述:某寺庙,有小和尚和老和尚若干,有一个水缸,由小和尚提水入缸供老和尚饮用。水缸可以容纳10桶水,水取自同一口井中,由于水井口窄,每次只能容纳一个水桶取水。水桶总数为3个。每次入水、取水仅为一桶,且不可同时进行

信号量设置:

1、对于水缸——以一个水桶水为单位,empty=30、full = 0两个计数信号量

2、小和尚对缸操作:mutex-jar = 1二元信号量;

3、水桶个数(资源数):bucket = 5计数信号量

4、取水操作(每次入水、取水仅为一桶):互斥mutex-well = 1二元信号量;

伪代码:

7、一家人吃水果问题:

问题描述:桌子上有一只盘子,每次只能放一个水果,爸爸专向里面放苹果,妈妈放橘子,儿子专吃橘子,女儿专吃苹果,仅当盘子空闲时,爸爸妈妈才可以向里面放水果,仅当盘子里有自己需要的水果时,儿子女儿才可以从里面取出一只水果。

生产者消费者变种问题:

1、空间变为一个,不同的消费者需求不同;

2、信号量变化:Full——用两个信号量表示So=0、SA=0(表示橘子和苹果两种),empty=1不变;

伪代码:

int e=1,a=o=0;main(){father();//son();//daughter();/*三个为并发进程*/}father(){while(1){ 洗水果wait(e)把水果放入盘子if(水果是苹果)signal(a)else signal(o)}}son(){while(1){wait(o)从盘子里取桔子signal(e)吃桔子}}daughter(){while(1){wait(a)从盘子里取苹果signal(e)吃苹果}}

小和尚打水问题_操作系统进程同步问题解析(哲学家问题、生产消费问题、小和尚打水问题等大量例子)...相关推荐

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

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

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

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

  3. 16281053_杨瑷彤_操作系统第五次实验-文件系统

    16281053_杨瑷彤_操作系统第五次实验-文件系统 源代码链接:https://github.com/rdjyat/operating-system/tree/master/操作系统实验五 1.实 ...

  4. 操作系统进程同步实验报告

    华侨大学计算机科学与技术学院 操作系统实验报告 进程同步 课程名称:操作系统实验 实验项目名称:进程同步 学    院:计算机科学与技术学院 专业班级: 姓    名: 学    号: 目录 1.描述 ...

  5. realloc重分配内存详解_羽夜水之灵_百度空间

    realloc重分配内存详解_羽夜水之灵_百度空间 realloc重分配内存详解_羽夜水之灵_百度空间 realloc重分配内存详解 最近在写source code时需要在数组的buffer小时重新申 ...

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

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

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

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

  8. 学堂在线_操作系统_notes_第0-2讲_OS概述、OS实验环境准备

    学堂在线_操作系统_notes_第0-2讲_OS概述.OS实验环境准备 - 20220626.No.1821 - 操作系统OS 综合了 C语言 + 数据结构与算法DSA + 计算机组成. OS 是 控 ...

  9. linux进程同步互斥实验小结,操作系统进程同步互斥实验

    <操作系统进程同步互斥实验>由会员分享,可在线阅读,更多相关<操作系统进程同步互斥实验(7页珍藏版)>请在人人文库网上搜索. 1.进程的同步互斥实验进程的同步互斥实验进程的同步 ...

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

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

最新文章

  1. oracle11g 启动报错 缺少系统参数
  2. 《程序设计与数据结构》第6周学习总结
  3. java幻灯片播放代码_简单常用的幻灯片播放实现代码
  4. java两个数组中不同的数字_【Java】 剑指offer(56-1) 数组中只出现一次的两个数字...
  5. 2002. [HNOI2010]弹飞绵羊【LCT】
  6. 中国全部城市的中心点坐标 json格式
  7. 影响世界的100个经典管理定律
  8. 土地房屋权属登记系统
  9. signature=71820b070a82d48c44cc938baccfcfc9,基于集成神经网络的离线手写签名鉴别方法
  10. KVM或openstack虚拟化环境中windows主机忘记登陆密码如何使用pe的方式进行破解
  11. 打造一个基于机器学习的图像解码平台
  12. 肿瘤特异性抗原行业调研报告 - 市场现状分析与发展前景预测(2021-2027年)
  13. Unity 相机 2D视角 与3D 视角 自由动态 切换
  14. uni-app中自定义图表(canvas实现chart图表)开发篇(1)-圆环带进度条
  15. 真实案例,手把手教你构建用户画像
  16. 插入新题注变乱了_关于Word题注的问题,这篇文章能解决99%!
  17. 在h5页面中调起支付宝小程序中的某一个页面以及URLScheme 之 支付宝
  18. tp5 分页之无刷新页面渲染
  19. 上海睿昂生物获得数亿元战略融资,浙江大健康产业基金领投
  20. #关于新建的文本文档(记事本)没有后缀名txt的问题的解决方法

热门文章

  1. android网易课堂app,网易云课堂
  2. JSP项目进度管理系统myeclipse开发mysql数据库web结构java编程
  3. 陪集分解的几个简单应用
  4. 集合论第一章 3 集合论的公式和条件
  5. cmd: cd /D %~dp0 的含义
  6. 10.5 欧拉通路与哈密顿通路
  7. reset()方法 submit()方法
  8. PHP 的oop思想
  9. java大赛参赛学院名单,河南大学第十一届“学佳澳杯”大学生程序设计竞赛获奖名单公布...
  10. 数学基础类:如何求矩阵的特征值和特征向量