条件同步-操作系统

news/2025/1/4 16:21:46/文章来源:https://www.cnblogs.com/LuKemi3/p/18646419

Condition Synchinzation--条件同步

实现同步有两种方式:competition(compete for a variable that two processes all want to read or updata simutaneously)和cooperation(a process want to tell another process that a result needed is avaliable);针对competition主要通过mutual exclusion(At a given time, only one thread could access critical section)实现。

这部分讲解coorperation的实现方法--condition synchinzation


什么是条件同步

条件同步是指多个线程(或进程)在一定条件满足时才能继续执行,否则它们会进入等待状态。

举个简单的例子:想象你和朋友玩一个游戏,只有当你们俩都准备好了,游戏才能开始。如果有一方还没准备好,另一方就需要“等待”。这里的“等待”和“条件满足”就是条件同步的核心。

关键词:synchronized

生产者消费者问题

条件同步中最经典的问题就是生产消费:生产者生产-->通知消费者-->消费者消费

semaphore中讲到,可以通过控制信号量个数来实现有序性,最初资源为0,当资源为1时候,消费者才有东西消费,这就需要先让生产者生产资源。

现在可以用:boolean变量+wait()+notify()来实现

public class Dimension 
{private int dim = 0; private boolean done_put = FALSE;public void synchronized put(int d) { dim = d; done_put = TRUE;  //标志有可用资源notify(); }public int synchronized get() { if (!done_put) wait(); //操作系统waitreturn dim;done_put = FALSE;}
}

Barrier

processes cannot proceed until otherthreads reach the barrier

Barrier 的核心作用是实现 多线程的协调与同步,确保某些关键点上的线程进度保持一致。Barrier阻拦,目的:实现有序,高优先级的要比低优先级的先执行(这几个线程执行某个区域的代码时候,不能先来的就先执行,必须要在屏障点barrier一下,然后优先级最高的先执行)

public class Barrier {public void synchronized pause() {wait(); } public void synchronized resume_one(){notify(); } 
}

优先级barrier实现

每次放行优先级最高的线程

两部分组成:pause; resume_one

  • public void synchronized pause(){ }用来暂停优先级判断和设置以及放行
    比较最高(替换),比较次高(替换),do wait() while(p>hightest);替换

  • public void synchronied resume_one(){ }用来重开一轮

public class Barrier{int hightest=0;int next_high=0;public void synchronized pause(){int p;if(p=(getPriority())>hightest){next_high=highest;hightest=p;}else if(p=(getPriority())>next_high){next_high=p;}do wait()while(p<highest);hightest=next_hight}public void synchronized resume_one(){notifyALL()}
}

Bounded Counter

Bounded Counter(有界计数器) 是一种多线程编程中的同步机制,主要用于限制某些资源或操作的最大并发数。它的工作方式类似于信号量(Semaphore),但它更注重的是 计数范围控制

Bounded Counter 是一个计数器,有一个固定的最大值(上界)和最小值(下界)。 它通常用于控制资源的使用量,防止超过最大限制或者减少到小于下限的情况。

给资源数划分了一个区域MIN, MAX

小于MIN,消费者不能消费,生产者可以加

大于MAX,生产者不能生产,消费者可以消费

互相notify动态控制资源个数保持在一定区间

public class BoundedCounter implements IBoundedCounter{long count=MIN;public void synchronized inc(){while(count==MAX) wait();if(count++==MIN) notifyAll();//notify 消费者来消费} public void synchronized dec(){while(count==MIN) wait();if(count--==MAX) notifyALL();//notify 生产者生产(还没到MAX呢 你快来生产)}
}
  • 条件判断均为等于边界;while()+wait ;if+notifyall()

  • public void synchronized inc()用来增加资源,public void synchronized dec()用来消费资源

Semaphores 实现bounded area

设置三个信号量:

  • privateSemaphore mutex = new Semaphore(1);控制互斥

  • privateSemaphore space_avail =new Semaphore(10);控制空间

