kin*_*er1 19 c linux mmap file
我有以下与处理文件和映射它们相关的问题(mmap):
mmap然后写入该文件到内存?mmap- ,,PROT_NONE 使用文件,那么相同的保护级别也可以实现.,等等.那么,为什么?PROT_READPROT_WRITEO_RDONLYO_RDWRmmapmmap有一个文件到内存,如果我们写入mmap返回的内存位置,它是否也同时写入该文件?请帮我回复所有问题.
非常感谢提前.
*编辑:在线程之间共享文件*
据我所知,如果我们在两个线程(非进程)之间共享一个文件,那么建议将mmap它放入内存然后使用它,而不是直接使用该文件.
但我们知道使用文件意味着它肯定在主内存中,那么为什么线程需要再次进行mmaped?
Ton*_*ion 15
内存映射文件实际上部分或全部映射到内存(RAM)中,而您写入的文件将写入内存然后刷新到磁盘.内存映射文件从磁盘中获取并显式放入内存中以供读取和/或写入.它会保留在那里直到你取消映射它.
对磁盘的访问速度较慢,因此当您写入文件时,它将被刷新到磁盘而不再驻留在RAM中,这意味着,下次需要该文件时,您可能会从磁盘获取该文件(在内存映射文件中,你知道文件在RAM中,你可以更快地访问它,然后在磁盘上.
此外,mememory映射文件通常用作IPC机制,因此两个或多个进程可以轻松共享同一个文件并对其进行读/写.(使用必要的sycnh机制)
当您需要经常读取文件,并且此文件非常大时,将其映射到内存中是有利的,这样您就可以更快地访问它,然后每次都必须打开它并从磁盘中获取它.
编辑:
这取决于你的需求,当你有一个需要非常频繁地被不同线程访问的文件时,我不确定内存映射文件一定是个好主意,从你需要的角度来看,你需要如果你希望它写入它,在不同线程的相同位置同步访问这个mmap的文件.如果这种情况经常发生,它可能是资源争用的一个地方.
只需从文件中读取,这可能是一个很好的解决方案,因为如果您只是从多个线程中读取它,则不需要同步访问.在开始编写的那一刻,你必须使用同步机制.
我建议,你有每个线程以线程本地方式进行自己的文件访问,如果你必须写入文件,就像你对任何其他文件一样.通过这种方式,它减少了线程同步的需要,并且很难找到和调试错误.
1)您误解了 write(2) 系统调用。write() 不写入,它只是将缓冲区内容复制到操作系统缓冲区链并将其标记为脏。操作系统线程之一(bdflush IIRC)将拾取这些缓冲区,将它们写入磁盘并修改一些标志。之后。使用 mmap,您可以直接访问操作系统缓冲区(但如果您更改其内容,它也会被标记为脏)
2)这与保护无关,而是与在页表条目中设置标志有关。
3)避免双缓冲。您还可以使用字符而不是块来寻址文件,这有时更实用
4) 这是您一直在使用的系统缓冲区(连接到您的地址空间)。系统可能已将部分内容写入磁盘,也可能未将其部分写入磁盘。
5) 如果线程属于同一进程并共享页表和地址空间,则可以。
| 归档时间: |
|
| 查看次数: |
8617 次 |
| 最近记录: |