当前位置: 首页 > news >正文

P(pass)V(vrijgeven)操作,信号量:semaphore 互斥量:mutex PV操作是一种实现进程互斥与同步的有效方法。PV操作与信号量的处理相关, 银行排队 举例: 博物馆参

目录

 

信号量:semaphore

互斥量:mutex

PV操作是一种实现进程互斥与同步的有效方法。PV操作与信号量的处理相关,

银行排队 举例:

博物馆参观问题

理发师问题

PV操作

生产者——消费者问题:v(empty) 什么意思


信号量:semaphore

互斥量:mutex

 

PV操作是一种实现进程互斥与同步的有效方法。PV操作与信号量的处理相关,

P操作意味着请求分配一个资源.

V操作意味着释放一个资源

信号量的值只能通过PV操作来改变。

P表示通过的意思,V表示释放的意思。   P、V(或wait()、signal())

PV操作是典型的同步机制之一。用一个信号量与一个消息联系起来

当信号量的值为0时,表示期望的消息尚未产生;

当信号量的值非0时,表示期望的消息已经存在。

用PV操作实现进程同步时,调用P操作测试消息是否到达,调用V操作发送消息。

银行排队 举例:

某银行提供1个服务窗口和10个供顾客等待的座位。顾客到达银行时,若有空座位,则到取号机上领取一个号,等待叫号。取号机每次仅允许一位顾客使用。当营业员空闲时,通过叫号选取一位顾客,并为其服务

semaphore empty = 10; //空位数初值
semaphore full = 0; //已使用
semaphore mutex = 1; //互斥访问叫号机
semaphore service = 0; //控制服务同步关系
process 顾客i
{
    P(empty); //等空位,在营业员那边V,所以是一个同步关系
    P(mutex);// 从取号机取号;
    V(mutex);//释放取号机
    V(full);//营业员那边在P,也是一个同步关系
    P(service); //营业员那边在V,同步关系
}
process 营业员
{
    while(1)
    {
        P(full); 
        V(empty);
        V(service);
        为顾客服务;
    }
}

 

博物馆参观问题

某博物馆最多可容纳500人同时参观,有一个出入口,该出入口一次仅允许一个人通过。参观者的活动描述如下: cobegin 参观者进程i: { … 进门; … 参观; … 出门; … } coend

 

Semaphore empty=500; //博物馆可以容纳的最多人数 
Semaphore mutex=1; //用于出入口资源的控制
 cobegin 参观者进程i:
 { 
 P(empty);
 P(mutex); 进门;
 V(mutex); 参观;
 P(mutex); 出门;
 V(mutex);
 V(empty);
 } coend

 

理发师问题

有一个理发师,一把理发椅和 N 把供等候理发的顾客坐的椅子。
如果没有顾客,则理发师便在理发师椅子上睡觉;
当一个顾客到来时,必须唤醒理发师进行理发;
如果理发师正在理发时又有顾客来到,则如果有空椅子可坐,他就坐下来等,如果没有空椅子,他就离开。
为理发师和顾客各编一段程序(伪代码)描述他们的行为,要求不能带有竞争条件。
 

int wait = 0; //顾客等待的数量
semaphore mutex = 1; //互斥访问 wait
semaphore barber = 0; //理发师信号量
semaphore customer = 0; //顾客的信号量
//理发师
void barber() {
	while (true) {
		P(customer); //等待顾客来理发
		P(mutex); //申请互斥访问wait
		wait = wait - 1; // 等待人数减少一人
		V(mutex);//释放临界资源
		V(barber);//让理发师去理发
		进行理发;
	}
}
//顾客
void customer () {
	while (true) {
		P(mutex);//申请互斥访问wait
		if (wait < 10) { //代表10把椅子没有坐满 还可以坐人
			wait = wait + 1 ;
			V(mutex);
			V(customer );
			P(barber);//等待理发师来理发
			去理发;
		} else {
			//人满了 顾客直接离开
			V(mutex);
		}
	}
}

PV操作

PV操作:由P操作原语和V操作原语组成(原语是不可中断的过程),对信号量进行操作如下:P(S)是将信号量S减1,若S>=0则P(S)执行完毕,否则执行P(S)的进程置为阻塞状态,进入等待队列;V(S)是将信号量S加1,若S<=0则释放一个因执行P(S)而等待的进程。 
信号量(semaphore):其数据结构为一个值和一个指针,指针指向等待该信号量的下个进程。S>=0时,S表示可用资源的数量;S<0时,表示没有可用的资源请求者必须等待别的进程释放该类资源。信号量可以解决进程同步(私有信号量)与互斥(公有信号量)。 
临界区(critical section):是指一个访问公共资源的程序片段,而这些公共资源又无法同时被多个进程/线程访问的特性。即进程间的互斥(公有信号量,也称互斥信号量) 
进程的状态:就绪状态(ready):进程已获得除处理器外的所需资源,等待分配处理器资源,只要分配了处理器资源进程就可执行。运行状态(runing):进程占用处理器资源,处于此状态的进程数小于等于处理器数目。阻塞状态(blocked):由于进程等待某种条件,在条件满足之前无继续执行。

 

