进程间通信---共享内存(Shared Memory)

共享内存是进程间通信最快的方式,允许多个进程访问同一块内存。通过shmget创建,shmat映射,shmdt脱离和shmctl控制。虽然没有内置同步机制,但可以配合信号量实现。文章详细介绍了共享内存的原理、实现步骤及常用函数。
摘要由CSDN通过智能技术生成
共享内存的概念:

共享内存是进程间通信(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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值