文件读写,共享内存和mmap内存映射

1传统的文件读写,需要将磁盘上的数据copy到文件缓冲区(为了避免对磁盘的反复读写),都在内核空间,然后找到文件的inode,先去文件缓冲区中找有没有这个文件,如果没有的话,到磁盘再到文件缓冲区。

2.共享内存是两个进程同时开辟出一块虚拟地址空间,映射到同一块物理内存上

3.内存映射是虚拟地址上直接开辟出一块空间映射到磁盘上的一块空间。如果没有数据的拷贝,那么是如何通过虚拟地址空间的一部分内存操作磁盘上的文件,通过mmap返回的是一个函数指针,该函数指针指向虚拟地址空间分配出的一块空间的首地址,通过mmu找到其物理地址,因为并没有实现真正的数据拷贝,所以这时产生一个缺页中断,然后才会去将数据从磁盘拷贝到一块物理内存上去。

从代码层面上看,从硬盘上将文件读入内存,都要经过文件系统进行数据拷贝,并且数据拷贝操作是由文件系统和硬件驱动实现的,理论上来说,拷贝数据的效率是一样的。但是通过内存映射的方法访问硬盘上的文件,效率要比read和write系统调用高,这是为什么呢?原因是read()是系统调用,其中进行了数据拷贝,它首先将文件内容从硬盘拷贝到内核空间的一个缓冲区,如图2中过程1,然后再将这些数据拷贝到用户空间,如图2中过程2,在这个过程中,实际上完成了 两次数据拷贝 ;而mmap()也是系统调用,如前所述,mmap()中没有进行数据拷贝,真正的数据拷贝是在缺页中断处理时进行的,由于mmap()将文件直接映射到用户空间,所以中断处理函数根据这个映射关系,直接将文件从硬盘拷贝到用户空间,只进行了 一次数据拷贝 。因此,内存映射的效率要比read/write效率高。

2和3都是只需要将数据copy一次。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值