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



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

  

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

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

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

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

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

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

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

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




  

相关话题

  内存为什么要分页? 
  操作系统能不能继续分两部分:硬件相关和硬件无关?并且让驱动只依赖硬件相关部分而不依赖操作系统? 
  关于Socket API的设计? 
  Windows 内核和 Linux 内核谁更复杂? 
  国有浏览器为何多选用谷歌 Chromium 内核产品?自主研发的困难在哪里? 
  用 VS Code 替代 Vim 可行吗? 
  linux如何赋予用户sudo权限? 
  国内有哪些比较好的 Linux 发行版? 
  如何评价Linus Torvalds编写的LINUX内核的技术含量? 
  如何评价Linus Torvalds编写的LINUX内核的技术含量? 

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





© 2024-11-09 - tinynew.org. All Rights Reserved.
© 2024-11-09 - tinynew.org. 保留所有权利