进程间通讯-共享存储
来源:互联网 发布:五星缩水软件免费版 编辑:程序博客网 时间:2024/06/05 02:22
一、什么是共享存储
共享存储允许两个或更多进程共享一给定的存储区。因为数据不需要在进程A和进程B之间复制,所以共享存储是最快的一种IPC。那么使用共享存储需要注意的问题是什么呢?因为是多个进程访问一个共同的存储区,所以需要注意的问题就是多个进程如何实现对同一存储区实现同步访问。若进程A正在将数据放入共享存储区,则在它做完这一操作之前,进程B不应该去读取这些数据。通常,信号量用于实现对共享存储访问的同步,所以,在使用共享存储解决问题时,需要在其中联合信号量操作。
共享存储的原理:
进程A和进程B同时拥有同一块存储区域,这块区域既可以属于进程A,也可以属于进程B。
共享存储也有内核对象来管理共享的内存区域
二、Linux中共享存储相关操作
1、创建或者获取函数
int shnget((key_t)key,size_t size,int flag); 返回值:若成功则返回共享存储ID,失败则返回-1
size:将要开辟的内存空间的大小
flag:IPC_CREAT-如果存在共享存储,则直接获取共享存储ID
-如果不存在,则创建新的共享存储
2、链接
void *shmat(int shmid,void *addr,int flag); 返回值:若成功则返回指向共享存储的指针,若失败则返回-1
如果addr为0,则由内核选择
如果addr不为0,并且flag没有指定为SHM_RND,则此段连接到addr所指定的地址上
如果addr非0,并且指定flag为SHN_RND,则此段连接到向addr低边界地址倍数取整的地址上。
3、断开链接
int shmdt(void *ptr); 返回值:若成功则返回0,失败则返回-1
此函数只完成断开链接操作,并不会删除共享内存。如果想删除共享内存,那么在shmctl函数中,参数cmd取IPC_RMID
4、删除内核对象
int shmctl(int shmid,int cmd,struct shmid_ds *buff); 返回值:若成功则返回0,若失败则返回-1
注意:共享内存是两个以上的进程能够操作同一块物理空间的内存区域,所以共享的区域就成了临界资源,所以对于共享区域的访问就必须要使用信号量做同步控制。
- 进程间通讯-共享存储
- 进程间通讯-共享内存
- 进程间通讯----共享内存
- 进程间通讯---共享内存
- 进程间通讯-共享内存
- 进程间通讯:共享内存
- 进程间通讯概述管道通讯信号通讯共享内存
- 操作系统学习日记-进程通讯-共享存储区
- 进程间通讯-共享内存2(代码)
- 进程间通讯共享内存的具体步骤
- 使用内存共享机制进程间通讯
- 共享内存实现进程间通讯
- 共享内存实现进程间通讯 收藏
- 进程间通讯及数据共享
- Linux进程间通讯之共享内存
- 共享内存实现进程间通讯
- Linux进程间通讯之共享内存
- 进程间通讯 —— 共享内存
- Java的native方法
- 前端PS实用切图指南
- L16 lvm详解,磁盘故障小案例
- TCP粘包/拆包--利用DelimiterBasedFrameDecoder解决TCP粘包问题
- 利用已有的大数据技术,如何构建机器学习平台
- 进程间通讯-共享存储
- Activiti-explorer从mysql切换Oracle不能自动创建表报错:ORA-00942: 表或视图不存在
- best-time-to-buy-and-sell-stock Java code
- 进程的创建-Process子类(python 版)
- 在vue项目中 如何定义全局变量 全局函数
- form表单
- 1024程序员节
- 复制单链表成为新的链表,然后return the number of items in the new list
- Destroying Array CodeForces