Linux学习记录—— 이십일 进程间通信(3)信号量和消息队列

news/2024/5/16 18:09:18/文章来源:https://blog.csdn.net/kongqizyd146/article/details/130268444

文章目录

  • 1、消息队列
  • 2、信号量
    • 1、了解概念
    • 2、信号量理解
  • 3、接口
  • 4、理解IPC


1、消息队列

两个进程ab之间系统维护一个队列结构,a进程往队列里放信息,信息编号为1,b进程往队列里放信息,信息编号为2;之后开始读取数据的时候,a就会读2的数据,b就会读1的数据。系统中有很多很多的消息队列,系统就会建立一个结构体来管理这些数据。

创建一个消息队列的接口是msgget

在这里插入图片描述

masflg参数就是IPC_CREAT IPC _EXCL, key之前写过,在这里就是一个共享内存的号。查看命令ipcs -q,删除ipcrm -q。接口删除则是这样

在这里插入图片描述

在这里插入图片描述

用man来查看。消息队列有msgsnd, msgrcv发送和接受接口。消息队列发送的消息是一个结构体类型,一个long变量,一个柔性数组,数组是要发的消息,long变量则是数据类型

消息队列是比较老旧的知识,不推荐使用,用起来也不是很舒服,完全有更好的通信方案使用。

2、信号量

1、了解概念

所有人都能看到的资源是公共资源,为了保护这个资源,系统在任何一个时刻,都只允许一个进程在进行共享资源的访问,这个就是互斥。

对于任何一个时刻,都只允许一个执行流在进行访问的共享资源叫做临界资源。比如管道。

临界资源是通过代码访问的,凡是访问临界资源的代码的区域,叫做临界区。

原子性是指要么做要么做完的两种确定状态的属性。

2、信号量理解

信号量也叫信号灯,它相当于一个计数器count,用来描述资源数量,这个资源就是临界区里可以存储的资源。任何一个执行流,想访问临界资源中的一个子资源的时候,不能直接访问,需要先申请信号量资源,也就是看看临界区里还有多少可以存储的位置,申请成功一个count就减1,;当离开临界区时,就要释放对应的临界资源,count就是加1。如果count为0,申请信号量这个进程就会被挂起。count一直为0,进程就一直阻塞,知道count又大于0。

每一个进程都会在进入临界区之前申请信号量,出去时释放信号量。

无论进程都需要先看到信号量才行。系统把信号量做成一个共享资源,信号量的+±-也具有原子性。

申请信号量资源当作P操作,释放信号量资源当作V操作,信号量的相关操作其实就是PV操作。

由于进程需要看到同一个计数器资源,所以信号量被归类到了进程间通信。

如果计数器是1,当有一个进程申请好信号量资源,count减为0后,其它进程就无法拿到资源,这就形成了一个二元信号量,也就是一个互斥功能。

3、接口

semget接口,它有key,semflg参数,semflg有两个选项IPC_CREAT IPC_EXCL,但中间还有一个参数nsems,这个参数的意思就是信号量的个数,也就是说一个进程可以一次性申请多个信号量,查看信号量就是ipcs -s,杀掉信号量就是ipcrm -s + 信号量编号。

semctl接口也可以用来删除,semctl接口有semnum的参数,代表要对哪一个信号量进行操作,cmd参数则是对应一些选项,而它还有其他参数,是一些可变参数,用man查看会看到更多详细信息。

semop接口则是操作信号量,参数中semid表示要操作的信号量;struct sembuf* sops参数是一个需要显式定义的结构体,里面要有哪个信号量,要做的操作,flag则是有一些自己的选项,可以选默认。

4、理解IPC

共享内存有自己的数据结构。

在这里插入图片描述

这是用户层可以看到的数据结构,系统底层有更多的信息,它只是给了用户可以看到的信息。

信号量,共享内存,消息队列的结构体中有很多共同点,比如第一个变量struct ipc_perm shm/sem/msg_perm。

