Linux IPC——简单应用 共享内存(Share Memory)


目录

 

一:共享内存

1.1定义

1.2优缺点

1.2.1 优点

1.2.2缺点

1.3共享内存结构维护

1.4共享内存的通信原理

二:相关函数接口

2.1 Linux命令

2.1.1查看系统中的共享储存段

 2.1.2删除系统中的共享储存段  

2.2 函数

2.2.1shmget()创建共享内存函数

2.2.2shmctl()销毁等 函数

2.2.3shmat()脱接共享内存函数

2.2.4shmdt()去关联共享内存函数

三:代码测试

3.1shma.c文件

3.2shmb.c文件


一:共享内存

1.1定义

    内核管理一片物理内存,允许不同的进程同时映射(访问),多个进程可以映射同一块内存。被多个进程同时映射的物理内存:即共享内存。(允许多进       程同步访问给定的储存区域)。

    映射物理内存-》挂接 ; 用完之后解除映射-》脱接

1.2优缺点

1.2.1 优点

    因为数据不需要在客户进程和服务器进程之间复制,所以这是一种最快的IPC

1.2.2缺点

    内核没有提供对共享内存的互斥访问。(信号量,互斥量等)

1.3共享内存结构维护

    内核为每个共享内存都维护相关信息:

 

//共享内存的维护信息
struct shmid_ds{
    struct ipc_perm     shm_perm;    //权限控制
    size_t              shm_segsz;   //size of segement in bytes 字节数
    pid_t               shm_lpid;    //pid of last shomp() 最后执行shomp()的进程ID
    pid_t               shm_cpid;    //创建该共享内存的ID
    shmatt_t            shm_nattch;  //number of current attaches,现有连接数
    time_t              shm_time;    //最后被连接时间
    time_t              shm_dtime;   //最后删除连接的时间
    time_t              shm_ctime;   //最后修改时间
     .
     .
}   

1.4共享内存的通信原理

    Linux,中每个进程都有自己的PCB(进程控制块)和Addr Space(地址空间),该虚拟地址空间通过多级页表(这里以一级页表为例)和物理地址空间进行映射,通过内存管理单元(MMU)进行管理。两个不同的虚拟地址通过页表映射到物理空间的同一区域,它们所指向的这个块区域即:共享内存。

     对于一个共享内存,实现采用的是引用计数的原理,当进程脱接共享储存区后,计数器减一;挂接则加一,直至计数器变为0,该共享内存才被删除。当进程终止的时间,它所附加的共享储存区都会自动脱离。

    这里还可以解决一个问题:为什么共享内存速度最快?

    上图中:Proc A进程在给共享区域写数据,Proc B 进程从其中读取数据,再次其中一共发生了两次数据的复制:

                      (1):Prco A 到共享内存             (2) : 共享内存到 Prec B

    因为直接在内存上操作,所以共享内存的速度也就提高了。

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值