1、思考问题?(答案:Linux操作系统原理)
-
当内存不足时,我们如何进行分配?当操作系统运行时候太长,产生很多很多内存碎片,此时我们应该怎么办?如果我们想要分配几十个字节的小块内存,应该使用什么样的方法来解决此问题?我们如何提高系统分配物理内存的效率?
一、物理页面page结构
-
32位的CPU寻址时按照数据位宽(字word),但是CPU在处理物理内存时即不是按照字进行来分配,因为现在的CPU都采用页分配机制直接来管理内存。所以在CPU里面有一个叫MMU的硬件单元。它会处理虚拟内存到物理内存的映射关系,就是页表的翻译工作。我们站在CPU的角度来分析,管理物理内存的最小单位为页,Linux内核使用一个struct page数据结构描述一个物理页面。struct page数据结构在内核源码分析当中我们可以得到答案。
-
掌握Linux内核源码分析技术(优势):Linux内核开发工程师。page数据结构对应Linux内核源码如下:
struct page { // 专门用来描述一个物理页面
/* First double word block */
unsigned long flags; // flags此成员是页面的标志位集合,标志位pageflags结构体类型
union {
/*
mapping此成员,当这个页被用于文件缓存时,mapping指向和这个文件缓存相关联的address_space对象,
这个address_space对象是属于内存对象(比如索引节点)的页面集合。当这个页面用于匿名页面时,mapping指向一个
anon_vma数据结构,主要用于反向映射。
*/
struct address_space *mapping;
void *s_mem; /* slab first object */
};
/* Second double word */
struct {
union {
pgoff_t index; /* Our offset within mapping. */
void *freelist; /* sl[aou]b first free object */
bool pfmemalloc; /* If set by the page allocator,
* ALLOC_NO_WATERMARKS was set
* and the low watermark was not
* met implying that the system