Linux进程间通信--shmget()共享内存(二)

本文详细介绍了Linux系统中使用shmget()创建和管理共享内存的过程,包括shmid_kernel数据结构、shm_segs向量表、shmid_ds结构以及共享内存的创建、关联、分离和控制等操作。此外,还提到了共享内存与信号灯同步的重要性,以及与普通文件映射的区别和应用场景。
摘要由CSDN通过智能技术生成
共享内存区域是被多个进程共享的一部分物理内存。如果多个进程都把该内存区域映射到自己的虚拟地址空间,则这些进程就都可以直接访问该共享内存区域,从而可以通过该区域进行通信。共享内存是进程间共享数据的一种最快的方法,一个进程向共享内存区域写入了数据,共享这个内存区域的所有进程就可以立刻看到其中的内容。这块共享虚拟内存的页面,出现在每一个共享该页面的进程的页表中。但是它不需要在所有进程的虚拟内存中都有相同的虚拟地址。
 
 
图 共享内存映射图  
                         

         象所有的 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则是该共享内存对象占用内存页面的个数,以页为单位。这个数量当然涵盖了申请空间的最小整数倍.
    (A new shared memory segment,  with size  equal to the value of size rounded up to a multiple of PAGE_SIZE)
    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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值