1.共享内存的特点
1.共享内存是进程间最为有效的通信方式,直接读取内存,不需要数据的拷贝
2.内核专门留出一段内存,供访问的进程将虚拟内存映射到物理内存,进程可以直接访问,不需要数据的拷贝,这一段是由内存管理单元(MMU)完成虚拟内存映射物理内存
3.共享内存不提供同步机制,也就是说在第一个进程结束访问前,第二个进程也可以访问,所以需要信号量互斥锁来同步.

用户级页表是用户层的数据结构,是由操作系统为进程创建,记录虚拟内存和物理内存的映射关系,MMU是硬件,通过查找用户级页表来实现虚拟内存转换为物理内存.
2.步骤
1.创建key值
key_t ftok(const char *pathname, int proj_id);
功能:创建出来的具有唯一映射关系的一个key值,帮助操作系统用来标识一块共享内存
参数:
Pathname:已经存在的可访问文件的名字
Proj_id:一个字符(因为只用低8位)
返回值:成功:key值
失败:-1
2.创建或者打开共享内存
int shmget(key_t key, size_t size, int shmflg);
功能:创建或打开共享内存
参数:
key 键值
size 共享内存的大小
shmflg IPC_CREAT|IPC_EXCL|0777
返回值:成功 shmid
出错 -1
3.映射共享内存到用户空间
void *shmat(int shmid,const void *shmaddr,int shmflg); //attaches
功能:映射共享内存,即把指定的共享内存映射到进程的地址空间用于访问
参数:
shmid 共享内存的id号
shmaddr 一般为NULL,表示由系统自动完成映射
如果不为NULL,那么有用户指定
shmflg:SHM_RDONLY就是对该共享内存只进行读操作
0 可读可写
返回值:成功:完成映射后的地址,
出错:-1(地址)
4.取消映射
int shmdt(const void *shmaddr); //detaches
功能:取消映射
参数:要取消的地址
返回值:成功0
失败的-1
5.删除共享内存
int shmctl(int shmid,int cmd,struct shmid_ds *buf); //control
功能:(删除共享内存),对共享内存进行各种操作
参数:
shmid 共享内存的id号
cmd IPC_STAT 获得shmid属性信息,存放在第三参数
IPC_SET 设置shmid属性信息,要设置的属性放在第三参数
IPC_RMID:删除共享内存,此时第三个参数为NULL即可
buf shmid所指向的共享内存的地址,空间被释放以后地址就赋值为null
返回:成功0
失败-1
3.shell命令
ipcs -m: 查看系统中的共享内存
ipcrm -m shmid:删除共享内存
ps: 可能不能直接删除掉还存在进程使用的共享内存。
这时候可以用ps -ef对进程进行查看,kill掉多余的进程后,再使用ipcs查看。
4.消息队列的特点
消息队列是IPC对象(活动在内核级别的一种进程间通信的工具)的一种
一个消息队列由一个标识符 (即队列ID)来标识
消息队列就是一个消息的列表。用户可以在消息队列中添加消息、读取消息等
消息队列可以按照类型(自己设一个值作为类型)来发送/接收消息
5.步骤
- 创建key值: ftok()
- 创建或打开消息队列: msgget()
- 添加消息:按照消息的类型把消息添加到打开的消息队列末尾 msgsnd()
- 读取消息:可以按照消息的类型从消息队列中读取msgrcv()
- 删除消息队列: msgctl()
6.shell命令
ipcs -q: 查看消息队列
ipcrm -q msgid: 删除消息队列
234

被折叠的 条评论
为什么被折叠?



