news 2026/10/3 2:36:32

Linux进程通信——共享内存、消息队列和信号量

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Linux进程通信——共享内存、消息队列和信号量




共享内存通信

共享内存是 Linux 下速度最快的进程间通信方式,核心思想是:在物理内存中开辟一块共享内存块,多个进程通过页表映射,将这块物理内存挂载到各自独立的虚拟地址空间中。进程直接读写虚拟地址,就等价于操作同一块物理内存,省去内核缓冲区拷贝,通信效率极高。

⚠️ 重要缺陷:共享内存没有自带同步互斥机制。多个进程同时读写共享区域会产生竞态问题,需要额外搭配信号量、互斥锁来控制访问时序。
创建时会使用的函数:
获取 shmid:shmget(key_t key(用户给的键值), int size(内存块大小), shmflag(IPC_CREAT|IPC_EXCL|0666))
挂接: shmat(shmid, nullptr, 0);返回值为起始虚拟空间地址
解除挂接: shmdt(shmaddr(起始虚拟空间地址))
删除内存块: shmctl(_shmid, IPC_RMID, nullptr)

下面是小demo:
基本结构

#pragmaonce#include<iostream>#include<sys/ipc.h>#include<sys/shm.h>#include<sys/types.h>#include<cstdio>#include<unistd.h>#include<cstring>#definePATHNAME"/tmp"#defineproj_id066#defineSIZE128classshared_memory{public:shared_memory():_shmid(-1),_size(SIZE),_start_shmaddr(nullptr){}~shared_memory(){}private:int_shmid;//给用户使用的id,跟fd文件描述符类似功能都是供给用户使用int_size;//内存块大小void*_start_shmaddr;//映射到虚拟地址空间的共享区起始地址};

创建内存块和获取:
ftok()函数是根据路径加用户给的随便的八进制数字组成的key(标识内存块的唯一值,跟inode的作用类似)

//创建共享内存块voidCreate(){_shmid=Get_shmid(IPC_CREAT|IPC_EXCL|0666);if(_shmid<0){std::cerr<<"file already exists"<<std::endl;exit(1);}std::cout<<"create success!!! shmid = "<<_shmid<<std::endl;}voidGet(){_shmid=Get_shmid(IPC_CREAT);}intGet_key(){key_t key=ftok(PATHNAME,proj_id);if(key<0){std::cerr<<"key already exists"<<std::endl;exit(1);}printf("key:%d\n",key);returnkey;}intGet_shmid(intshmflag){key_t key=Get_key();returnshmget(key,SIZE,shmflag);}

挂接、解挂接和删除:

//挂接到进程中voidsh_attach(){_start_shmaddr=shmat(_shmid,nullptr,0);if(_start_shmaddr==(void*)(-1))exit(1);std::cout<<"进程挂接共享内存块成功!"<<std::endl;}//解除进程挂接voidsh_Dattach(){intn=shmdt(_start_shmaddr);}//删除内存块voidDelete(){intn=shmctl(_shmid,IPC_RMID,nullptr);}

消息队列通信(了解即可)

消息队列是另一种进程间通信方式,通过在内核中维护一个消息链表,进程间以「消息」为单位传递数据。相比共享内存,它自带一定的同步机制,但传输效率较低,适合传递小数据量、需要顺序保证的场景。这里仅作了解,重点掌握共享内存即可。

信号量(了解即可)

信号量主要用于解决共享内存的同步互斥问题,本质是一个计数器,通过 P 操作(申请资源,计数器减一)和 V 操作(释放资源,计数器加一)来保护临界区。它与共享内存搭配使用,这里仅需了解其作用即可,不必深入实现细节。后面有更好的信号量来搭配共享内存

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/3 2:36:08

用Sklearn实现TF-IDF英文关键词提取:原理、参数调优与实战

做英文文本的关键词提取&#xff0c;TF-IDF 是我最常用也最愿意教别人上手的方法。别急着去背那些复杂的公式&#xff0c;你先把它当成一个“打分系统”&#xff1a;每个词都按它在一篇文档里的重要程度打分&#xff0c;分高就是关键词。配合 Python 的 Sklearn&#xff0c;整个…

作者头像 李华
网站建设 2026/10/3 2:33:49

Prometheus+Grafana知识梳理(3)

作者&#xff1a;没有四次元口袋的蓝胖 日期&#xff1a;2026-10-02 标签&#xff1a;Alertmanager, Docker, 监控体系Alertmanager报警与Docker部署 监控的最后一公里是告警——数据采集得再好、面板做得再漂亮&#xff0c;如果出了问题没人知道&#xff0c;等于白搭。Alertma…

作者头像 李华
网站建设 2026/10/3 2:32:57

边缘节点就近接入原理与实践(实战笔记)最佳实践与踩坑记录

本文深入探讨边缘节点就近接入原理与实践&#xff08;实战笔记&#xff09;&#xff0c;涵盖背景分析、原理剖析、实战步骤、配置示例、优化建议和避坑指南。作为CDN与内容分发从业者&#xff0c;掌握边缘节点就近接入原理与实践&#xff08;实战笔记&#xff09;不仅能提升系统…

作者头像 李华
网站建设 2026/10/3 2:32:29

iOS版本录音APP怎么操作实时转文字?

很多iOS用户在会议、讲座记录场景中&#xff0c;都会遇到两个核心问题&#xff1a;iOS系统是否支持录音实时转文字、主流录音APP的实时转写功能具体如何操作、存在哪些使用限制。本文针对高频使用误区&#xff0c;客观解答iOS设备录音转文字的可用条件、操作流程与功能边界。一…

作者头像 李华