进程间通信的只要方式有,管道,有名管道,消息队列,共享内存,socket等方式,共享内存是最高效的
进程间通信的方式,因为把同一块物理内存的地址空间映射到不同进程的地址空间当中,那么不同的进程之间
通信,通过直接修改地址空间当中的内存即可,该机制的实现只需要两次拷贝即可实现,不需要像其它的进程
通信机制那样将数据从用户空间拷贝到内核,然后在从内核拷贝到用户空间,实行四次拷贝操作,因此使用共
享内存通信比较高效。
使用共享内存的话,需要对共享的进程对共享内存的访问进行同步,防止访问对于共享数据的破坏。
共享内存的实现方式:
一 基于物理内存实现的shm_get()实现的共享内存
1 shm_get()
使用该系统调用来申请一块共享内存,使用了该系统调用之后会返回一个共享内存的键值,进程可以
使用该key值来使用这块共享内存。shm_get()操作会返回一个和key值关联的shmid,其它的进程可以通过该
shmid将该贡献内存添加到进程的地址空间里面。
2 shmat(id,addr,flag)
使用该系统调用将使用shm_get()获得的共享内存挂载到当前进程的地址空间,addr参数可以选择连接的
地址位置,通常设置为0,让操作系统选择合适的连接位置,flag也是设置为默认值0。
3 shm_dt()
可以删除指定的共享内存,从当前的进程的地址空间当中删除。通过shmat()返回的挂载的地址,将加到进程
地址空间当中的内存删除。
4 shm_ctl()
对指定的共向内存空间进行操作。也是通过shm_get()返回的标识符来进行相关的操作。
二 基于文件映射实现的mmap实现的共享内存
进程通过将一个普通文件的内映射到每个进程的地址空间当中,对映射区的修改会被写回到文件当中,其他
进程可以共享这些修改。将文件映射到了进程的地址空间之后,可以直接对该段虚拟地址空间进行读写操作,不需
使用read,write等系统调用来进行读写。
mmap实现的共享内存,每个文件有自己的内存映射区,在munmap调用之后,会将修改的内容写回文件当中。