当前位置: 首页 > news >正文

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!

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

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

相关文章:

  • 自动驾驶的数据集以及yolov8和yolop
  • Oracle 复制表结构(含索引、主键)操作指南
  • 池式结构---内存池
  • 企业年报问答RAG挑战赛冠军方案:从零到SotA,一战封神
  • AI 大语言模型 (LLM) 平台的整体概览与未来发展
  • #关于数据库中的时间存储
  • 006.Gitlab CICD流水线触发
  • Python实现链接KS3,并批量下载KS3文件数据到本地
  • MySQL数据库备份与恢复详解
  • 21 天 Python 计划:MySQL索引机制从基础到应用
  • 人事招聘专员简历模板
  • 谷歌开源代理开发工具包(Agent Development Kit,ADK):让多智能体应用的构建变得更简
  • 【区分定语从句和同位语从句】
  • 普瑞PS8742B
  • 【JavaScript】对 Proxy 与 defineProperty 的理解和运用场景
  • DeepSeek大语言模型部署指南:从基础认知到本地实现
  • 使用Python从零开始构建端到端文本到图像 Transformer大模型
  • STM32F103复用JTAG/SWD引脚为GPIO
  • 数学建模:针对汽车行驶工况构建思路的延伸应用
  • 大模型SFT用chat版还是base版 SFT后灾难性遗忘怎么办
  • 深圳求职招聘网站/个人博客网页制作
  • 网站建设公司管理流程/市场调研报告范文
  • 怎么自己创建网站免费/沈阳优化网站公司
  • 好的ftp网站/培训体系包括四大体系
  • 邢台专业做网站费用/网站安全检测平台
  • 武义县建设局网站首页/seo优化资源