百科问答小站 logo
百科问答小站 font logo



Linux的内核为什么一定要映射到所有的物理内存? 第1页

  

user avatar   bei-ji-85 网友的相关建议: 
      

具体没研究过Linux的行为,但其实所有操作系统的行为都差不多,先映射一大块物理内存(建立页表),这个大小远远大于内核需要的内存,然后内核起来以后再做进一步拆分。

原因概括一下就是方便管理。

对于操作系统来说,内存的页管理(Page Management)和内存池管理(主要是堆,Heap)是分开的,内核映射足够多的页,但并不一定都交给内存池直接使用,可能是给cache,给shm设备等。

页管理是多多益善,最好是把所有内存都占满,但这些内存页仍然可以交给用户使用的,因为一个物理地址可以映射给多个虚拟地址。只要这些页没有分配给指定的内存池,就仍然可以被用户使用,甚至同时被用户空间和内核空间使用(比如为了零拷贝)。

内核先占用了足够多的内存,这样就不用再做二次页分配的动作了,能保证内核的流畅性。如果内核一开始只占用比较小的内存区域,那么每次加载新的模块,就需要扩展这个内存区域,效率低不说,还可能有内存碎片的风险。

对于用户程序来说,因为用户程序一开始都是在磁盘上的,需要一点点的加载到内存上,甚至可以边运行边加载,所以没必要一下映射足够多的内存,因为可能在整个用户程序的生命周期了,某些内存一直都用不上,完全分配太浪费了。

对于某些大型程序来说,任何操作系统都推荐一次性的从页管理器里直接申请足够多的内存,而不是使用编译器库函数或者操作系统提供内存池API去访问,因为后者的效率比较低,并不适用于某些特定的场景。




  

相关话题

  进程被操作系统加载之后,磁盘上的二进制文件可以删掉吗?如果删掉对正在运行的进程有什么影响吗? 
  为什么 Windows 没有形成成熟的软件包和升级体系? 
  操作系统能否知道自己处于虚拟机中? 
  为什么 Unix 一切皆文件的设计这么成功,而 C++ 统一的流式 IO 则不甚成功? 
  Linux 发行版中哪个包管理器更强? 
  如何评价Linus Torvalds编写的LINUX内核的技术含量? 
  德国又一州将尝试完全使用 Linux 和 LibreOffice,对此你有哪些看法? 
  为什么在知乎macOS用户只要黑半句Windows就招来围攻,而对待Linux却只有技术层面的反驳? 
  操作系统中到底是谁分配的资源? 
  如果有一个arm核心的微型电脑,跟u盘一样大,里面跑linux发行版,带电池,连上usb后就能操作它的屏幕。这东西做成产品,你会买不? 

前一个讨论
windows系统为什么不预留一点资源(cpu和内存占用),在执行繁重任务时以保证系统本身的流畅运行?
下一个讨论
CPU 的运行速度受光速影响吗?





© 2025-04-11 - tinynew.org. All Rights Reserved.
© 2025-04-11 - tinynew.org. 保留所有权利