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



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

  

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

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

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

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

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

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

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

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




  

相关话题

  如何评价微软PowerShell将支持SSH? 
  Linux 和 Windows 的内存申请机制有何不同? 
  服务器之间文件自动拷贝用什么技术好? 
  虚拟机这么好用为什么有人还要把linux装在电脑里或者装双系统? 
  为什么Linux上的软件不需要“安装”& 为什么很多软件不做成“绿色软件”? 
  计算机行业领先的公司大多在美国,Linux为什么却是芬兰人发明的? 
  为什么 Windows 的 Linux 子系统的文件同步和 Windows 不是实时的? 
  Android为什么不直接执行Linux的程序?而是自己搞一套? 
  特斯拉选择 Linux 作为车载系统的原因是什么? 
  在Windows下用VIM来写代码,会不会很蛋痛? 

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





© 2025-01-30 - tinynew.org. All Rights Reserved.
© 2025-01-30 - tinynew.org. 保留所有权利