共享内存

共享内存

消息队列的读取和写入过程,都会有发生用户态和内核态之间的消息拷贝过程,共享内存就解决了这个问题。对于内存管理,现代操作系统采用虚拟内存技术,每个进程都有个自己独立的虚拟内存空间,不同进程的虚拟内存映射到不同的物理内存中,所以即使进程A和进程B的虚拟地址是一样的,但是访问的是不同的物理地址,对于数据的增删改查互不影响。共享内存就是拿出一块虚拟地址空间,映射到相同的物理内存中,这样进程写入的东西,另一个进程就能马上看到,提高了进程间通信的速度。

特点

  1. 共享内存是一种最高效的进程间通信方式,进程可以直接读写内存,不需要任何数据的拷贝。
  2. 为了在多个进程间交换信息,内核专门留出了一块内存区,可以由需要访问的进程将其映射到自己的私有地址空间
  3. 进程就可以直接读写这一内存区而不需要进行数据的拷贝,从而大大提高的效率。
  4. 由于多个进程共享一段内存,因此也需要依靠某种同步机制,如互斥锁和信号量等

实现步骤

  1. 创建/打开共享内容
  2. 映射共享内存,即把指定的共享内存映射到进程的地址空间用于访问
  3. 撤销共享内存映射
  4. 删除共享内存对象

主要函数

所需头文件: <sys/types.h> <sys/ipc.h>

  1. key_t ftok(const char *pathname, int proj_id);
    主要功能:利用ftok函数获得一个key值
    pathname: 存在的文件或者目录名
    proj_id: 非负整数(0-255之间)
    函数返回值: 成功返回生成的key值,失败返回-1;

  2. int shmget(key_t key, size_t size, int flag);
    主要功能:得到一个共享内存标识符或者创建一个共享对象
    key: 标识符的规则
    size: 共享存储段的字节数
    flag: 读写的权限
    返回值:成功返回共享存储的id,失败返回-1

  3. char *p = (char*) shmat(int shmID, const void* shmaddr, int shmflg);
    主要功能:映射到用户空间
    shmID:要映射的共享内存标识符
    shmaddr: 将共享内存映射到指定地址(若为NULL,则表示由系统自动完成映射)
    shmflg: SHM_RDONLY:共享内存可读; 默认0:共享内存可读写
    返回值:成功返回映射后的地址;失败返回-1;

  4. int shmdt(const void *shmaddr);
    主要功能:与shmat相反,用来断开与共享内存附加点的地址,禁止本进程访问此共享内存,撤销共享内存
    shmaddr:连接的共享内存的起始地址
    返回值:成功返回0,出错返回-1,错误原因存在error中

  5. int shmctl(int shmid, int cmd, struct shmid_ds *buf);
    主要功能:对共享内存的控制,获取,改变共享内存的状态,删除共享内存
    shmid: 共享内存标识符
    cmd:

    1. IPC_STAT:得到共享内存的状态,把共享内存的shmid_ds结构复制到buf中
    2. IPC_SET:改变共享内存的状态,把buf所指的shmid_ds结构中的uid、gid、mode复制到共享内存的shmis_ds结构体内
    3. IPC_RMID:删除这片共享内存
      buf:共享内存管理结构体
      返回值:成功返回0,失败返回-1,错误原因存在error中
posted @   Happinesspill  阅读(268)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
· Manus的开源复刻OpenManus初探
点击右上角即可分享
微信分享提示