linux 进程间通信----共享内存(下)
来源:互联网 发布:淘宝网长袖围裙 编辑:程序博客网 时间:2024/05/21 23:52
共享内存的原理:(system V)
进程间需要共享的数据被放在一个叫做IPC共享内存区域的地方,所有需要访问该共享区域的进程都要把该共享区域映射到本进程的地址空间中去。系统V共享内存通过shmget获得或创建一个IPC共享内存区域,并返回相应的标识符。内核在保证shmget获得或创建一个共享内存区,初始化该共享内存区相应的shmid_kernel结构注同时,还将在特殊文件系统shm中,创建并打开一个同名文件,并在内存中建立起该文件的相应dentry及inode结构,新打开的文件不属于任何一个进程(任何进程都可以访问该共享内存区)。所有这一切都是系统调用shmget完成的。
注:每一个共享内存区都有一个控制结构struct shmid_kernel,shmid_kernel是共享内存区域中非常重要的一个数据结构,它是存储管理和文件系统结合起来的桥梁,定义如下:
struct shmid_kernel /* private to the kernel */ { struct kern_ipc_permshm_perm; struct file *shm_file; intid; unsigned longshm_nattch; unsigned longshm_segsz; time_tshm_atim; time_tshm_dtim; time_tshm_ctim; pid_tshm_cprid; pid_tshm_lprid; };
该结构中最重要的一个域应该是shm_file,它存储了将被映射文件的地址。每个共享内存区对象都对应特殊文件系统shm中的一个文件,一般情况下,特殊文件系统shm中的文件是不能用read()、write()等方法访问的,当采取共享内存的方式把其中的文件映射到进程地址空间后,可直接采用访问内存的方式对其访问。
这里我们采用[1]中的图表给出与系统V共享内存相关数据结构:
正如消息队列和信号灯一样,内核通过数据结构struct ipc_ids shm_ids维护系统中的所有共享内存区域。上图中的shm_ids.entries变量指向一个ipc_id结构数组,而每个ipc_id结构数组中有个指向kern_ipc_perm结构的指针。到这里读者应该很熟悉了,对于系统V共享内存区来说,kern_ipc_perm的宿主是shmid_kernel结构,shmid_kernel是用来描述一个共享内存区域的,这样内核就能够控制系统中所有的共享区域。同时,在shmid_kernel结构的file类型指针shm_file指向文件系统shm中相应的文件,这样,共享内存区域就与shm文件系统中的文件对应起来。
在创建了一个共享内存区域后,还要将它映射到进程地址空间,系统调用shmat()完成此项功能。由于在调用shmget()时,已经创建了文件系统shm中的一个同名文件与共享内存区域相对应,因此,调用shmat()的过程相当于映射文件系统shm中的同名文件过程,原理与mmap()大同小异。
- Linux 进程间通信: 共享内存(下)
- Linux环境进程间通信 共享内存(下)
- Linux环境进程间通信之共享内存(下)
- Linux环境进程间通信--共享内存(下)
- Linux环境进程间通信: 共享内存(下)
- Linux环境进程间通信---共享内存(下)
- Linux进程间通信(五): 共享内存(下)
- linux 进程间通信----共享内存(下)
- Linux系统下-进程间通信(共享内存-详解)
- Linux进程间通信 —— 共享内存(下)
- Linux下进程通信之共享内存
- linux下进程间共享内存通信的问题
- Linux下进程间通信之共享内存
- Linux进程间通信-基于内存(共享内存)
- Linux下进程间通信--共享内存:最快的进程间通信方式
- Linux环境进程间通信: 共享内存
- Linux环境进程间通信:共享内存
- linux环境进程间通信:共享内存
- java动态代理(JDK和cglib)
- 关于Linux图形和字符界面切换方式和startx的个人理解
- ECAT_StateChange——EtherCAT状态转换
- 其他_postgreSQL相关
- nodejs addon binding osg
- linux 进程间通信----共享内存(下)
- hdu1851_A Simple Game博弈—SG函数
- 黑马程序员_03 抽象类和接口
- ubuntu 10.10源不用到解决办法
- XML DOM Document 对象
- 【IdeaCentre B5系列主机使用过程中经常死机怎么办】
- 【diannaoxitong】boot.ini在哪里?如何找到它
- C语言学习大纲--隐式转换
- 丑数