【操作系统】 为什么说共享内存是最快的一种IPC方式呢?

在linux进程间通信的方式中,共享内存是一种最快的IPC方式。因此,共享内存用于实现进程间大量的数据传输,共享内存的话,会在内存中单独开辟一段内存空间,这段内存空间有自己特有的数据结构,包括访问权限、大小和最近访问的时间等。

为什么说共享内存是最快的一种IPC方式呢?让我们一起来看一下下面的这张图:

在这里插入图片描述
从这张图中,我们可以看出,使用管道(FIFO/消息队列)从一个文件传输信息到另外一个文件需要复制4次。一是,服务器端将信息从相应的文件复制到server临时缓冲区中;二是,从临时缓冲区中复制到管道(FIFO/消息队列);三是,客户端将信息从管道(FIFO/消息队列)复制到client端的缓冲区中;四是,从client临时缓冲区将信息复制到输出文件中。

这个是对于不是共享内存的其他方式的消息传送过程,下面我们仔细来看一下对于共享内存而言,这种消息传送机制是怎样的呢?我们还是先看一下下面这张图:
在这里插入图片描述
从这张图中,我们可以看出,共享内存的消息复制只有两次。一是,从输入文件到共享内存;二是,从共享内存到输出文件。这样就很大程度上提高了数据存取的效率。

它将同一块内存区域映射到共享它的不同进程的地址空间中,使得这些进程间的通信就不需要再经过内核,只需对该共享的内存区域进程操作就可以了,但是它需要用户自己进行同步操作。

共享内存与mmap

Linux下的内存是采用页式管理机制,通过mmap进行内存映射,内核生成的映射区的大小都是以页面大小PAGESIZE为单位,即为PAGESIZE的整数倍。

注意mmap的映射大小,不能超过文件大小。有人实验过的。如果超过了,写是照写,但是文件中没有,另外的进程读不出来。

API
int shmget(key_t key, size_t size, int shmflg);  
void *shmat(int shm_id, const void *shm_addr, int shmflg); 
int shmdt(const void *shmaddr);  
int shmctl(int shm_id, int command, struct shmid_ds *buf); 
发布了318 篇原创文章 · 获赞 13 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/LU_ZHAO/article/details/105237107
今日推荐