前言

1、缓冲区和缓存的区别

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

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

Android缓存和消息队列 缓存和消息队列的区别_数据

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

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

数据拷贝过程

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

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

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

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