今天在和供应商交流的过程中,被严重鄙视了,竟然认为我连“LowMemory”都没有听说过。感觉很郁闷,好歹我也搞过一段时间memory Management,怎么可能连LowMemory都不知道,难道能怪别人发音不标准好不好。
唉,总之还是因为自己对LowMemory了解不深入哪。
何为low memory?说到low memory,不得不说memory zone(内存分区)这个概念。
内存分区,Linux对内存再进行划分,分为不同的分区。内核以struct zone来描述内存分区。通常一个节点分为DMA、Normal和High Memory内存区。(详见http://blog.csdn.net/younger_china/article/details/17556055)
在32位CPU下寻址范围是有限的,Linux内核定义了下面三个区域:
(1) DMA内存区:即直接内存访问分区,通常为物理内存的起始16M。主要是供一些外设使用,外设和内存直接访问数据访问,而无需系统CPU的参与; 0x00000000
- 0x00999999 (0 - 16 MB)
- 0x00999999 (0 - 16 MB)
(2) Normal内存区:从16M到896M内存区;0x01000000 - 0x037999999 (16 - 896 MB) - size: 880MB
(3) HighMemory内存区:896M以后的内存区;0x038000000 - <硬件特定>
那么,到底何为low memory???
LowMem区(也叫NORMAL ZONE)共880MB,并且是固定不能变的(除非使用hugemem内核),对于高负荷的系统,可能因为LowMem使用不好而触发了OOM Killer机制。因为内存分配是一个连续的区域,在此时,如果LowMem里存在很多碎片或者LowFree太少,此时无法分配到一块连续的内存区域,就触发了OOM Killer。