31 信号量

概念

共享内存在通信的过程中,没有任何保护机制。当A进程写入了一部分,就被B、拿走了,导致双方发和收的数据不完整,数据不一致问题

1.A和B看到同一份资源,共享资源,如果不加保护,会导致数据不一致问题
2.加锁–互斥访问,任何时刻,只允许一个执行流访问共享资源叫互斥,如ITM机,只允许一个人操作,结束后另一个人才可以操作
3.共享的,任何时刻只允许一个执行流访问代码的资源,叫临界资源,一般是内存空间
4.很多代码中只有几行代码访问临界资源,访问临界资源的代码叫临界区

在一个多进程或多线程并发打印的情况,显示器上的消息可能是1.错乱的 2.混乱的 3.和命令行混在一起,这种情况就是正常现象

原理

信号量类似一个计数器,描述临界资源中资源数量的多少
一个例子,电影院买票,将100个座位看做100个资源,买票的本质就是对资源的预定,电影播放时这个座位就属于自己。有一个票数的计数器等于100,每卖出一张票,计数器–,当计数器到0时,就不能再卖了,就是资源已经申请完

关于临界资源害怕的问题:
1.多个执行流访问同一个资源
2.共有n个资源,但有n+个执行流

第一种情况的解决方法是代码的逻辑问题。如果有多个执行流,可以将临界资源分为几块,让每个执行流访问其中的一块区域。第二个解决办法就是可以给这些资源引入一个计数器,数量表示当前有多少个资源,当申请一个资源时计数器–,如果为0的时候,表示没有资源了,再申请的时候就不给了,就不会出现执行流比资源数量多的情况

在这里插入图片描述
总结
1.申请计数器成功,就表示具有访问资源的权限了
2.申请了计数器,当前没有访问资源,只是对资源的预定机制
3.计数器可以有效保证进入共享资源的执行流的数量
4.所以每一个执行流,想访问共享资源的一部分的时候,不是直接访问,而是先申请计数器资源

将这个计数器称为信号量

如果电影院只有一个座位,就只需要一个值为1的计数器,只有一个人能抢到,一个人能看电影,就是只有一个执行流可以访问临界资源,申请了计数器就变为0。把这种值为1和0的计数器叫做二元信号量,本质就是一个锁

计数器为1的本质就是临界资源当成一个整体,整体申请,整体释放

保证计数器安全

计数器也是共享资源吗?计数器保护临界资源有效,得先保证自己安全。对计数器的操作是–,这个操作不是安全的

–操作在汇编中有三条语句以上
1.cnt变量的内容,拷贝到cpu寄存器
2.cpu内进行–操作
3.将计算结果写回cnt变量的位置

cpu内的进程是随时切换的,就可能在执行上面某一条的时候就被切换了

PV

操作系统内部对计数器进行了封装,申请信号量,将计数器–,作为P操作
释放资源,释放信号量,对计数器++,作为V操作
申请和释放这种PV操作,让它是原子的
原子的:要么不做,要么就做完,两态的,没有“正在做”这样的概念
这样就保证了计数器的安全

信号量本质是一把计数器,PV操作,原子的,执行流申请资源,必须先申请信号量资源,得到信号量后才能访问临界资源
信号量1,0两态的,二元信号量,就是互斥功能
申请信号量的本质:对临界资源的预定机制

函数

申请信号量,可以是多个,nsems参数控制
在这里插入图片描述
释放信号量,semum填0表示只有一个信号量,用下标0。否则,需要自己设置结构体
在这里插入图片描述在这里插入图片描述

信号量为什么是通信

前面的通信都是可以互相发送消息,而信号量只是一个计数器,为什么也是通信的一种
1.通信不仅仅是通信数据,互相协同也是,信号量协助资源的安全
2.要协同,本质也是通信,信号量首先要被所有的通信进程看到

补充

mmap函数,也是共享内存的一种
在这里插入图片描述
共享内存是在内存中申请一块地址映射到虚拟内存中,通过虚拟内存访问这块资源,如果申请的内存不是从内存中,而是一个磁盘文件的地址映射。就可以直接读写文件,不需要read,write这些函数,直接对地址操作。这个就是mmap函数

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

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

相关文章

Uni-App 生命周期

在 Uni-App 中,页面和组件都有自己的生命周期函数,以下是一些常用的生命周期函数: 页面生命周期函数: onLoad: 页面加载时触发 onShow: 页面显示时触发 onReady: 页面初次渲染完成时触发 onHide: 页面隐藏时触发 onUnload: …

PyCharm添加外部工具

QtDesigner 可视化UI设计客户端工具 路径:File | Settings | Tools | External Tools点号,给External Tools组添加一个条目,填写如下内容 Name:QtDesignerProgram:C:\Users\用户名\AppData\Local\Programs\Python\Py…

在誉天学习云计算HCIE,担心考试考不过?

