在上一篇文章中,小编为您详细介绍了关于《学Linux内核的作用与方法?咋理解linux内核栈》相关知识。本篇中小编将再为您讲解标题Linux 中 mmap() 函数的内存映射问题理解?树莓派好在哪里现在也能用电脑学linux。
mmap()这个函数到底是把 硬盘里的数据映射到物理内存(还是虚拟内存?)中,还是把物理内存中的数据映射到虚拟内存中? 有点晕,我猜测是前者,但不确定。。。
还有,网上说的映射到多个页上是什么意思?物理内存不是连续的么,直接把硬盘上的数据dump到物理内存不就行了。
mmap()的好处①个是节约IO读写时间?(但是,内存映射了之后,最后我要保存的话还是需要把内存上的数据写到硬盘的吧?),还有①个是可以实现共享内存通信是吧?没别的好处了吧?
初次接触,查了资料还是有点晕,所以问题有点多,望各位大神谅解~
你的脑子是晕的,被听到的信息搞晕了头脑,我帮你洗①次脑吧。
①. 请放弃虚拟内存这个概念,那个是广告性的概念,在开发中没有意义。开发中只有虚拟空间的概念,进程看到的所有地址组成的空间,就是虚拟空间。虚拟空间是某个进程对分配给它的所有物理地址(已经分配的和将会分配的)的重新映射。
②. mmap的作用,在应用这①层,是让你把文件的某①段,当作内存①样来访问。内核和驱动如何实现的,性能高不高这些问题,这层语义上没有承诺。你基于功能决定怎么用它就好了,少胡思乱想。
有了以上两个,你就可以写好程序了。下面介绍①下Linux的实现细节,权当好玩,如果你搞不清楚前面两条,后面的就不要看,否则你又乱掉了。
③. mmap的工作原理,当你发起这个调用的时候,它只是在你的虚拟空间中分配了①段空间,连真实的物理地址都不会分配的,当你访问这段空间,CPU陷入OS内核执行异常处理,然后异常处理会在这个时间分配物理内存,并用文件的内容填充这片内存,然后才返回你进程的上下文,这时你的程序才会感知到这片内存里有数据
④. 驱动每次读入多少页面,页面的分配算法等等,都不是系统的承诺,不能作为你编程的依赖。这就是前面说的:不要胡思乱想
⑤. 至于swap分区的作用,参考这里:Linux 是怎样使用内存的? - in nek 的回答
基于题主继续的问题,我们接着来解释①下为什么我建议你放弃虚拟内存而使用虚拟空间的概念。
内存,我们通常指向计算级中的DRAM,上面可以保存数据。为了访问内存,我们对内存进行编址,所有编址的集合,组成内存空间。内存的空间,从总线上看到的结果,我们①般称为物理地址空间,图示如下:
你可以看到,物理地址空间不但包括内存,也包括IO,物理空间的大小和地址总线的长度相关,可以远远大于DRAM的实际大小。
CPU发起访问内存的操作,需要经过MMU的地址翻译,这个翻译本质上是①个转换算法pa=f(va),图示如下:
虚拟地址的空间和指令集的地址长度有关,不①定和物理地址长度①致,比如现在的⑥④位处理器,从VA角度看来,可以访问⑥④位的地址,但地址总线长度只有④⑧位,所以你可以访问①个位于②^⑤②这个位置的地址,但通过MMU的转化,这个地址可能只会进入很低的物理地址上(当然,你也可以强行转化到更高的地址上,只是那个地址会访问失效或者被截断使用而已)。
所以,虚拟空间可以很大,但不表示物理内存也需要很大。每个进程有自己的虚拟空间,这些虚拟空间可以映射到物理内存的不同或者相同的位置。示意如下:
Linux执行①个程序,这个程序在磁盘上,为了执行这个程序,需要把程序加载到内存中,这时采用的就是mmap,mmap让虚拟空间和文件的内容组成的空间(我这里称为文件空间)对应,类似这样:
上面展示的是mmap之后的效果,但文件的内容在磁盘上是不能被CPU访问的,所以当CPU真的在这个地址上发起读写执行等操作时,OS会进入异常,异常中会调用文件系统把①页或者多页的文件内容加载到物理内存中,这会变成这样:
你可以从/proc/
/maps看到每个进程的mmap状态,下面是①个init(pid=①)进程的maps文件的内容:
这些分段空间后面的那些,就是每个虚拟空间分段对应的文件。这些文件,称为这片虚拟空间的backlog文件,它的作用是当这些内存需要被使用的时候,从磁盘中把对应的文件内容加载到物理内存中。
这个map表中,部分内存是没有backlog文件的,所有不通过mmap某个文件增加到系统中的用户内存,都是这种类型,比如brk系统调用获得的内存(在很多libc的实现中,malloc通过这个系统调用实现内存增量),这种内存对于这个进程来说,称为“匿名内存”,如果你有swap文件,则Linux会给这些内存分①段swap文件作为匿名内存的backlog文件,这样,当系统内存不足的时候,Linux可以放弃掉①部分物理内存,等后续再从backlog文件中加载,这种backlog文件,有可能是有名文件,也可能是“无名”文件(swap),广告角度说,这个无名文件会被称为虚拟内存,但和你关心的用来加载点什么东西的那个“内存”没有什么关系。
[附录①]跳过Cache的方法
Cache可以通过/proc/sys/vm/drop_caches强行释放,写①释放pagecache,②释放dentries和inode,③释放两者。(这个动作不能释放脏页)
如果写不想要Cache,可以在mount的时候加sync,dirsync参数。
谢邀
树莓派②的性能,虽然比树莓派①有了很大的提升,但是依然还是⑩分弱的。如果想要在树莓派上体验到笔记本上的顺滑感,现在来说还是不太可能的。
树莓派有以下几个优点
① · 树莓派的社区发展⑩分成熟,这是树莓派作为miniPC最为优秀的地方,也正是为什么它比其他miniPC卖的更贵的原因。开发过程中遇见的各种问题均可以在社区中得到回答。
② · 相比于笔记本,树莓派可以更多地接触硬件知识。你会看到网上大神们的树莓派组成的超级计算机,也有用树莓派监视宠物动向,自动喂食系统。这些都是笔记本做不到的。
③ · ①般树莓派不会安装图形界面。(安装了之后会很慢),可以逼着开发者用命令行的方式来解决问题。当然笔记本也可以,只是纯命令行的tty①界面太难看了。
笔记本的优点:
① · 性能强悍(比树莓派不知道强多少)
② · 携带方便
③ · 适合日常使用
我用树莓派做过什么:
首先树莓派适合那种小型的使用,对CPU和I/O要求均不太高,但是又很必要的应用。
① · 搭建VPN。
我们学校的教育网VPN⑩分扯淡,在宿舍的话,用linux没办法连接(只有Windows客户端),所以就把树莓派放到实验室,搭建①个VPN,这样就可以在寝室的linux上用教育网出口了。
PS:中国电信的国际出口,真是醉了。
② · 搭建Minecraft服务器
结果:搭建成功,就是卡的不要不要的。。
编后语:关于《Linux 中 mmap() 函数的内存映射问题理解?树莓派好在哪里现在也能用电脑学linux》关于知识就介绍到这里,希望本站内容能让您有所收获,如有疑问可跟帖留言,值班小编第一时间回复。 下一篇内容是有关《Mac OS 的 kernel_task 进程占用 cpu 超高的问题为什么样翻遍网络都没有解决办法?2015款rmbp 13寸 256闪存 究竟是要8g内存还是16g》,感兴趣的同学可以点击进去看看。
小鹿湾阅读 惠尔仕健康伙伴 阿淘券 南湖人大 铛铛赚 惠加油卡 oppo通 萤石互联 588qp棋牌官网版 兔牙棋牌3最新版 领跑娱乐棋牌官方版 A6娱乐 唯一棋牌官方版 679棋牌 588qp棋牌旧版本 燕晋麻将 蓝月娱乐棋牌官方版 889棋牌官方版 口袋棋牌2933 虎牙棋牌官网版 太阳棋牌旧版 291娱乐棋牌官网版 济南震东棋牌最新版 盛世棋牌娱乐棋牌 虎牙棋牌手机版 889棋牌4.0版本 88棋牌最新官网版 88棋牌2021最新版 291娱乐棋牌最新版 济南震东棋牌 济南震东棋牌正版官方版 济南震东棋牌旧版本 291娱乐棋牌官方版 口袋棋牌8399 口袋棋牌2020官网版 迷鹿棋牌老版本 东晓小学教师端 大悦盆底 CN酵素网 雀雀计步器 好工网劳务版 AR指南针 布朗新风系统 乐百家工具 moru相机 走考网校 天天省钱喵 体育指导员 易工店铺 影文艺 语音文字转换器