系统会定义一个数组,放的就是struct ipc_perm* ipc_id_arr[]类型的,所以是一个指针数组,其中的元素指向struct ipc_perm类型的变量,也就是像信号量等结构体的第一个变量,指向第一个也就指向了整个结构体。所以这样就可以将内核中的所有ipc资源统一以数组的方式进行管理。如果想访问共享内存的其它元素,那就把这个数组强制转换类型成共享内存的结构体类型就好了。这对于系统是可以优化好的。

上面写的perm变量是什么?其实就是多态。信号量,消息队列结构体中的这个变量就是基类,指针数组的元素指向一个子类对象,就使用了对应的perm。

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

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

相关文章

OrCAD原理图检查

OrCAD原理图检查 FPGA或处理器芯片原理图封装检查OrCad元件Part Reference与Reference位号不同检查所有器件是否与CIS库元件匹配用CIS库中的元器件替换已存在器件方法1方法2 DRC检查修改页码Annotate重排位号利用Intersheet References功能进行off-page索引检查封装、厂家、型号…

追梦之旅【数据结构篇】——看看小白试如何利用C语言“痛”撕堆排序

追梦之旅【数据结构篇】——看看小白试如何利用C语言“痛”撕堆排序 ~😎 前言🙌堆的应用 —— 堆排序算法:堆排序算法源代码分享运行结果测试截图: 总结撒花💞 😎博客昵称:博客小梦 &#x1f60…

安装配置 JupyterLab ubuntu20.04

目录 ​编辑 (1)安装 (2)配置 (1)生成配置文件 (2)生成jupyterlab的登录密码 (3)修改 jupyter 的配置文件 (4)安装 jupyterlab…

leetcode每日一题——美团笔试题【1】

今天分享两道算法题,自己刚开始练习,可能在解法上不是最佳的,但是只提供一些自己的思路,欢迎大家多多指教~ 第一题 实现一个算法,确定一个字符串 s 的所有字符是否全都不同。 示例 1:输入: s "lee…

算法的时间复杂度和空间复杂度(2)

计算斐波那契递归Fib的时间复杂度&#xff1f; long long Fib(size_t N) { if(N < 3) return 1; return Fib(N-1) Fib(N-2); } 因为递归先递推后回归&#xff0c;看起来规律像等比数列&#xff0c;也可以用错位相减法&#xff0c;因为斐波那契数列到第二项就不会再计算了&a…

【Spring Boot】SpringBoot设计了哪些可拓展的机制?

文章目录 前言SpringBoot核心源码拓展Initializer拓展监听器ApplicationListenerBeanFactory的后置处理器 & Bean的后置处理器AOP其他的拓展点 前言 当我们引入注册中心的依赖&#xff0c;比如nacos的时候&#xff0c;当我们启动springboot&#xff0c;这个服务就会根据配置…

2023/4/20总结

项目 网上关于listview的资料太少了&#xff0c;在网上的那些资料里面&#xff0c;了解到以下这些。 如果希望listview后期能更改或者更新&#xff0c;那么需要使用到 ObservableList 它可以观察到&#xff0c;listview的改动。 需要特别注意一点的是&#xff1a;写俩者的…

第 三 章 UML 类图

文章目录 前言一、依赖关系&#xff08;虚线箭头&#xff09;二、泛化关系&#xff1a;继承&#xff08;实线空心箭头&#xff09;三、实现关系&#xff08;虚线空心箭头&#xff09;四、关联关系&#xff08;一对一为实线箭头&#xff0c;一对多为实线&#xff09;五、聚合关系…

java贸易企业工作信息管理与利润返现系统sxA5进销存程序

目 录 摘 要 I Abstract II 第1章 绪论 1 1.1 课题背景 1 1.2 研究现状 1 本章小结 1 第2章 可行性分析 2 2.1 经济可行性 2 2.2 技术可行性 2 2.3 操作可行性 2 2.4 业务流程分析 3 本章小结 3 第3章 需求分析 4 3.1 需求分析 4 …

Nuxt.js - 超详细实现路由 “伪静态“,将浏览器网页路径 URL 链接后面加上 .html 后缀名称(可以自定义任何结尾后缀名称)详细示例教程

