Linux:35.其他IPC和IPC原理+信号量入门

通过命名管道队共享内存的数据发送进行保护的bug:
命名管道挂掉后,进程也挂掉了。

6.systemV消息队列

原理:进程间IPC:原理->看到同一份资源->维护成为一个队列。

过程:

进程A,进程B进行通信。
让操作系统提供一个队列结构,A数据放在队列结点,把结点放在OS内部,B也这么干
消息队列可以实现双向通信

进程A放数据,还要放type,
进程A那数据,只拿type和自己不一样的数据。来区分自己和别的数据

结论:

结论1:消息队列,提供了一种进程给另一种进程发送有类型数据块的方式。区分那个数据是我要的,那个数据是我发的。

方法:入队列,出队列,

结论2:消息队列存在多个,OS要对消息队列进行管理->先描述,再组织。
::


消息队列的结构体:


struct msgid_ds
{
}消息队列
struct node{
}结点。


结论3:两个进程怎么保证自己看到是同一个消息队列,两个进程约定一个key,再把key放在消息队列里面。跟共享内存一样。

消息队列的调用接口:

msgget:创建消息队列
    key_t key    :
    int msgflag:
跟共享内存是一样的。
msgctl:删除消息队列

消息队列:结构体


消息队列结构体:
struct msgid_ds{
stryct ipc_prem sg perm

}

perm信息
struct perm
{
    key_t key
}
共享内存的创建基本是保持一致的,除了需要type进行区别


msgsnd:发数据

msgrcv:收数据,msgtype!!!

三种ipc通信

ipcs -q:就看消息队列

下面那个是删除 

 msgsize():msgdata的大小,type必须大于0

---------------------------------------------------------------------------------------------------------------------------------
这种相似性,叫做system V标准。 

---------------------------------------------------------------------------------------------------------------------------------

7.system V信号量

为什么要信号量

解决保护机制引入->信号量 

基本概念

• 多个执⾏流(进程),能看到的同⼀份公共资源:共享资源

• 被保护起来的资源叫做临界资源

• 保护的⽅式常⻅:互斥与同步

• 任何时刻,只允许⼀个执⾏流访问资源,叫做互斥

• 多个执⾏流,访问临界资源的时候,具有⼀定的顺序性,叫做同步

• 系统中某些资源⼀次只允许⼀个进程使⽤,称这样的资源为临界资源或互斥资源。

• 在进程中涉及到互斥资源的程序段叫临界区。你写的代码=访问临界资源的代码(临界区)+不访问 临界资源的代码(⾮临界区)

• 所谓的对共享资源进⾏保护,本质是对访问共享资源的代码进⾏保护

互斥:

怎么保护:只允许一个执行流访问资源->互斥
 

保护临界区的一种手段

!!!!!!!!!!!!!!

多个执行流,访问临界资源的时候,具有一定的顺序性,叫做同步。->一个人访问完后,通知下一个人继续访问,保证临界区的安全。

原子性:要么做,要么就不做


申请资源,申请锁。
访问资源,锁是要共享的

谁来保证锁的安全->申请锁的时候,就需要原子性的概念了。

7-2信号量

1.信号量是什么?

本质是一个计数器,用来表示,临街资源中,资源的数量是多少。

2.理解信号量 


电影院就是共享内存,把共享内存按照不同的区域,部分使用,
1.不要访问同一个位置
2.不要放过多的进程进来

信号量本质是个计数器,表述的是临界资源中,资源数量的多少

所有进程,访问临界资源中的一小块,就修现申请信号量
进程访问资源前,现申请信号量,本质是:对资源的预定机制


过程:进程访问资源,先对信号量进行申请,申请后,信号量--,如果信号量为0,那么就不会给你
 

细节1:信号领本身就是共享资源
申请 -- ,原子性--> p操作

sem ++,原子性-->v操作,归还资源

细节2:
信号量只有1或者0的两态的信号量叫做二元信号量。--->这就是互斥
二元信号量的本质就是互斥 

3.共享资源使用的问题

信号量和通信有什么关系???
1.先访问信号量P,每个进程都得先看到同一个信号量!!
system V可以解决这个问题
2.不是传递数据,是通信IPC,通知,同步互斥,也算
传递控制信息

 4.信号量接口

