- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
最近在一次面试中,有人问我mmap是否可以直接以二进制模式对程序进行映射;没有页面引用。
我认为这是不可能的,因为它
allows an application to map a file into memory, meaning that there is a one-to-one correspondence between a memory address and a word in the file. The programmer can then access the file directly through memory, identically to any other chunk of memory-resident data—it is even possible to allow writes to the memory region to transparently map back to the file on disk
在不涉及分页的情况下访问文件听起来是错误的。
我仍然想知道 mmap 是否可以通过页面方式以外的任何其他方式将文件映射到内存中。
=====
the page way
=====
The page is the smallest unit of memory that can have distinct permissions and behavior. Consequently, the page is the building block of memory mappings, which in turn are the building blocks of the process address space. The mmap( ) system call operates on pages. Both the addr and offsetparameters must be aligned on a page-sized boundary. That is, they must be integer multiples of the page size.
Mappings are, therefore, integer multiples of pages. If the len parameter provided by the caller is not aligned on a page boundary—perhaps because the underlying file's size is not a multiple of the page size—the mapping is rounded up to the next full page
最佳答案
如果我们使用维基百科的page定义,所有内存映射都涉及页面级映射。 :
A page, memory page, or virtual page is a fixed-length contiguous block of virtual memory, described by a single entry in the page table. It is the smallest unit of data for memory management in a virtual memory operating system.
如 man 2 mmap
中所述手册页,
mmap() creates a new mapping in the virtual address space of the calling process.
映射由页表中的条目定义。
因此,本质上,mmap()
是一个用于管理页面级别虚拟内存的工具。
面试官可能想了解您是否理解低级 I/O(read()
、write()
)和文件支持之间的区别内存映射行为。
如果使用O_DIRECT
标志打开文件,内核会尝试绕过页面缓存,将数据直接传输到用户空间缓冲区。
由于内存映射的工作方式,使用或不使用 O_DIRECT
标志对后备文件进行 open()
编辑不会对内存映射产生影响。
(无论用于映射的访问部分的内存是否保留在页面缓存中,MAP_SHARED
/MAP_PRIVATE
标志都会产生影响不是。通常,Linux 内核使用写时复制方法:页面在页面缓存中保持只读状态,直到第一次写访问。此时,私有(private)映射会被复制到新页面(或被逐出),并且共享映射被标记为可读写。它有点复杂,但效率很高。不过,这一切也都依赖于虚拟内存分页。)
甚至可以构造一个完全没有支持的内存映射(PROT_NONE
映射)。对映射的任何访问都会导致内核生成一个 SIGBUS 信号(发送给尝试访问的线程),该信号可以被进程捕获。信号处理程序可以解码并跳过指令,从而模拟内存访问。它甚至可以使用O_DIRECT
从文件中读取一个或多个字节。同样,映射基于虚拟内存,因此也基于页;只是没有 RAM 用于映射,而是模拟所有访问。这很少使用,因为它慢得难以想象。
关于c - 除了页面级映射之外,文件的 mmap 可以通过任何其他方式完成吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42244294/
从 Redis 获取消息时,onDone:(){print('done')} 从未起作用。 import 'package:dartis/dartis.dart' as redis show PubS
昨天我玩了一些vim脚本,并设法通过循环来对当前输入的内容进行状态栏预测(请参见屏幕截图(灰色+黄色栏))。 问题是,我不记得我是怎么得到的,也找不到我用于该vim魔术的代码片段(我记得它很简单):它
我尝试加载 bash_completion在我的 bash (3.2.25) 中,它不起作用。没有消息等。我在我的 .bashrc 中使用了以下内容 if [ -f ~/.bash_completio
我正在尝试构建一个 bash 完成例程,它将建议命令行标志和合适的标志值。例如在下面 fstcompose 命令我想比赛套路先建议 compose_filter= 标志,然后建议来自 [alt_seq
当我尝试在重定向符号后完成路径时,bash 完成的行为就好像它仍在尝试在重定向之前完成命令的参数一样。 例如: dpkg -l > /med标签 通过在 /med 之后点击 Tab我希望它完成通往 /
我的类中有几个 CAKeyframeAnimation 对象。 他们都以 self 为代表。 在我的animationDidStop函数中,我如何知道调用来自哪里? 是否有任何变量可以传递给 CAKe
我有一个带有 NSDateFormatter 的 NSTextField。格式化程序接受“mm/dd/yy”。 可以自动补全日期吗?因此,用户可以输入“mm”,格式化程序将完成当前月份和年份。 最佳答
有一个解决方案可以使用以下方法完成 NSTextField : - (NSArray *)control:(NSControl *)control textView:(NSTextView *)tex
我正在阅读 Passport 的文档,我注意到 serialize()和 deserialize() done()被调用而不被返回。 但是,当使用 passport.use() 设置新策略时在回调函数
在 ubuntu 11.10 上的 Firefox 8.0 中,尽管 img.complete 为 false,但仍会调用 onload 函数 draw。我设法用 setTimeout hack 解决
假设我有两个与两个并行执行的计算相对应的 future 。我如何等到第一个 future 准备好?理想情况下,我正在寻找类似于Python asyncio's wait且参数为return_when=
我正在寻找一种 Java 7 数据结构,其行为类似于 java.util.Queue,并且还具有“最终项目已被删除”的概念。 例如,应可以表达如下概念: while(!endingQueue.isFi
这是一个简单的问题。 if ($('.dataTablePageList')) { 我想做的是执行一个 if 语句,该语句表示如果具有 dataTablesPageList 类的对象也具有 menu
我用replaceWith批量替换了许多div中的html。替换后,我使用 jTruncate 来截断文本。然而它不起作用,因为在执行时,replaceWith 还没有完成。 我尝试了回调技巧 ( H
有没有办法调用 javascript 表单 submit() 函数或 JQuery $.submit() 函数并确保它完成提交过程?具体来说,在一个表单中,我试图在一个 IFrame 中提交一个表单。
我有以下方法: function animatePortfolio(fadeElement) { fadeElement.children('article').each(function(i
我刚刚开始使用 AndEngine, 我正在像这样移动 Sprite : if(pValueY < 0 && !jumping) { jumping =
我正在使用 asynctask 来执行冗长的操作,例如数据库读取。我想开始一个新 Activity 并在所有异步任务完成后呈现其内容。实现这一目标的最佳方法是什么? 我知道 onPostExecute
我有一个脚本需要命令名称和该命令的参数作为参数。 所以我想编写一个完成函数来完成命令的名称并完成该命令的参数。 所以我可以这样完成命令的名称 if [[ "$COMP_CWORD" == 1 ]];
我的应用程序有一个相当奇怪的行为。我在 BOOT_COMPLETE 之后启动我的应用程序,因此在我启动设备后它是可见的。 GUI 响应迅速,一切正常,直到我调用 finish(),按下按钮时,什么都没
我是一名优秀的程序员,十分优秀!