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



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

  

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

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

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

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

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

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

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

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




  

相关话题

  开源代码里某个函数很长,这种代码能否认为是好的? 
  Linux 内核中,多线程栈空间模型是怎样的? 
  从操作系统本身来看Linux是否比Windows优秀? 
  为什么中国大公司不开发 Linux 桌面应用? 
  Linode 里为什么 Ubuntu 最火呢? 
  现在的 Linux 内核和 Linux 2.6 的内核有多大区别? 
  虚拟机装 Linux 我还能理解,装 Windows 有什么用? 
  电脑关机后网卡还会工作吗? 
  计算机行业领先的公司大多在美国,Linux为什么却是芬兰人发明的? 
  现在的 Linux 内核和 Linux 2.6 的内核有多大区别? 

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





© 2025-02-07 - tinynew.org. All Rights Reserved.
© 2025-02-07 - tinynew.org. 保留所有权利