前言 正常的项目,路由都是 /index | /user/add 这种,但有一个办法可以让其后面带上 .html,比如:/index.html。 本文 在 Nuxt.js 项目中,描述了如何实现伪静态详细教程,让页面路由后面都跟上一段自定义后缀名,比如 .html / .asp, 你可以按照本文的教程,最终得到伪静态…

react中如何系统化的处理时间操作?

在 Web 开发中&#xff0c;我们经常需要处理日期和时间的格式化。 在 React 中&#xff0c;这个过程变得更加容易和直观&#xff0c;因为我们可以使用一个叫做 moment 的 npm 包来帮助我们完成这个任务。 什么是 Moment? Moment.js是一个JavaScript库&#xff0c;用于处理日…

Vue2组件通信专题

组件通信专题 一、vue2中常用的6中组件通信方式 1. props 适用于的场景&#xff1a;父子组件通信 注意事项&#xff1a; 如果父组件给子组件传递数据&#xff08;函数&#xff09;&#xff1a;本质其实是子组件给父组件传递数据。 如果父组件给子组件传递数据&#xff08…

水质站房式在线监测系统集方案要点

水质在线自动监测系统是一套高度集成的一体化水质自动监测系统&#xff0c;其中包含水样采集处理、水质自动分析、数据采集传输、远程操作监控于一体的在线全自动监控系统。 本次方案整体系统采用一体化集成方式&#xff0c;辅助设备工艺制作精细&#xff0c;同时系统工艺流程…

使用计算机视觉实战项目精通 OpenCV:6~8

原文&#xff1a;Mastering OpenCV with Practical Computer Vision Projects 协议&#xff1a;CC BY-NC-SA 4.0 译者&#xff1a;飞龙 本文来自【ApacheCN 计算机视觉 译文集】&#xff0c;采用译后编辑&#xff08;MTPE&#xff09;流程来尽可能提升效率。 当别人说你没有底线…

Android开发—入门Kotlin编程语言

一、Kotlin简介 为什么Kotlin能代替Java此为Android官方第一支持的开发语言&#xff1f; 1&#xff09;Kotlin的语法更加简洁&#xff0c;对于同样的功能&#xff0c;使用Ktolin开发的代码量可能会比使用Java开发减少50%甚至更多&#xff1b; 2&#xff09;Kotlin语法更加高…

串口UART介绍

【记录所学】 1. 串口的硬件介绍 UART的全称是Universal Asynchronous Receiver and Transmitter&#xff0c;即异步发送和接收。串口在嵌入式中用途非常的广泛&#xff0c;主要的用途有&#xff1a; 打印调试信息&#xff1b;外接各种模块&#xff1a;GPS、蓝牙&#xff1b…

DHCP故障定位

1.请分析可能的原因,定位并排除故障。 (1)存在仿冒DHCP服务器攻击 导致部分有线终端获取到错误的IP地址、网关等信息,进而导致无法访问网关。 解决办法:为了防止DHCP Server仿冒者攻击,将与合法DHCP服务器直接或间接连接的接口设置为信任接口,其他接口设置为非信信任接…

java版工程项目管理系统源代码-功能清单 图文解析

Java版工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离 功能清单如下&#xff1a; 首页 工作台&#xff1a;待办工作、消息通知、预警信息&#xff0c;点击可进入相应的列表 项目进度图表&#xff1a;选择&#xff08;总体或单个&#xff09;项目显示…

Baumer工业相机堡盟工业相机如何联合BGAPISDK和佳能EF变焦镜头实现相机的自动变焦(C++)

Baumer工业相机堡盟工业相机如何联合BGAPISDK和佳能EF变焦镜头实现相机的自动变焦&#xff08;C&#xff09; Baumer工业相机Baumer工业相机BGAPISDK中控制变焦镜头的技术背景代码案例分享第一步&#xff1a;开启相机自动调焦功能模块第二步&#xff1a;控制自动变焦镜头电机的…

进制数转换知识点总结

二进制和十六进制 用0和1表示各种信息 计算机的电路由逻辑门电路组成。一个逻辑门电路可以看成一个开关&#xff0c;每个开关的状态是“开"&#xff08;高电位&#xff09;或“关”&#xff08;低电位&#xff09;&#xff0c;即对应于1或0 课程推荐 【【计算机科学速成…