誉天定制化课程内容覆盖了所有考试重点,可以系统地掌握理论与实践知识。 对于笔试,类似于备考驾照理论学习阶段,誉天为大家提供在线模拟测试系统,帮助大家掌握云计算笔试考点。笔试通过后,18个月内(一年半…

【QT进阶】Qt http编程之nlohmann json库使用的简单介绍

往期回顾 【QT进阶】Qt http编程之http相关类的简单介绍-CSDN博客 【QT进阶】Qt http编程之用户登录注册功能实现-CSDN博客 【QT进阶】Qt http编程之json解析的简单介绍-CSDN博客 【QT进阶】Qt http编程之nlohmann json库使用的简单介绍 一、nlohman json库 1、C常用Json库 J…

Github 2024-04-22 开源项目日报Top10

根据Github Trendings的统计,今日(2024-04-22统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目4C++项目2Go项目2JavaScript项目1TypeScript项目1非开发语言项目1Zig项目1免费编程书籍和学习资源清单 创建周期:3762 天协议类型:…

Docker 哲学 - docker save | load | export | import 及实践

当我们说 "归档文件包含了容器的所有文件,但不包含容器的元数据和配置",我们是指 docker export 命令导出的 tar 归档文件包含了容器的文件系统中的所有文件,包括应用程序、库、数据等。但是,这个归档文件不包含关于容器…

Python 网络与并发编程(一)

文章目录 并发编程介绍串行、并行与并发的区别进程、线程、协程的区别进程线程协程 并发编程解决方案同步和异步介绍 并发编程介绍 串行、并行与并发的区别 有任务A、B、C,一个CPU去执行他们,有几种方式 1、一个cpu按顺序执行ABC,这就是串行…

go语言并发实战——日志收集系统(六) 编写日志收集系统客户端

上节回顾 在上一篇文章中我们介绍了编写客户端的四个步骤,分别是: 读取配置文件,寻找日志路径初始化服务根据日志路径l来收集日志将收集到的日志发送Kafka中 关于上述的内容博主画了一个思维导图(有点丑,大家勉强看看&#xff0…

燃冬之yum、vim和你

了解了很多指令和权限,搞点真枪实弹来瞅瞅 学Linux不是天天就在那掰扯指令玩,也不是就研究那个权限 准备好迎接Linux相关工具的使用了么码农桑~ yum 软件包 什么是软件包呢? 首先来举个生活中常见点的例子:比如我的手机是华为…

Leetcode 20:有效的括号

给定一个只包括 (,),{,},[,] 的字符串 s ,判断字符串是否有效。 有效字符串需满足: 左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每个右括号都有一个对应的相同类型的左括…

【项目部署-apache】windows系统下apache部署django+channels

一、系统环境 1、原生的python3.8.5(默认安装,不更改安装目录),不要使用Anaconda做虚拟环境。 2、在windows系统下需要,mod_wsgi 模块。 创建虚拟环境:(在当前目录下创建名为 gzgs_alert 的虚拟环境) py…

Tensor张量的属性dim、type、size、shape、numel的使用方法介绍

本文重点 Tensor张量有一些常用的属性,我们可以通过这些基本的属性判断张量的类型,维度,以及元素个数,本节课程我们将对tensor属性进行简单的介绍。 代码 import torch import numpy as np atorch.Tensor(2,3,4) print(a) prin…

【论文笔记 | 异步联邦】 FedBuff

1. 论文信息 Federated Learning with Buffered Asynchronous Aggregation,International Conference on Artificial Intelligence and Statistics,2022,ccfc 2. introduction 2.1.1. 背景: 同步 FL ,随训练过程中…

AI视频分析技术的常用开源模型及TSINGSEE青犀AI视频识别分析能力介绍

AI视频分析技术是指利用人工智能技术来对视频数据进行分析和处理的技术。开源模型是指可以免费获取和使用的代码模型,可以帮助开发人员快速构建和部署AI视频分析应用程序。 以下是一些业内常用的用于AI视频分析技术的开源模型: OpenCV:Open…

APP开发_ js 控制手机是否显示状态栏

1 Android 控制手机显示或隐藏状态栏的方法 1.1 使用 View 的 setSystemUiVisibility 方法 这个方法允许设置系统 UI 的可见性,包括状态栏。你可以通过组合不同的标志来实现不同的效果。 示例代码: Override protected void onCreate(Bundle saved…

给字符串添加加粗标签(AC自动机+Python)

可以暴力解决,但是为了锻炼一下ac自动机的编程,我们使用ac自动机。 ac自动机主要维护两个列表,一个列表ch,ch[f][idx]表示从父节点f向idx这个方向走,走到的节点。另一个列表nex,nex[i]表示节点i回跳边的节…

01 【哈工大_操作系统】x86_64 常用寄存器大全

在学习CPU底层技术的时候,难免会接触到各式各样的寄存器。尤其是在使用汇编语言编写操作系统时,寄存器更是必不可少的。因此,这篇文章将来详细聊聊 x86_64 架构中的所有寄存器,按照从 常用->不常用 的顺序来进行介绍。 首先&a…

操作系统的特性

操作系统的性质 并发性 操作系统支持多道程序设计,即允许多个程序并发执行。通过进程管理和调度机制,操作系统能够在单个处理器上模拟出多个任务同时运行的效果,提高系统资源利用率和用户响应体验。并发性也要求操作系统具备进程同步、互斥和…

Spark-机器学习(4)回归学习之逻辑回归

在之前的文章中,我们来学习我们回归中的线性回归,了解了它的算法,知道了它的用法,并带来了简单案例。想了解的朋友可以查看这篇文章。同时,希望我的文章能帮助到你,如果觉得我的文章写的不错,请…

Syncovery for Mac v10.14.3激活版:文件备份和同步工具

Syncovery for Mac是一款高效且灵活的文件备份与同步工具,专为Mac用户设计,旨在确保数据的安全性和完整性。该软件支持多种备份和同步方式,包括本地备份、网络备份以及云备份,用户可以根据实际需求选择最合适的方案。 Syncovery f…