在Linux中,每个进程都有属于自己的进程控制块(PCB)和地址空间(Addr Space),并且都有一个与之对应的页表,
负责将进程的虚拟地址与物理地址进行映射,通过内存管理单元(MMU)进行管理。
两个不同的虚拟地址通过页表映射到物理空间的同一区域,它们所指向的这块区域即共享内存。
在物理地址中有一块共同的内存区,即共享内存,这块内存可以被两个进程同时看到。
这样当一个进程进行写操作,另一个进程读操作就可以实现进程间通信。
但是,我们要确保一个进程在写的时候不能被读,因此我们使用信号量来实现同步与互斥。
对于一个共享内存,实现采用的是引用计数的原理,当进程脱离共享存储区后,计数器减一,挂架成功时,计数器加一,
只有当计数器变为零时,才能被删除。当进程终止时,它所附加的共享存储区都会自动脱离。
==================================================================
相关函数:
shmget ( ):创建共享内存
int shmget(key_t key, size_t size, int shmflg);
shmat ( ):挂接共享内存
void *shmat(int shmid, const void *shmaddr, int shmflg);
shmdt ( ):去关联共享内存
当一个进程不需要共享内存的时候,就需要去关联。
该函数并不删除所指定的共享内存区,而是将之前用shmat函数连接好的共享内存区脱离目前的进程。
shmctl ( ):销毁共享内存
int shmctl(int shmid, int cmd, struct shmid_ds *buf);
=======================================================================
参考链接: