linux 进程间的通信(五) 共享内存-2

这篇博客详细介绍了在Linux下使用共享内存进行进程间通信的步骤,包括创建、连接、使用、分离和释放共享内存。同时提到了在实际应用中通常与信号量结合以避免访问冲突。示例代码展示了如何创建、发送和接收消息,以及管理和删除共享内存。
摘要由CSDN通过智能技术生成
 
共享内存(Shared Memory)

共享内存区域是被多个进程共享的一部分物理内存。如果多个进程都把该内存区域映射到自己的虚拟地址空间,则这些进程就都可以直接访问该 共享内存区域,从而 可以通过该区域进行通信。 共享内存是进程间共享数据的一种最快的方法,一个进程向 共享内存区域写入了数据,共享这个内存区域的所有进程就可以立刻看到其中 的内容。这块共享虚拟内存的页面,出现在每一个共享该页面的进程的页表中。但是它不需要在所有进程的虚拟内存中都有相同的虚拟地址。

 



共享内存映射图

象所有的 System V IPC对象一样,对于 共享内存对象的访问由key控制,并要进行访问权限检查。内存共享之后,对进程如何使用这块内存就不再做检查。它们必须依赖于其它机 制,比如System V的信号灯来同步对于 共享内存区域的访问。

每一个新创建的 共享内存对象都用一个shmid_kernel数据结构来表达。系统中所有的shmid_kernel数据结构都保存在shm_segs向 量表中,该向量表的每一个元素都是一个指向shmid_kernel数据结构的指针。shm_segs向量表的定义如下:
struct shmid_kernel *shm_segs[SHMMNI];

SHMMNI为128,表示系统中最多可以有128个 共享内存对象。

数据结构shmid_kernel的定义如下:
struct shmid_kernel
{   
struct shmid_ds u;         /* the following are private */
unsigned long shm_npages;  /* size of segment (pages) */
unsigned long *shm_pages;  /* array of ptrs to frames -> SHMMAX */
struct vm_area_struct *attaches;  /* descriptors for attaches */
};

其中:shm_pages是该 共享内存对象的页表,每个 共享内存对象一个,它描述了如何把该 共享内存区域映射到进程的地址空间的信息。
shm_npages是该 共享内存区域的大小,以页为单位。
shmid_ds是一个数据结构,它描述了这个 共享内存区的认证信息,字节大小,最后一次粘附时间、分离时间、改变时间,创建该共享区域的进程,最后一次 对它操作的进程,当前有多少个进程在使用它等信息。其定义如下:
struct shmid_ds {
struct ipc_perm shm_perm;   /* operation perms */
int shm_segsz;              /* size of segment (bytes) */
__kernel_time_t shm_atime;  /* last attach time */
__kernel_time_t shm_dtime;  /* last detach time */
__kernel_time_t shm_ctime;  /* last change time */
__kernel_ipc_pid_t shm_cpid; /* pid of creator */
__kernel_ipc_pid_t shm_lpid; /* pid of last operator */
unsigned short shm_nattch;   /* no. of current attaches */
unsigned short shm_unused;   /* compatibility */
void *shm_unused2;           /* ditto - used by DIPC */
void *shm_unused3;           /* unused */
};

attaches描述被共享的物理内存对象所映射的各进程的虚拟内存区域。每一个希望共享这块内存的进程都必须通过系统调用将其粘附(attach)到它 的虚拟内存中。这一过程将为该进程创建了一个新的描述这块 共享内存的vm_area_struct数据结构。进程可以选择 共享内存在它的虚拟地址空间的位 置,也可以让 Linux为它选择一块足够的空闲区域。

这个新的vm_area_struct结构除了要连接到进程的内存结构mm中以外,还被连接到 共享内存数据结构shmid_kernel的一个链表中,该 结构中的attaches指针指向该链表。vm_area_struct数据结构中专门提供了两个指针:vm_next_shared和 vm_prev_shared,用于连接该共享区域在使用它的各进程中所对应的vm_area_struct数据结构。其实,虚拟内存并没有在粘附的时候 创建,而要等到第一个进程试图访问它的时候才创建。



图 System V IPC 机制 - 共享内存

Linux
共享内存提供了四种操作。
1. 共享内存对象的创建或获得。与其它两种IPC机制一样,进程在使用 共享内存区域以前,必须通过系统调用sys_ipc (call值为SHMGET)创建一个键值为key的 共享内
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值