共享内存实现原理

mmap机制

在磁盘上建立一个文件,每个进程存储器中,单独开辟一个空间来映射保存到实际硬盘,实际并没有反映到主存上。
使得进程之间通过映射同一个普通文件实现共享内存,普通文件被映射到进程地址空间后,进程可以向访问普通内存一样对文件进行访问,不必再调用read(),write()等操作。

  • 优点:存储量大
  • 缺点:读取和写入速度比较慢
shm机制

每个进程的共享内存都直接映射到实际物理存储器上shm保存到物理存储器(主存),实际的存储量直接反映到主存上。
进程间需要共享的数据被放在一个叫做IPC共享内存区域的地方,所有需要访问该共享区域的进程都要把该共享区域映射到本进程的地址空间中去。

  • 优点:进程间访问速度比磁盘快
  • 缺点:存储量不能非常大

通过shmget获得或创建一个IPC共享内存区域,并返回相应的标识符。
每一个共享内存区都有一个控制结构struct shmid_kernel。

主要API:shmget()、shmat()、shmdt()及shmctl()。

  • shmget()用来获得共享内存区域的ID,如果不存在指定的共享区域就创建相应的区域。
    int shmget(key_t key,size_t size,int shmflg);
    key:共享内存键值,可以理解为共享内存的唯一性标记。
    size:共享内存大小
    shmflag:创建进程和其他进程的读写权限标识。
    返回值:相应的共享内存标识符,失败返回-1

  • shmat()把共享内存区域映射到调用进程的地址空间中去,这样,进程就可以方便地对共享区域进行访问操作。
    void *shmat(int shm_id,const void *shm_addr,int shmflg);
    shm_id:共享内存标识符
    shm_addr:指定共享内存连接到当前进程的地址,通常为0,表示由系统来选择。
    shmflg:标志位
    返回值:指向共享内存第一个字节的指针,失败返回-1

  • shmdt()调用用来解除进程对共享内存区域的映射。

  • shmctl实现对共享内存区域的控制操作。
    int shmctl(int shm_id,int command,struct shmid_ds *buf);
    shm_id:共享内存标识符
    command: 有三个值
    IPC_STAT:获取共享内存的状态,把共享内存的shmid_ds结构复制到buf中。
    IPC_SET:设置共享内存的状态,把buf复制到共享内存的shmid_ds结构。
    IPC_RMID:删除共享内存
    buf:共享内存管理结构体。

ps:Python开启多进程使用的是multiprocessing,进程传递了一个multiprocessing.Queue,使用的是shm共享内存机制。multiprocessing模块Value Array是基于mmap实现

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容