Note : In all this series, sizes of different types of memory blocks will be an important topic. To differentiate sizes more clearly, the concept of order of magnitude, or order, will be used as an equivalent qualifier, both concepts being linked by : size = 2 ^ order, an increment of order multiplying the size by 2.
In most modern languages , an effort is made to take memory management out of the programmer’s hands in an effort of safety and transparency.
Even in low level languages such as C or Rust, memory management, though being accessible to the programmer, is confined to the use of malloc/free-ish primitives, which serve as an abstraction of the host’s memory manager (ex : glibc). The memory manager itself is meant to be invisible to the user, which may explain why so many developers are so unfamiliar with memory management techniques, costs, trade-offs, and efficiency.
In this article, we intend to take the radically opposite direction, by providing a simplified overview of different memory management techniques, their objectives and trade-offs, and how these different techniques are combined to form a simple kernel-level memory management system.