  • private Semaphore item_avail =new Semaphore(0);控制item个数

其中space和item是互补的 放了一个item意味着少一个space

最开始space为10,item为0

class BoundedBuffer{private Vector buf=new Vector();private Semaphore mutex=new Semaphore(1);private Semaphore space=new Semaphore(10);private Semaphore mutex=new Semaphore(0);//put: PP addElement(item) VV 回归(先space后item)public void put(int item){space.P();mutex.P();buf.addElement(item);mutex.V();item.V();}//get: PP removeElementAt(0) VVR (先item后space)public int get() { item_avail.P(); mutex. P(); int item =buf.removeElementAt(0); mutex.V(); space_avail.V(); return item; }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/862491.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

BUUCTF Misc刷题37

37、[BJDCTF2020]你猜我是个啥 随波逐流梭了

Vue 使用脚手架

一、安装脚手架npm install -g @vue/cli注意:安装过程有警告,安装完后,关闭窗口,重新打开cmd,输入vue,没有报错 二、切换到创建文件的目录,然后使用命令创建vue create vue_test耐心等待 三、启动项目npm run serve

DL00237-基于YOLOv8深度学习的磁瓦缺陷检测含完整数据集实验结果

https://item.taobao.com/item.htm?ft=t&id=787390961923&spm=a21dvs.23580594.0.0.621e2c1bY0k4d9

中考英语优秀范文-005 What will you do for Mum? 你将为妈妈做些什么?

1 写作要求 天下最伟大的爱就是母爱。假设你是李静,母亲节就要到了,你们班将举办以What will you do for Mum? 为题的英语演讲比赛。请你准备一篇80词左右的演讲稿参加比赛。 2 优秀范文 What will you do for Mum? Hello, class. I’m Li Jing. Mother’s Day is coming. …

Notes.js的安装和配置

一、安装 1、下载 https://nodejs.org/en/download/ 2、安装 3、测试 打开cmd 查看node 和npm 版本node -vnpm -v 二、环境配置 1、找到安装目录,新建 node_cache 和 node_global文件夹 2、以管理员权限打开cmd 输入npm config set prefix "D:\nodejs\node_global"…

本地大模型初体验

前言 近几年这个话题很火,但是我一直没得去尝试一下,今天突然来兴趣想试试,然后就出来了这一篇文档。 环境准备docker安装管理工具 Ollama是一款开源的大模型管理工具,它允许用户在本地便捷地运行多种大型开源模型,包括清华大学的ChatGLM、阿里的千问以及Meta的llama等。目…

Linux装逼玩法之wttr.in天气

什么是 wttr.in? wttr.in 是一个基于 Web 的命令行天气服务,由 Igor Chubin 开发。它通过调用OpenWeatherMap 等天气服务的 API,提供了简洁、直观的天气信息展示。 Linux使用Curl命令可快速获取天气信息查询指定城市的天气[Wed Jan 01 20:38:53 root@localhost ~ ]# curl wt…

vmware下载安装配置

vmware下载安装配置 下载 https://www.vmware.com/ # 官网 https://www.broadcom.com/ # Broadcom官网 https://www.vmware.com/products/desktop-hypervisor/workstation-and-fusion # VMware官网虚拟机下载页 https://www.filehorse.com/download-v…

软件安全测试

一、网络协议基础 1、网络模型 我们把一些过程封装到一起,称为“模型”,如下:把北京中的4个步骤封装到一起,就是1个模型了。 (1)网络模型-OSI OSl(Open System Interconnection 开放系统互联)参考模型是国际标准化组织(ISO)制定的一个用于计算机或通信系统间互联的标准体…

开拓计划21/2025集训作业表3 - 倍增ST表LCA次小生成树

开拓计划21/2025集训作业表3 - 倍增&ST表&LCA&次小生成树 倍增&ST表 概念Q:倍增是什么? A:倍增,顾名思义是成倍增长的意思,它利用了二进制的性质和预处理(俗称打表)的思想,在 \(O(\log n)\) 内完成一些操作。 Q:ST表是什么? A:ST表主要用于解决RMQ(…

系统管理体系之进程管理

系统管理体系之进程管理 1. 进程名字 含义程序 安装包,程序代码,app,存放在磁盘上面.进程⭐️ 运行起来的程序,命令,服务(远程连接服务,网络服务)都可以称作进程。 运行在内存中。守护进程 守护进程, 一直运行的进程. 也可以叫做服务.2. 进程分类(异常进程) 2.1 僵尸进程⭐️⭐…