Linux基础内容(21)—— 进程消息队列和信号量

news/2024/10/22 15:29:54/

Linux基础内容(20)—— 共享内存_哈里沃克的博客-CSDN博客

目录

1.消息队列

1.定义

2.操作

2.信号量

1.定义

2.细节

3.延申

4.操作

3.IPC的特点共性


1.消息队列

1.定义

定义:是操作系统提供的内核级队列

2.操作

msgget:获取消息队列

 key:操作系统层面创造消息队列

magflg:与共享内存一样,表示哪种方式创造

IPC_CREAT -- 指定的共享内存,不存在,创建;存在,共享内存标志返回

IPC_EXCL -- 无法单独使用;只有当 IPC_CREAT|IPC_EXCL 同时使用,如果不存在,创建,如果存在,出错返回

return:返回一个消息队列

msgctl:设置消息队列,可得到属性,或者退出。

msgsnd:发送消息

msqid:指定的消息队列名

msgp:发送的内容

msgsz:发送内容的大小

 msgrcv:读取消息

 

 查看当前存在的消息队列

2.信号量

查看信号量 

1.定义

本质:是一个计数器,通常用来表示公共资源中资源数量的多少问题

公共资源:同时被多个进程访问的资源

公共资源被利用分为两类:1.整体使用 2.划分为一部分使用

在进程大部分都是独立的,那么其实只有少部分公共资源

2.细节

注意:之所以需要公共资源,其实是为了满足进程间通信的目的,由于每一个进程都是独立的,所以必须有一块公共资源能让两个需要互相通信的进程看到,这样就达到了通信的目的。不过此时的公共资源是有一定问题的。因为此时我们的公共资源是没有做任何保护的,那么也就意味着如果一个进程还没有完全把数据输入到公共资源里,另外一个就已经读了,那么另外一个读到的资源就是不完整的。那么由此能知道:没有被保护的公共资源存在着数据不一致的问题。

那么将公共资源进行保护,该公共资源被称为临界资源。

进程通过对应的代码访问临界资源被称为临界区。

如何保护?

互斥和同步都能实现保护公共资源。

原子性:事情要么不做要么做完,只有两态的情况。

3.延申

1.信号量是计数器表示当前进程公共资源数的多少的,其实它需要被多个进程能看到,使用信号量也是一种公共资源。

2.为什么需要信号量?共享空间中,需要分配不同的公共资源划分区域。进程访问资源的一部分,需要先申请信号量,随后得到一个与该区域对应的信号量。这样就保护了临界资源。不过信号量也是一种公共资源,那么为了保护公共资源,信号量本身也需要被保护起来。信号量内部的加减操作由于被保护,所以具有原子性。

3.PV操作:预定公共资源使得信号量--为P操作;预定公共资源使得信号量++为V操作

4.信号量值为1:那么只有两种状态,用于互斥功能

4.操作

1.semget:申请信号量 

nsems:信号量的个数

2.semctl:信号量的查看信息和删除

3.semop: PV操作

 sops:

3.IPC的特点共性

1.其实我们根据共享内存,消息队列和信号量能知道,这些进程通信手段除了使得进程看到同一份资源所以开辟一块空间,作为内核级的数据,当然需要进行先描述后组织。

2.不过当我们观察不同通信描述的属性时,发现他们的接口调用都是XXXctl。并且其中是结构体也十分相似,并且IPC属性的结构体的第一个属性都是key。其实现就相当于C++的“多态”,对于不同的通信方式传入的数据不同,会根据类型强转结构体,这样就能方便得到属性的操作了。


http://www.ppmy.cn/news/75974.html

相关文章

AC规则-4-规则和冲突解决

3.3 Introduction to Access Control Rule Conflict Resolution 3.3 访问控制规则冲突解决简介 本节从高层次讨论访问控制规则冲突解决。 本文档稍后会提供更多详细信息。 规则的优先级不是基于它在其他规则中的阅读顺序。 管理冲突规则的策略基于三个基本原则(…

【Android】(最新)跑马灯文字水平滚动(79/100)

先上效果: Android系统中TextView实现跑马灯效果,必须具备以下几个条件: android:singleLine“true”android:ellipsize“marquee”android:marqueeRepeatLimit“marquee_forever”TextView必须单行显示,即内容必须超出TextView…

【LeetCode: 10. 正则表达式匹配 | 暴力递归=>记忆化搜索=>动态规划 】

🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…

Linux——网络基础1

所谓 "局域网" 和 "广域网" 只是一个相对的概念. 比如, 我们有 "天朝特色" 的广域网, 也可以看做一个比较大的局域 网. 操作系统内部存在着多种协议,那么操作系统要管理这些协议吗? 是,管理方式:先描述,再组织。 协议本质就是软件,软件是可…

Linux系统vim查看文件中文乱码

Linux系统查看文件-cat中文正常显示 vim中文乱码 1、背景2、环境3、目的4、原因5、操作步骤5.1、修改vim编码配置 6、验证 1、背景 服务器部署业务过程中查看文件内容,使用cat 命令查看中文正常显示,使用vim命令查看显示中文乱码 cat 查看 vim 查看 …

golang 微服务中的断路器 hystrix

之前说到过微服务容错处理,可以使用 断路器 使用断路器的原因是: 当下游的服务因为过载或故障,无法提供服务,我们需要及时的让上游服务知悉,且暂时 熔断 调用方和提供方的调用链,这是为了避免服务雪崩现象…

使用柔性数组重写MyString

hello,各位宝子,今天阿崽将使用c和柔性数组的方式重新去写String类 在开始本次知识前,首先给大家介绍下柔性数组这个buff特点: 结构中的柔性数组成员前面至少要包含一个其他成员 sizeof返回的这种结构大小不包括柔性数组的内存 …

leetCode刷题记录2

文章目录 hot100题560. 和为 K 的子数组581. 最短无序连续子数组 ▲617. 合并二叉树 hot100题 560. 和为 K 的子数组 560. 和为 K 的子数组 先暴力&#xff0c;过了再说 public int subarraySum(int[] nums, int k) {int ans 0;for (int i 0; i < nums.length; i) {in…