Linux系统编程18_共享内存

在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);

=======================================================================

参考链接:

共享内存:https://blog.csdn.net/ypt523/article/details/79958188

posted @ 2021-04-14 22:54  Grooovvve  阅读(88)  评论(0编辑  收藏  举报