Cha*_*ani 3 io operating-system mmap virtual-memory dma
我已经开始阅读有关内存映射IO的内容,而且我在理解这些概念时遇到了一些困难
这是我到目前为止所理解的:
每个进程都有一个虚拟地址空间.内存映射文件在虚拟地址空间中分配一个特定的地址范围,映射到物理内存上的相同地址.这样,磁盘控制器在
内存上完成的所有写操作(通过DMA)都将反映到进程中,无需任何额外的复制.(在非内存映射文件的情况下,CPU必须将内容复制到进程的缓冲区).
我怀疑:
我的理解是否正确?
如果有多个进程试图对文件进行mmap并且没有可用于直接映射的连续内存块,会发生什么?
内存子系统本身对"文件"没有任何理解,这是一个操作系统概念,并且有些操作系统根本不使用文件.在你理解mmap工作原理的过程中,你已经接近了.
每个进程都有自己的虚拟地址空间,这可能与物理内存几乎没有关系(许多虚拟地址空间根本没有任何内存关联,并且被换出的虚拟内存没有任何内存空间物理内存).系统使用某种查找表(在x86上称为描述符表),指定哪些虚拟地址范围映射到哪些物理地址范围.非"常驻"(换出,mmap未加载但未加载)的虚拟内存具有"不存在"条目.
每当程序试图访问此内存时,CPU都会导致页面错误,该错误会告诉操作系统在某处找到适当的内容并将其加载到物理内存中.在交换的情况下,内容从交换文件或分区加载; 在这种情况下mmap,它们被装载到文件系统中的某个地方.
将它们放入物理内存并更新描述符表的机制可能会有所不同.您所描述的是DMA,它允许驱动器控制器将内容直接复制到物理内存块和零拷贝I/O,这是一种技术,操作系统只是创建一个新的描述符映射,告诉处理器"传送" "物理内存区域进入程序的地址空间.无论是在技术上需要mmap(操作系统可以"手动"加载该文件,并将其复制到该程序的新缓冲区,这可能在读复制更新的情况发生),但像你描述的现代系统做到这一点.
物理内存不一定必须是连续的.当mmap调用POSIX版本时,操作系统length为映射分配字节,但是由于虚拟内存,这些字节可以在多个块之间分割并由处理器一起映射.
如果多个进程正在尝试mmap同一个文件,则OS行为取决于访问是只读还是读/写; 只读副本可以在许多进程之间共享(例如实际的可执行代码;这就是为什么即使Chrome可能有几十个进程在运行,Chrome二进制文件只在内存中一次).
| 归档时间: |
|
| 查看次数: |
1946 次 |
| 最近记录: |