| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 系统运维 -> [OS-Linux]详解Linux的进程间通信2------system V共享内存(Shared Memory) -> 正文阅读 |
|
[系统运维][OS-Linux]详解Linux的进程间通信2------system V共享内存(Shared Memory) |
本文详解了通过共享内存进行进程间通信的方法,并对消息队列,信号量做了简单介绍。 另一种进程间通信--管道,见前文:[OS-Linux]详解Linux的进程间通信1------管道_RMA515T的博客-CSDN博客 管道通信本质是基于文件,OS没有过多的设计。 system V进程间通信是OS特地设计的通信方式,让不同进程看到同一份资源。system V进程间通信包括了共享内存、消息队列、信号量。共享内存与消息队列以传输数据为目的,信号量则是保证进程的同步与互斥设计的,属于通信的范畴。 目录 一、system V共享内存共享内存区是最快的IPC形式。一旦这样的内存映射到共享它的进程的地址空间,这些进程间数据传递不再涉及到内核,换句话说是进程不再通过执行进入内核的系统调用来传递彼此的数据 共享内存并未提供同步机制,在第一个进程结束对共享内存的写操作之前,并无自动机制可以阻止第二个进程开始对它进行读取。 共享内存示意图 二、共享内存原理每个进程都有进程控制块(PCB)和地址空间(Addr Space),通过页表对应,负责虚拟地址与物理地址映射,通过内存管理单元(MMU)管理。两个不同的虚拟地址通过页表映射到物理空间的同一区域,它们所指向的这块区域即共享内存。 1. 共享内存的通信原理当两个进程通过页表将虚拟地址映射到物理地址时,共享内存可以被两个进程同时看到。这样当一个进程进行写操作,另一个进程读操作就可以实现进程间通信。但要确保一个进程在写的时候不能被读,所以通过信号量来实现同步与互斥。 共享内存实现采用的是引用计数的原理,当进程脱离共享存储区后,计数器减一,挂架成功时,计数器加一,只有当计数器变为零时,才能被删除。当进程终止时,它所附加的共享存储区都会自动脱离。 2. 共享内存数据结构
?3.共享内存的建立过程? ? ? ?(1)申请共享内存(物理内存已经开辟好了); ? ? ? ?(2)共享内存挂接到地址空间(建立映射关系); ? ? ? ?(3)去关联共享内存(修改页表,取消映射关系); ? ? ? ?(4)释放共享内存(内存归还给系统)。 三、共享内存函数1.shmget函数功能:用来创建共享内存 原型:
参数: 2.shmat函数功能:将共享内存段连接到进程地址空间
参数: 另外: shmaddr为NULL,核心自动选择一个地址。 3.shmdt函数功能:将共享内存段与当前进程脱离
参数:shmaddr: 由shmat所返回的指针 返回值:成功返回0;失败返回-1 4. shmctl函数功能:用于控制共享内存
参数:
三、共享内存实例server通过共享内存给client发送数据。、 ftok函数:把一个已经存在的路径名和一个整数标识得转换成一个key_t值,称为IPC键 makefile
server.c
client.c
结果运行时 正常接收 ?挂接也为2 终止后挂接为0。? 四、system V消息队列消息队列提供了一个从一个进程向另外一个进程发送一块数据的方法。 ?五、system V信号量信号量主要用于同步和互斥的。 1.进程互斥由于各进程要求共享资源,而且有些资源需要互斥使用,因此各进程间竞争使用这些资源,进程的这种关系为进程的互斥。 系统中某些资源一次只允许一个进程使用,称这样的资源为临界资源或互斥资源。 总结进程间的通信主要分为管道和system V,管道有可分为匿名管道和命名管道;system V进程间通信包括了共享内存、消息队列、信号量。两篇文章对他们进行了介绍。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/15 23:58:41- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |