共享内存的概念:
共享内存是进程间通信(IPC)中最简单的方式之一,也是最快的IPC形式。共享内存允许两个或多个进程访问同一块内存。当一个进程改变了这块内存中的内容的时候,其他进程就可以察觉到这种更改。一旦这样的内存映射到共享它的进程的地址空间,这些进程间的数据传递将不再涉及到内核,即进程不再通过执行进入内核的系统调用来传递数据,而是这些进程通过共享内存来传递数据。
共享内存的原理:
共享内存就是有一块内存被多个进程共享,所谓共享,就是在物理内存中开辟一块内存,让两个或两个以上的进程分别将新开辟的物理内存映射到自己的地址空间。
什么是映射:
在物理内存中开辟一块空间,然后两个进程将各自的页表进行修改,然后映射到各自的进程地址空间上,进而把地址空间上的虚拟地址返回给用户,往后就可以使用这个虚拟地址。当执行一条命令的时候,在CPU上访问的地址其实是虚拟地址,只有正在执行这条命令时,它才会把虚拟地址转换为物理地址。
共享内存的实现步骤:
1.创建共享内存区,通过shmget实现。在物理内存中开辟一块共享内存区。
2.把这块共享内存区挂接映射到两个进程的地址空间上,通过shmat实现。
3.完成通信之后,撤销内存映射关系,通过shmdt进行脱离。
4.删除共享内存区,通过shmctl实现。
共享内存示意图:
共享内存的数据结构:
在/usr/include/linux/shm.h 中:
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