深入理解 Go 语言信号量 Semaphore
1. 什么是信号量
信号量的概念是荷兰计算机科学家 Edsger Wybe Dijkstra 在 1963 年左右提出来的,被广泛应用在不同的操作系统中。在操作系统中,会给每一个进程分配一个信号量,代表每个进程目前的状态。未得到控制权的进程,会在特定的地方被迫停下来,等待可以继续进行的信号到来。
Edsger Wybe Dijkstra (1930-2002) 是一位荷兰计算机科学家和数学家,被认为是计算机科学领域的先驱之一。他在计算机科学的发展史上发挥了重要作用,他提出的算法和思想对计算机科学和软件工程产生了深远影响。
Dijkstra 最为著名的贡献之一是开发了 Dijkstra 算法,它是一种在图形网络中找到最短路径的算法,被广泛应用于网络路由和其他领域。他还发明了一种名为 “信号量” 的同步机制,为并发网络编程提供了一种重要的工具。此外,他还对程序设计语言的诘法和结构进行了深入的研究,为编程语言的设计和实现提供了许多有价值的建议。
Dijkstra 也是一位重要的教育家和思想家,他强调了对计算机科学教育的重视和深入思考的重要性。他在其许多著作和演讲中都强调了算法与程序设计的重要性,并强调了开发高质量软件的必要性。
Dijkstra 在他的职业生涯中获得了许多荣誉,包括图灵奖、IEEE 计算机协会的计算机科学和工程奖、ACM SIGPLAN 的系统软件奖等。他去世后,他的贡献得到了计算机科学领域的广泛赞誉和纪念。
最简单的信号量是一个变量加一些并发控制的能力,这个变量是 0 到 n 之间的一个值。当 goroutine 完成对此信号量的等待(wait) 时,该计数值就减 1 ;当 goroutine 完成对此信号量的释放 (release) 时,该计数值就加 1。当计数值为 0 时, goroutine 调用 wait 等待该信号量是不会成功的,除非计数值又大于 0 ,等待的 goroutine 才有可能成功返回。
1.1 P/V 操作
Dijkstra 在他的论文中为信号量定义了两个操作 : P 和 V 。P 操作(如 decrease、wait、acquire) 用减小信号量的计数值,V 操作(如 increase、signal、release)则用来增大信号量的计数值。
P ( passeren)在荷兰语中表示 “通过” ,V (vrijigeven) 在荷兰语中表示 “释放”,这也许就是 Dijkstra 把它们叫做 P/V 操作的原因。
使用伪代码表示如下(方括号代表原子操作):
function V(semaphore S, integer I):function P(semaphore S,integer I):repeat:[if S ≥I:break]
可以看到,初始化的信号量 S 有一个指定数量 (n) 的资源,它就像一个有 n 个资源的池子。P 操作相当于请求资源,如果有足够的资源可用,则立即返回;如果没有资源或者资源不够,那么它可以不断地尝试或者被阻塞等待。 V 操作相当于释放资源,把资源返还给信号量。信号量的值只能由 P/V 操作改变(初始化操作除外)。
现在,我们来总结一下信号量的实现。
- 初始化信号量:设定资源的初始数量。
- P 操作:将信号量的计数值减 k,如果新值为负数,那么调用者会被阻塞并加入等待队列中;否则,调用者会继续执行,并且获得 k 个资源。
- V 操作:将信号量的计数值加 k, 如果先前的计数值为负数,则说明有等待的 P 操作的调用者。 V 操作会从等待队列中取出一个等待的调用者,唤醒它,让它继续执行。
1.2 信号量和互斥锁的区别与联系
信号量有两种类型:二元信号量和计数信号量。其中,二元信号量只有两个值,通常是 0 和 1,它用于
相关文章:
深入理解 Go 语言信号量 Semaphore
1. 什么是信号量 信号量的概念是荷兰计算机科学家 Edsger Wybe Dijkstra 在 1963 年左右提出来的,被广泛应用在不同的操作系统中。在操作系统中,会给每一个进程分配一个信号量,代表每个进程目前的状态。未得到控制权的进程,会在特定的地方被迫停下来,等待可以继续进行的信…...
git——删除远程仓库中的文件或文件夹步骤图解(只是从远程仓库中删除,本地文件不受影响、不会被删除)
目录 一、删除远程仓库中的文件或文件夹1.1、 以删除远程仓库jetcache-demo项目中的logs文件夹为例1.2、 删除远程仓库jetcache-demo项目中的logs文件夹步骤图解 一、删除远程仓库中的文件或文件夹 1.1、 以删除远程仓库jetcache-demo项目中的logs文件夹为例 删除远程仓库jet…...
详解贪心算法
贪心算法(Greedy Algorithm) 概述: 贪心算法是一种在求解最优化问题时采取的一种常用算法策略。贪心算法的基本思想是,每次选择当前情况下的局部最优解,并相信这个局部最优解能够导致全局最优解。贪心算法通过迭代的方式一步步地…...
LabVIEW工件表面瑕疵识别系统
开发了一种利用LabVIEW和IMAQ Vision视觉工具进行工件表面瑕疵识别的系统。该系统通过图像处理技术识别并分类工件表面的裂纹、划痕等缺陷,从而提升生产线的分拣效率和产品质量。 项目背景 工业生产中,工件表面的缺陷直接影响产品质量和生产效率。传统人…...
LabVIEW水下根石监测系统
开发了一种基于LabVIEW平台开发的水下根石监测系统。该系统利用高精度姿态传感器与位移传感器,实现了水下根石状态的实时自动监测,提高了水利工程安全管理的现代化和精细化水平,具有高精度、高稳定性和良好的操作性。 项目背景: …...
探索全光网技术 | 全光网络技术方案选型建议三(医院场景)
目录 一、场景设计需求二、医院场景拓扑三、部署方式四、产品相关规格说明五、方案优势与特点 注:本文章参考资料为:华三官方资料 - “新华三全光网络3.0解决方案(教育)”与 锐捷官方资料 - “【锐捷】高校极简以太全光3.X方案设计…...
【C++语言】vector迭代器与常见oj题
vector迭代器的失效问题 接上篇vector的介绍和使用中最后提到的vector迭代器,我们继续来看vector迭代器的失效问题。 以下代码的功能是删除vector中所有的偶数,请问那个代码是正确的,为什么? #include <iostream> using na…...
高职物联网智慧农业实训室建设方案
一、项目概述 随着物联网技术的迅猛发展及其在农业领域的广泛应用,智慧农业已经成为推动农业现代化的关键力量。近年来,国家高度重视物联网技术在农业领域的应用与发展,出台了一系列相关政策支持智慧农业建设。如《数字乡村发展战略纲要》明…...
Pytorch 高效快速加载大规模数据集
一、前言 最近遇到一个多模态学习任务,原始数据为HDF5 格式,遇到主要两个问题:一是数据量过大无法直接加载到内存,二是HDF5 是基于关键值索引,索引速度非常慢。在使用Pytorch 训练模型时,数据加载速度跟不上模型训练速度,导致GPU使用率低。阅读OLMO 框架关于数据集加载…...
Spring Boot集成protobuf快速入门Demo
1.什么是protobuf? Protobuf(Protocol Buffers)是由 Google 开发的一种轻量级、高效的数据交换格式,它被用于结构化数据的序列化、反序列化和传输。相比于 XML 和 JSON 等文本格式,Protobuf 具有更小的数据体积、更快…...
SpringBoot+Vue 简单小文章项目开发全过程
文章目录 一、项目介绍二、需求设计三、数据库设计四、项目构建项目技术选型:构建项目说明:项目架构mavenMySQLRedis 五、项目开发:项目开发思路:项目开发过程:1. 导入文件包/新建项目2. 新建子模块:common模块pojo模块server模块…...
如何将发明原理应用于产品设计的概念阶段?
众所周知,产品设计的概念阶段是创意孵化的关键时期,它决定了产品的方向、定位及核心卖点。在这一阶段,将发明原理融入其中,能够极大地拓宽思维边界,激发前所未有的设计灵感。具体步骤如深圳天行健企业管理咨询公司下文…...
【wsl】wsl + vscode 中使用 typora 打开 markdown 文件
vscode 连接好wsl 使用Open in External App 一个五星好评的插件Open in External App则可以在vscode中用typora打开md文件,不仅如此,还有设定其他应用打开相应的文件,比如chrome打开html。插件食用方法也比较简单,安装后&#…...
AutoDL下huggingface下载模型位置问题
AutoDL系统盘只有30G,数据盘有50G且可扩容,模型及数据集空间通常较大,为节省系统盘空间,我们将文件都存储于数据盘,在运行的代码最前端(一定要在最前面)添加 import os os.environ[HF_HOME] /…...
SpringBoot基础(一):快速入门
SpringBoot基础系列文章 SpringBoot基础(一):快速入门 目录 一、SpringBoot简介二、快速入门三、SpringBoot核心组件1、parent1.1、spring-boot-starter-parent1.2、spring-boot-dependencies 2、starter2.1、spring-boot-starter-web2.2、spring-boot-starter2.3、…...
使用Weka进行数据挖掘与机器学习
在当前大数据时代,数据挖掘与机器学习已经成为了不可或缺的技术。而Weka是一个非常流行的机器学习软件,它提供了一整套的机器学习算法和数据处理工具。Weka不仅支持命令行操作和GUI,还提供了Java API,非常适合Java开发者进行数据挖…...
定时器知识点
#视频教程: 11.TIM定时中断 CSDN教程 知识点: 1.时钟源选择图 ![[Pasted Image 20240802103525_114.png]] 基本定时器 2个功能 :只能定时中断和主模式触发DAC的功能 知识点 1.时基单元:预分配器(PSC)、…...
桌面日历还能这样玩?这个日历太酷了吧!秒变桌面记事本!
大家应该有经常看日历的习惯,每个人都有不同的日历需求。特别是一些节假日,重要节日时候,大家看日历的频次就比较高了,如何选一款好用的日历?我们给大家展示一款非常不错的桌面日历,看下你喜不喜欢…...
基于深度学习的太阳暗条检测(2020年以来)
A universal method for solar filament detection from Hα observations using semi-supervised deep learning A&A, 686, A213 (2024) A universal method for solar filament detection from Hα observations using semi-supervised deep learning (aanda.org) ABS…...
【吊打面试官系列-Elasticsearch面试题】Elasticsearch 在部署时,对 Linux 的设置有哪些优化方法?
大家好,我是锋哥。今天分享关于 【Elasticsearch 在部署时,对 Linux 的设置有哪些优化方法?】面试题,希望对大家有帮助; Elasticsearch 在部署时,对 Linux 的设置有哪些优化方法? 面试官 :想了解对 ES 集…...
为 Go 语言中的 sync.WaitGroup 添加超时等待机制
go 标准库的 waitgroup.wait() 不支持原生超时,本文介绍一种简洁、安全、符合 go 惯用法的超时封装方案:通过 goroutine channel time.after 实现带超时的等待,并提供可复用的工具函数及关键注意事项。 go 标准库的 waitgroup.wait() …...
告别手动计算!用EB工具链高效配置S32K144的Dio与Port模块
告别手动计算!用EB工具链高效配置S32K144的Dio与Port模块 在汽车电子开发中,S32K1XX系列MCU因其出色的实时性和可靠性成为主流选择。但面对数百个引脚配置,传统手动计算PCR值、逐项填写寄存器的方式不仅效率低下,还容易引入人为错…...
34、如何实现上拉加载,下拉刷新?
这是前端面试里很常见的实战题。 它考察的不只是 API 会不会用,更重要的是你是否理解:滚动原理触底判断移动端触摸事件请求节流与状态控制用户体验优化分页 / 数据管理性能和边界处理如果你能按这些点来回答,面试官会觉得你不只是“会写”&am…...
营销自动化数据驱动 - 多源数据 OLAP 架构演进嘉
1. 流图:数据的河流 如果把传统的堆叠面积图想象成一块块整齐堆叠的积木,那么流图就像一条蜿蜒流淌的河流,河道的宽窄变化自然流畅,波峰波谷过渡平滑。 它特别适合展示多个类别数据随时间的变化趋势,尤其是当你想强调整…...
DMA技术解析:提升嵌入式系统性能的关键
1. DMA技术概述:解放CPU的搬运工 DMA(Direct Memory Access)直接存储器访问技术,是现代嵌入式系统中提升性能的关键设计。我第一次在STM32项目中使用DMA传输时,实测发现ADC采样率从500kHz提升到2.1MHz,CPU占…...
从《节奏医生》到你的游戏:拆解Koreographer Pro版如何实现高级音频集成(Wwise/FMOD)
从《节奏医生》到你的游戏:Koreographer Pro版如何实现高级音频集成(Wwise/FMOD) 在《节奏医生》这类音游中,玩家按键与音乐节拍的完美同步是游戏体验的核心。这种精准的音频同步背后,往往需要复杂的音频中间件集成。对…...
港口淡水罐远程监控物联网系统方案
随着全球贸易的持续增长,港口作为物流枢纽的重要性日益凸显。淡水作为港口运营的关键资源,不仅用于船舶补给、设备冷却,还涉及消防、生活用水等多个环节。当前,智慧码头理念与物联网技术深度融合,降本增效与数字化管理…...
Docker+SyncTV+cpolar三件套:手把手教你搭建私人同步影院(附固定域名技巧)
DockerSyncTVcpolar三件套:打造高可用私人同步影院实战指南 在数字娱乐需求日益个性化的今天,私人影院的搭建已经从单纯的本地播放升级为兼具社交属性的协同体验。想象一下,无论好友身处何地,都能实时同步观看你精选的影片&#x…...
8 年面试实战派导师陈晨:用精准教学,帮你叩开公职上岸之门
一、讲师简介:深耕面试教学 8年,全领域实战专家陈晨老师是初心教育核心面试讲师,拥有8年一线面试授课经验,精通国考、省考、事业单位、银行等全品类面试的研发与教学,是学员口中 “靠谱、专业、提分快” 的面试领路人。…...
大模型幻觉问题:RAG检索增强与约束生成解决方案
GPTQ 和 AWQ 都是量化技术,它们有什么区别?在什么场景下选哪种? GPTQ:是一种基于二阶信息(海森矩阵)的层级量化方法,它通过计算权重对误差的敏感度,优先保留重要的权重。侧重于整体权…...