1.创建信号量:
semeget:
key:
nsems:信号量的个数
semflag:权限

返回值:信号量级别的返回值semid
 


2.查看信号量资源:
ipc -s:
semid:返回值
ower:谁创建的
perms:权限
nsem:数量
 

3.删除信号量: 

4.对信号量进行操作
semop

sembuf:结构体
sem_op:操作P/V
flg:暂时不管
 

5.初始化信号量:

cmd->SETVAL

细节信号量的初始值是多少???

semctl:还
对信号量新进参数初始化。

setval:设计在信号量集中第几个信号量的值

senum:信号量集里面信号量的下标

...:可变参数,可传入结构体semun

senum = 0,cmd = SETCAL,对信号量集中下标为0的用“...”指向的结构体进行初始化

查看信号量ipc -s

OS内部存在大量的信号量集

操作系统也要对信号量进行挂历->先描述在,在组织。

信号量结构体:
struct ipc_perm_sem_perm

ipc_perm:第一个资源都是key

struct XXXid_ds的结构!!! - >key!

大图总结:(手机再看一遍)

 加餐:基于简单建造者模式的消息队列

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

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

相关文章

【数据结构】红黑树超详解 ---一篇通关红黑树原理(含源码解析+动态构建红黑树)

一.什么是红黑树 红黑树是一种自平衡的二叉查找树,是计算机科学中用到的一种数据结构。1972年出现,最初被称为平衡二叉B树。1978年更名为“红黑树”。是一种特殊的二叉查找树,红黑树的每一个节点上都有存储表示节点的颜色。每一个节点可以是…

2024年第十五届蓝桥杯CC++大学A组--成绩统计

2024年第十五届蓝桥杯C&C大学A组--成绩统计 题目: 动态规划, 对于该题,考虑动态规划解法,先取前k个人的成绩计算其方差,并将成绩记录在数组中,记录当前均值,设小蓝已检查前i-1个人的成绩&…

vue2使用ezuikit-js播放萤石视频

需求:需要在大屏上播放萤石视频,用到官方的ezuikit-js插件实现,并实现视频播放切换功能。有个问题至今没有解决,就是萤石视频的宽高是固定的,不会根据大屏缩放进行自适应。我这边做了简单的刷新自适应。 1.下载ezuikit…

爱普生TG-5510CA和TG-5510CB晶振成为服务器中的理想之选

在数字化时代,服务器作为数据存储、处理与传输的核心枢纽,其性能的优劣直接影响着整个信息系统的运行效率与稳定性。从企业内部的数据中心到云计算服务提供商的大规模集群,服务器需要应对海量数据的高速处理与频繁交互。而在服务器复杂精密的…

使用opentelemetry 可观测监控springboot应用的指标、链路实践,使用zipkin展示链路追踪数据,使用grafana展示指标

