剖析linux 管道、消息队列、共享内存,以及共享内存为什么最快?

4 篇文章 0 订阅

前言

1、缓冲区和缓存的区别

CPU缓存(Cache Memory)是位于CPU与内存之间的临时存储器,因为cpu的计算速度要比内存的读写速度快很多,而把这些可能会被重复访问到的数据存储于cpu缓存中,就会提高读取速度。可以说缓存是cpu和内存之间的临时存储器。

也就是说,buffer是因为减少调用次数,集中调用,提高系统性能。而cache是将读取过的数据保存起来,重新读取时若命中(找到需要的数据)就不要去读硬盘了,若没有命中就读硬盘。
在这里插入图片描述

2、内核缓冲区、用户缓冲区、网卡缓冲区

  • 内核缓冲区在内核空间,在内存中,用于内核程序,作为读自或写往硬件的数据缓冲区
  • 用户缓冲区在用户空间,在内存中,用于用户程序,作为读自或写往硬件的数据缓冲区
  • 网卡缓冲区既不属于内核空间,也不属于用户空间。它属于硬件缓冲,允许网卡与操作系统之间有个缓冲
    -为了加快数据的交互,可以将内核缓冲区映射到用户空间,这样,内核程序和用户程序就可以同时访问这一区间了。

数据拷贝过程

消息队列和管道基本上都是4次拷贝,而共享内存(mmap, shmget)只有两次。

4次:
1,由用户空间缓冲区中将数据拷贝到内核空间缓冲区中
2,内核空间缓冲区将数据拷贝到内存中
3,内存将数据拷贝到到内核缓冲区
4,内核空间缓冲区到用户空间缓冲区.

2次:
1,用户空间到内存
2,内存到用户空间。

消息队列和管道都是内核对象,所执行的操作也都是系统调用,而这些数据最终是要存储在内存中执行的。因此不可避免的要经过4次数据的拷贝。但是共享内存不同;
当执行mmap或者shmget时,会在内存中开辟空间,然后再将这块空间映射到用户进程的虚拟地址空间中,即返回值为一个指向一个内存地址的指针。当用户使用这个指针时,例如赋值操作,会引起一个从虚拟地址到物理地址的转化,会将数据直接写入对应的物理内存中,省去了拷贝到内核中的过程。当读取数据时,也是类似的过程,因此总共有两次数据拷贝。
也就是说(并不需要调用read、write等系统调用),这里的内存应该都是说物理内存。

共享内存实例

https://blog.csdn.net/afei__/article/details/84188548

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值