共享内存用于实现进程间大量的数据传输。
共享内存空间是在内存中单独开辟的一段内存空间。这段空间有自己特有的数据结构,包括访问权限、大小和最近访问时间等。

重要的数据结构

shmid_ds

  1. /*位于/usr/include/linux/shm.h*/
  2. struct shmid_ds {
  3. struct ipc_perm shm_perm; /* 操作权限 */
  4. int shm_segsz; /* 段大小(bytes) */
  5. __kernel_time_t shm_atime; /* 最近attach时间 */
  6. __kernel_time_t shm_dtime; /* 最近detach时间 */
  7. __kernel_time_t shm_ctime; /* 最近change时间 */
  8. __kernel_ipc_pid_t shm_cpid; /* 创建者pid */
  9. __kernel_ipc_pid_t shm_lpid; /* 最近操作者pid */
  10. unsigned short shm_nattch; /* no. of current attaches */
  11. unsigned short shm_unused; /* compatibility */
  12. void *shm_unused2; /* ditto - used by DIPC */
  13. void *shm_unused3; /* unused */
  14. };

配合信号量使用

一般,不允许几个进程同时对共享内存进行写操作。因此有必要使用二元信号量来同步两个进程以实现对共享内存的写操作。

与管道的对比

使用管道(pipe或FIFO)从一个文件传输信息到另一个文件需要复制4次:

  • 服务端将信息从输入文件复制到server临时缓存区
  • 从server临时缓冲区复制到管道
  • 客户端从管道复制到client临时缓冲区
  • 再从client临时缓存区复制到输出文件

使用共享内存只需要复制两次:

  • 从服务端将信息从输入文件复制到共享内存
  • 客户端从共享内存复制到输出文件

pipe管道中,输入、输出文件对应的是标准输入、输出。