生产者——消费者问题:v(empty) 什么意思

https://www.jianshu.com/p/eeec6b572146

 

相关文章:

  • ==和equals的区别 ,int和integer的区别及应用场景
  • int 和 Integer 的区别与作用,java堆内存和栈内存的区别,StringBuilder、StringBuffer 的区别,kotlin和java开发优缺点,内部类分类和使用场景,编码
  • 枚举,注解 ,反射
  • 类加载对象实例,java具有可移植性原因,泛型和object区别,
  • android studio 输出apk过程,apk中的文件格式(bsh文件,dex文件),JVM、DVM、ART的区别,IOS与安卓的区别,ART和Dalvik
  • LruCache使用,基本数据类型 引用类型,面试==和equals的区别 本质,onCreate 和onResume 区别,
  • Fragment 知识梳理, FragmentPagerAdapter ,RecyclerView 知识梳理,sharepreference,IntentService,service交互
  • kotlin 学习,val和var的区别
  • kotlin ==和===区别,kotlin数组,kotlin 三引号,if-else 调监控子很语句,
  • CMake 进行 NDK 开发之初体验, Error occurred while communicating with CMake server
  • dump java heap,GPU,Lint
  • 处理屏幕旋转导致的重建,单例对象,StringBuilder进行拼接,ProGurad 混淆,VectorDrawable 及 AnimatedVectorDrawable,IntentService
  • SVG,Vector,gradle
  • 蓝牙通讯数据传输,蓝牙UUID,BluetoothAdapter;adb input 模拟系统输入,adb logcat:抓包,抓日志,蓝牙通讯,adb命令实现手机之间互相控制,虚拟按键
  • gradle中的 compileSdkVersion minSdkVersion targetSdkVersion
  • ES6指北【2】—— 箭头函数
  • @angular/forms 源码解析之双向绑定
  • 【Linux系统编程】快速查找errno错误码信息
  • 【腾讯Bugly干货分享】从0到1打造直播 App
  • ComponentOne 2017 V2版本正式发布
  • CSS居中完全指南——构建CSS居中决策树
  • HTTP中的ETag在移动客户端的应用
  • Javascript基础之Array数组API
  • JavaScript新鲜事·第5期
  • Python - 闭包Closure
  • Python socket服务器端、客户端传送信息
  • Shadow DOM 内部构造及如何构建独立组件
  • SOFAMosn配置模型
  • supervisor 永不挂掉的进程 安装以及使用
  • underscore源码剖析之整体架构
  • Vue 2.3、2.4 知识点小结
  • 阿里云爬虫风险管理产品商业化,为云端流量保驾护航
  • 不发不行!Netty集成文字图片聊天室外加TCP/IP软硬件通信
  • 从零开始的webpack生活-0x009:FilesLoader装载文件
  • 基于Vue2全家桶的移动端AppDEMO实现
  • 紧急通知:《观止-微软》请在经管柜购买!
  • 坑!为什么View.startAnimation不起作用?
  • 前端 CSS : 5# 纯 CSS 实现24小时超市
  • 如何编写一个可升级的智能合约
  • 如何进阶一名有竞争力的程序员?
  • 腾讯优测优分享 | Android碎片化问题小结——关于闪光灯的那些事儿
  • 我看到的前端
  • 小程序滚动组件,左边导航栏与右边内容联动效果实现
  • 容器镜像
  • ​LeetCode解法汇总518. 零钱兑换 II
  • ​sqlite3 --- SQLite 数据库 DB-API 2.0 接口模块​
  • ​马来语翻译中文去哪比较好?
  • (173)FPGA约束:单周期时序分析或默认时序分析
  • (含react-draggable库以及相关BUG如何解决)固定在左上方某盒子内(如按钮)添加可拖动功能,使用react hook语法实现
  • (一)使用Mybatis实现在student数据库中插入一个学生信息
  • (原創) 如何讓IE7按第二次Ctrl + Tab時,回到原來的索引標籤? (Web) (IE) (OS) (Windows)...
  • (转)利用PHP的debug_backtrace函数,实现PHP文件权限管理、动态加载 【反射】...
  • ./configure,make,make install的作用(转)
  • .Net mvc总结
  • .NET8.0 AOT 经验分享 FreeSql/FreeRedis/FreeScheduler 均已通过测试