有一种mmap技术,也就是内存映射,直接将磁盘文件数据映射到内核缓冲区,这个映射的过程是基于DMA引擎拷贝的,同时用户缓冲区是跟内核缓冲区共享一块映射数据的,建立共享映射之后,就不需要从内核缓冲区拷贝到用户缓冲区了。
光是这一点,就可以避免一次拷贝,但是这个过程中还是会用户态切换到内核态去进行映射拷贝,接着再次从内核态切换到用户态,建立用户缓冲区和内核缓冲区的映射,接着把数据通过Socket发送出去,还是要再次切换到内核态,接着直接把内核缓冲区里的数据拷贝到Socket缓冲区里去,然后再拷贝到网络协议引擎里,发送出去就可以了,最后切换回用户态。减少一次拷贝,但是并不减少切换次数,一共是4次切换,3次拷贝。
内存映射指的是将 : 进程中的 1个虚拟内存区域 &1个磁盘上的对象 ,使得二者存在映射关系。当然,也可以多个进程同时映射到一个对象上面。
进程在读写磁盘的时候,大概的流程是:
以write 为例:
进程(用户空间) ->系统调用,进入内核 ->将要写入的数据从用户空间拷贝到内核空间的缓存区 ->调用磁盘驱动 ->写在磁盘上面。
使用mmap之后
进程(用户空间)-->读写映射的内存 -->写在磁盘上面。
(这样的优点是 避免了频繁的进入内核空间,进行系统调用,提高了效率)
共享内存是一种ipc的方式,用于进程通信。共享内存位于 进程空间的 栈和堆之间。一般默认的大小是32M。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)