数据库策略网站推广的有效方法有,自动交换友情链接,嘉兴品牌网站建设,做网站满屏的照片尺寸是多少《Linux操作系统原理分析之linux存储管理#xff08;5#xff09;》#xff08;21#xff09; 6 Linux存储管理6.6 Linux 物理空间管理6.6.1 Linux 物理内存空间6.6.2 物理页面的管理6.6.3 空闲页面管理——buddy 算法 6.7 内存的分配与释放6.7.1 物理内存分配的数据结构 6… 《Linux操作系统原理分析之linux存储管理5》21 6 Linux存储管理6.6 Linux 物理空间管理6.6.1 Linux 物理内存空间6.6.2 物理页面的管理6.6.3 空闲页面管理——buddy 算法 6.7 内存的分配与释放6.7.1 物理内存分配的数据结构 6 Linux存储管理
6.6 Linux 物理空间管理
本节介绍 linux 对进程虚拟空间的管理方法和内核提供的对进程虚拟空间进行管理的数据结构及有关函数。
6.6.1 Linux 物理内存空间
Linux 物理内存空间分成两个区域 内核区存放内核代码和数据以及内核管理进程的数据结构等。低地址区 动态 RAM 区存放各个用户进程的代码、数据等。高地址区。 需要注意 内核区映射到进程线性地址空间时时在高地址区域故内核在进程虚拟内存和物理内存所占据的位置不同。
6.6.2 物理页面的管理
Linux 以页面为单位来分配内存。 Linux 对每个物理页面都使用一个页面描述符 page 结构体描述其物理特性。其定义包含在/include/linux/mm.h 中并进一步被定义为 mem_map_t 类型。
typedef struct page
{
struct page *next; /*双向链表的下一个*/
struct page *prev; /*双向链表的前一个*/
struct page *next_hash; /*指向 hash 表后一个*/
struct page *prev_hash; /*指向 hash 表前一个*/
unsigned dirty16age8; /*age 记载被访问的情况dirty是否被修改*/
atomic_t count; /*共享进程数目*/
unsigned long flags; /*页面状态*/
/*当页面内容是文件的一部分*/
struct inode *inode; /*指向文件的 inode */
unsigned long offset; /*指出在文件中的偏移量 */
/*系统把所有 page 结构体集中组成一个 mem_map 数组*/
unsigned long map_nr; /*在 mem_map 数组中的下标*/
unsigned long swap_unlock_entry;
struct wait_queue *wait;
struct buffer_head * buffers;
} mem_map_t;6.6.3 空闲页面管理——buddy 算法
为了提高访问页面的速度以及满足使用连续面的要求如较大的线性数组要求连续的页面。操作系统在分配内存时要尽量保留连续的页面所以实施分配时不能以单一页面分配而是以多个页面为单位分配。根据这个思想linux 对内存空间的管理和分配采用了 Buddy 算法。Buddy 是“伙伴”、“搭档”的意思。 Buddy 算法的基本思想以多个页面为单位管理和分配空闲区域。
空闲页块组 它把物理内存中的所有页面按照 2 的整数次幂2n进行划分linux2.0 中年0~5对物理内存进行 6 次划分12481632。这样划分后形成大小不同的存储块称为页面块页块。 包含一个页面的块称为 1 页块包含两个页面的块称为 2 页块依次类推。将每种页块按照它们的先后顺序两两结合成一对对的 buddy“伙伴”如 1 页块中0 和 1、2 和 3、4 和 5、…….就是一对对的 1 页块 buddy“伙伴” 2 页块中0~ 1 和 2~ 3、4~ 5 和 6~ 7、8~ 9 和 10~11、……. 就是一对对的 2 页块 buddy“伙伴” 对空闲区域的管理按照页块大小分组进行管理。 系统设置了一个静态数组 free_area[]来管理各个空闲页块组。在/mm/page_alloc.c 中。
#define NR_MEM_LISTS 6
Static struct free_area_struct free_area[NR_MEM_LISTS];
Struct free_area_struct
{
Struct page *next; /*空闲链表下一个节点*/
Struct page *prev; /*空闲链表前一个节点*/
Unsigned int *map; /*指向相应页块的位图其位于内存 bitmap 区*/
}该数组共 6 个元素指向 1、2、4、8、16、32 六种页面块。 两种管理方法位图法和空闲页块组链表 。 1位图法 Linux 对内存页面块的每种划分都对应一个位图 map图 6.19 给出了 1、2、4 页块位图示意图。在位图中每一位表示一对 buddy 页块的使用情况方法 如1 对都空闲则该位为 0 1 对都占用全部或部分则该位为 0 1 对中1 组空闲而另一组被占用全部或部分则该位为 1 2空闲页块组链表 系统按照 buddy 关系把具有相同大小的空闲页面块组成空闲页面块每个空闲页块组用一个双向循环链表进行管理。见图 分配和释放管理 用事例说明 6.7 内存的分配与释放
Linux 中设置了多个用于虚拟内存和物理内存分配和释放的函数本节主要介绍其中两对面向物理内存分配和释放的函数 kmalloc和 kfree面向虚拟内存的分配和释放的函数 vmalloc和vfree
6.7.1 物理内存分配的数据结构
Linux 中 kmalloc和 kfree用于分配和释放小于 128K 的连续物理内存空间。使用它可以分配到[32B128KB]的连续的内存空间。它在 Baddy 算法的基础上又设置了专门的数据结构来管理内存。 在使用 kmalloc和 kfree分配和释放内存是以块为单位进行的。可以分配的块单位记录在blocksize 表中它是一个静态数组定义在/mm/kmalloc.c 中
#if PAGE_SIZE 4096
Static const unsigned int blocksize[]{
32,64,128,252,508,1020,……..,131072-16,0
}对页面大小为 4K 的机器块单位共 13 种它们近似于 2 的次幂。 可以块的大小与页面大小不一致可能小于或等于大于页面。 如小于一个页面时需要将一个页面再次按照第一次使用该页面的块单位来划分页面。所以每个页面又需要一个 page_descriptor 结构体页描述符来记录它的划分情况它放在页面首部。