首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >虚拟存储器中的存储器映射大小控制

虚拟存储器中的存储器映射大小控制
EN

Stack Overflow用户
提问于 2013-07-19 09:55:53
回答 2查看 1K关注 0票数 1

我在下面的链接中看到了关于内存映射的内容

https://en.wikipedia.org/wiki/Memory-mapped_file

http://en.wikipedia.org/wiki/Memory-mapped_I/O

它用于映射文件和设备。它说与直接从磁盘/闪存读取相比,文件映射具有更快优点。但是,为什么将数据从磁盘/闪存复制到虚拟内存需要同样多的时间呢?

但是找不到使用内存映射I/O的优点。与直接读取相比有什么好处?

由于内存映射在虚拟内存中具有特定的区域,因此它在堆内存之上,而在堆栈空间之下。因为我们可以控制进程的堆和堆栈空间。如何控制(即增加/减少)虚拟内存中的内存映射区域?

EN

回答 2

Stack Overflow用户

发布于 2013-07-19 10:04:53

首先要知道堆和栈本身是由内存映射组成的。每个userland进程都有一个内存映射表,这就是它与内核内存管理器交互的方式。内存映射具有不同的配置和功能。有关设置的列表,请参阅mmap(2)手册页。

使用文件支持的mmap,内核以高度优化的方式管理以页大小(4096字节)为单位的文件缓存。

如果你打算按顺序读取一个文件,那么内存映射没有任何优势。

如果您打算以随机访问的方式读取文件,那么内存映射文件的性能可能会更高(通常是这样),因为内核会自动为您应用缓存策略,并且在大多数平台上都支持CPU。

粗略地说,文件被分成4096个字节的块(页)。当从内存中读取一个字节(使用存储在内存映射中的变量)时,CPU将计算它在哪个块(页)中,然后查询其页表以查看该页是否在物理内存中。如果不是,则会发生页面错误,并将页面从文件加载到物理内存中(全部为4096字节)。然后,该访问被转换为物理存储器访问。

通过以这种方式按需加载文件,对于许多访问模式来说,速度会快得多。

将文件作为内存区域(使用指针算法)访问,然后通过文件接口(查找)访问也要方便得多。

票数 2
EN

Stack Overflow用户

发布于 2013-07-19 13:44:44

但为什么将数据从磁盘/闪存复制到虚拟内存需要同样多的时间?

使用read()系统调用的传统文件io具有两个数据副本。+从磁盘到缓冲区高速缓存的一个副本+从缓冲区高速缓存到用户缓冲区的一个副本,由read()调用提供。

使用mmap(),我们可以直接将数据复制到用户缓冲区&&页面缓存中,这是mmap()版本的缓冲区缓存。

但是,mmap()和read()/write()模型各有优缺点,而且大多数现代OSes都将页面缓存和缓冲区缓存统一到一个统一的缓存中。所以,不确定我们在这两者之间有多大的性能优势...

=> ()调用系统调用。因此,除了上面的功能之外,我们还缓冲了read (),即fread(),我们在libc中的一个流中缓存一些文件数据。这降低了系统调用更多数据的成本,但对于新数据,我们需要syscall。对于mmap区域,访问新数据的成本是系统调用转换故障的成本。IO成本当然保持与您所暗示的相同。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17736936

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档