共享内存的实现:两个不同进程共享同一块物理内存,达到访问同一份资源的目的
共享内存是所有进程间通信速度最快的一种方式,省去了数据的copy
在消息队列中就是server和client都读取了对方的数据并拷贝下来,因此有两次拷贝
但是共享内存优缺点:他自身不提供同步于互斥机制(可以通过信号量来实现)
一般申请内存,都是按照一页的大小,避免内存碎片(4K为一页)
如果申请到的内存不够一页那么操作系统自动会进行向上调整,把它申请成为一页,一页半就是两页
共享内存的特点:生命周期随内核
共享内存使用映射机制
用于Linux进程通信共享内存。共享内存函数由shmget、shmat、shmdt、shmctl四个函数组成。
1、共享内存的获取
#include <sys/ipc.h>
#include <sys/shm.h>
int shmget(key_t key, size_t size, int shmflg);
参数
key和之前消息队列一样都是为了获取共享内存的一个标识
size代表要申请的内存的大小,申请的规则之前已经提过
shmflg 和之前消息队列msgflag的作用一样在这里就不赘述了
2、共享内存的删除:
#include <sys/ipc.h>
#include <sys/shm.h>
int shmctl(int shmid, int cmd, struct shmid_ds *buf);
参数
shmid :代表共享内存的标识,和消息队列中的msgid的效果相似
cmd:代表你要操作的方式删除则设置成为IPC_RMID
buf:在删除的时候通常设置成为NULL<