当前位置:  技术问答>linux和unix

使用mmap的一点疑问

    来源: 互联网  发布时间:2016-12-19

    本文导语:  本人学艺不精,看书理解的 mmap系统调用应该是将文件映射到内存来,然后的读写应该是针对内存的吧,也就是说不会在实际文件上反映出来的,要通过调用msync系统调用才会回写。 不知道理解的对不对,但我测试了...

本人学艺不精,看书理解的 mmap系统调用应该是将文件映射到内存来,然后的读写应该是针对内存的吧,也就是说不会在实际文件上反映出来的,要通过调用msync系统调用才会回写。
不知道理解的对不对,但我测试了一下,大概流程如下:
 fd = open();
 p = mmap();
 通过p直接写数据,没有调用munmap,也没有close(fd),直接按CTRL+C退出了,然后打开文件发现文件已经修改了,关机重启,文件内容依然是修改了的。
所以有点困惑,对mmap映射区域的写(修改)操作,到底是通过什么机制回写文件的,这个和调不调用munmap和close有关系吗?
还有如果是嵌入式系统,文件系统建立在FLASH上,又是怎么个情况?

|
这个不保证文件一定修改的

调用过msync后一般能保证。

如果你在一个I/O负载过重的系统上运行这个程序,系统是不保证把脏页立刻flush到文件中的。

最新的kernel不太了解,以前的kernel是系统维护2个队列,1个读队列,1个写队列。

你调用一个write,等于send 1个或多个写请求到这个写队列里,

最后kernel有几个kernel thread pdflush,(可能是page dirty flush的缩写),来取出写请求把实际的content写回到磁盘上。

|
你调用mmap的flags参数是什么?
MAP_SHARED,写映射区就相当于写文件,文件不会立即更新,除非显式调用msync或munmap。
MAP_PRIVATE,创建一个私有的CopyOnWrite映射,写数据不会影响原文件。
mmap的时候只是建立映射,不会复制什么。写的时候会缺页,然后才真正分配内存。

|
不知道楼主看的是不是apue,apue上程序清单14-12有类似程序,它就没有调用munmap,也没有close(fd),但是的确复制过去了。
仔细看书发现,在P393底部有一句话“对于MAP_SHARED区磁盘文件的更新,在写到存储映射区时按内核虚存算法自动进行”,这也就解释了为什么会结果正确。(我猜楼主的flags参数一定是MAP_SHARED吧!)
然后我又man mmap查看了一下man页,在MAP_SHARED区有这样一句话:
The  file  may  not  actually  be updated until msync(2) or munmap() is called.
他用的词是may not,比较蛋疼。
总结:
1、经过楼主的实践证明,写文件的确是会自动进行的!
2、man告诉我们可能不会实时更新,所以这样不可靠!
3、所以应该显示调用msync和munmap函数,apue上的例子有点小问题。
最近在apue,与楼主共勉啊!

|
参数为MAP_SHARED的话,内容的回写依赖于系统内部的内存换页机制,不能保证可以立刻回写到磁盘上。所以如果要保证一定写回磁盘,需要调用msync。
映射的时候应该是一次载入一部分内容,当需要读写后面内部的时候(当前载入的内容没有),会有缺页报告,然后再载入后面需要修改的内容,前面的如果有修改,就回写到磁盘上去。

    
 
 

您可能感兴趣的文章:

  • 数据库 iis7站长之家
  • NandFlash分区使用的疑问
  • linux下gcc使用疑问?
  • 有关 在 JSWDK 服务器 下使用 .shtml 文件的疑问??
  • 关于ioremape使用的一个小疑问
  • 中断处理函数中使用自旋锁的疑问
  • expect使用疑问
  • crontab 使用疑问
  • bind函数客户端使用疑问?求解
  • 关于linux编译、使用动态库的几个疑问
  • 使用JDBC连接数据库时Class.forName()语句的使用疑问
  • 关于在UNIX中使用消息队列的一点疑问
  • linux中umask的使用疑问。
  • mmap的使用疑问,怎么总线错误啊?
  • 使用JBUILD中出现的疑问!郁闷中~~~~
  • linux posix信号量使用疑问
  • 安装使用Redhat过程中遇到几个疑问请教linux老手.
  • linux cp 命令的使用疑问
  • 新手GCC/GDB使用疑问(比较IDE环境)
  • 消息队列的使用疑问??
  • mmap使用中的困惑,,,在线等待,,请帮忙,谢谢!
  • 使用mmap可以读写文件,这是怎么实现的?
  • mmap函数如何使用?
  • mmap()函数使用问题
  • 请高手相助: mmap 使用问题,程序执行完后吃掉 100M 内存 !
  • 请给出使用mmap实现进程间共享内存的程序代码
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • C++ I/O 成员 tellg():使用输入流读取流指针
  • 在测试memset函数的执行效率时,分为使用Cash和不使用Cash辆种方式,该如何控制是否使用缓存?
  • C++ I/O 成员 tellp():使用输出流读取流指针
  • 求ibm6000的中文使用手册 !从来没用过服务器,现在急需使用它,不知如何使用! 急!!!!!
  • Python不使用print而直接输出二进制字符串
  • 请问:在使用oracle数据库作开发时,是使用pro*c作开发好些,还是使用库函数如oci等好一些啊?或者它们有什么区别或者优缺点啊?
  • Office 2010 Module模式下使用VBA Addressof
  • 急求结果!!假设一个有两个元素的信号量集S,表示了一个磁带驱动器系统,其中进程1使用磁带机A,进程2同时使用磁带机A和B,进程3使用磁带机B。
  • windows下tinyxml.dll下载安装使用(c++解析XML库)
  • c#中SAPI使用总结——SpVoice的使用方法
  • tcmalloc内存泄露优化c++开源库下载,安装及使用介绍
  • 使用了QWidget的程序,如何使用后台程序启动它?
  • sharepoint 2010 使用STSNavigate函数实现文件下载举例
  • 共享内存一般是怎么使用的,是同消息队列配合使用么
  • 使用libpcap读取tcpdump抓取的文件并解析c代码实例
  • Jsp可否使用带有GUI的JavaBean,如何使用?
  • c/c++预处理命令预#,##使用介绍
  • asp程序使用的access在Linux下如何使用!
  • 在div中使用css让文字底部对齐的方法
  • 新装的Linux使用root用户不能使用FTP?
  • Python namedtuple(命名元组)使用实例
  • LINUX下使用Eclipse,如何使用交叉编译器?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3