1.安装docker,docker-compose (1)安装依赖包 yum install -y yum-utils device-mapper-persistent-data lvm22.2、部署dockertar xvf docker-20.10.19.tgz cp docker/* /usr/bin/vim /usr/lib/systemd/system/docker.service[Unit] Descript…

5. 蓝桥公园

题目描述 小明喜欢观景,于是今天他来到了蓝桥公园。 已知公园有 N 个景点,景点和景点之间一共有 M 条道路。小明有 Q 个观景计划,每个计划包含一个起点 stst 和一个终点 eded,表示他想从 stst 去到 eded。但是小明的体力有限&am…

虚幻基础:碰撞帧运算

能帮到你的话,就给个赞吧 😘 文章目录 碰撞碰撞盒线段检测 帧运算:每个程序流就是一帧的计算结果速度过快时(10000),导致每帧移动过大(83),从而导致碰撞盒错过而没有碰撞速度快的碰撞要用线段检测 碰撞 碰撞盒 线段检…

Qt 入门 3 之对话框 QDialog

Qt 入门 3 之对话框 QDialog 本文从以下几点分开讲述: - 对话框的基本原理介绍 - 两种不同类型的对话框 - 一个由多个窗口组成并且窗口间可以相互切换的程序 1.模态和非模态对话框 QDialog 类是所有对话框窗口类的基类。对话框窗口是一个经常用来完成短小任务或者…

数据结构——哈希技术及链地址法

目录 一、哈希的定义 二、哈希冲突定义 三、构造哈希函数的方法 四、四种解决哈希冲突的方法 4.1 开放地址法 4.2 链地址法 4.3 再散列函数法 4.4 公共区溢出法 五、链地址法结构体设计 六、基本操作的实现 6.1 哈希函数 6.2 初始化 6.3 插入值 6.4 删除值 6.5 查…

算法思想之前缀和(二)

欢迎拜访:雾里看山-CSDN博客 本篇主题:算法思想之前缀和(二) 发布时间:2025.4.11 隶属专栏:算法 目录 滑动窗口算法介绍核心思想大致步骤 例题和为 K 的子数组题目链接题目描述算法思路代码实现 和可被 K 整除的子数组题目链接题目…

开源的7B参数OCR视觉大模型:RolmOCR

1. 背景介绍 早些时候,Allen Institute for AI 发布了 olmOCR,这是一个基于 Qwen2-VL-7B 视觉语言模型(VLM)的开源工具,用于处理 PDF 和其他复杂文档的 OCR(光学字符识别)。开发团队对该工具的…

移动端六大语言速记:第14部分 - 数据库操作

移动端六大语言速记:第14部分 - 数据库操作 本文将对比Java、Kotlin、Flutter(Dart)、Python、ArkTS和Swift这六种移动端开发语言在数据库操作方面的特性,帮助开发者理解和掌握各语言的数据库编程能力。 14. 数据库操作 14.1 SQL查询 各语言SQL查询实现方式对比: 特性Ja…

有哪些反爬机制可能会影响Python爬取视频?如何应对这些机制?

文章目录 前言常见反爬机制及影响1. IP 封禁2. 验证码3. 请求头验证4. 动态加载5. 加密与混淆6. 行为分析 应对方法1. 应对 IP 封禁2. 应对验证码3. 应对请求头验证4. 应对动态加载5. 应对加密与混淆6. 应对行为分析 前言 在使用 Python 爬取视频时,会遇到多种反爬…

ESP32开发入门:基于VSCode+PlatformIO环境搭建指南

前言 ESP32作为一款功能强大的物联网开发芯片,结合PlatformIO这一现代化嵌入式开发平台,可以大幅提升开发效率。本文将详细介绍如何在VSCode中搭建ESP32开发环境,并分享实用开发技巧。 一、环境安装(Windows/macOS/Linux&#xf…

DeepSeek:穿透行业知识壁垒的搜索引擎攻防战

DeepSeek:穿透行业知识壁垒的搜索引擎攻防战 文 / 产业智能观察组(人机协同创作) 一、搜索引擎的"认知折叠"危机 2024年Q1数据显示,百度搜索结果前10页中,61.7%的内容存在"伪专业化"现象——看似…

SQL 外键(Foreign Key)详细讲解

1. 什么是外键?​​ ​​定义​​:外键是数据库表中的一列(或一组列),用于​​建立两个表之间的关联关系​​。外键的值必须匹配另一个表的主键(Primary Key)或唯一约束(Unique Con…

5G中的DU和CU的作用

在5G网络架构中,CU(Centralized Unit,集中单元) 和 DU(Distributed Unit,分布单元) 是无线接入网(RAN)的重要组成部分,它们的分工和作用如下: 1.…

深度解析 n8n:强大的开源工作流自动化平台

在数字化时代,企业和个人面临着日益复杂的工作流程和多样化的应用工具,如何高效整合这些资源、实现工作流的自动化成为提升效率的关键。n8n 作为一款开源的工作流自动化平台,凭借其强大的功能、广泛的应用集成能力和灵活的部署方式&#xff0…

ruby超高级语法

以下是 Ruby 中一些 极度硬核 的语法和底层特性,涉及元编程的深渊、虚拟机原理、语法黑魔法等,适用于追求极限的 Ruby 开发者: 高级语法一 一、语法核弹级操作 1. 动态修改继承链 class A; def foo; "A"; end end class B; def …

flutter 获取通话记录和通讯录

Dart SDK version is 3.7.01 dependencies:flutter:sdk: flutterpermission_handler: ^11.0.1 # 权限管理flutter_contacts: ^1.1.92call_log: ^5.0.5cupertino_icons: ^1.0.8dev_dependencies:flutter_test:sdk: flutterflutter_lints: ^5.0.0 2 contact_and_calls_page.da…