您的位置:首页 > 理论基础 > 数据结构算法

Linux内存管理重要的数据结构与函数(二)

2018-02-19 11:01 155 查看
       当Linux需要将内存的一些页面换出到文件上时(swap),内存与交换设备(比如硬盘)就发生了关联。另一处关联是mmap系统调用将一个文件映射到内存中,这样可以加快文件的访问。对于swap,每一个swap设备或者文件被内核中一个swap_info_struct结构体所描述。 这个结构体定义在include/linux/swap.h头文件中(kernel 2.4)。
       在swap_info_struct结构体中有一个unsigned short *类型的成员(swap_map)指向一个数组,且其中每一个短整数都代表一个页面。这个数组的大小是由swap_info_struct的另一个成员pages决定的,这个成员实际上也就指定了swap文件的大小。swap_map[0]说明了该文件的一些性质,例如哪些页面可供使用的位图。一般来说文件的开头与结尾的地方有一些盘上物理页面(现在在盘上的页面)是不能使用的。所以swap_info_struct另外的成员lowest_bit和highest_bit指明可以使用的范围。
     Linux允许多个交换文件,且这些文件形成了一个数组:struct swap_info_struct swap_info[MAX_SWAPFILES];其中MAX_SWAPFILES的值为8。除此之外还将这些交换文件组成一个优先级队列:struct swap_list_t swap_list={-1,-1};struct swap_list_t{int head;int next;}  。刚开始的时候 没有交换文件,所以被初始化成-1,-1。这种连接的方式有点像数据结构中的静态链表,假设此时有swap_info_struct连接进来,那么next会指向刚刚进来的那个swap_info_struct。而swap_info_struct的next字段会成为-1。以此类推,当不断的有swap_file连接进来的时候,原来那个next为-1的swap_info_struct的next字段就会指向新进入的swap_info_struct(它们还有一个数组叫swap_info)。

        盘上页面也有其表项在页表上,指明这个页面在哪个文件上以及偏移是多少。swap_entry_t实际上是一个包在结构体里的32位数。高27位为偏移(文件里面的哪儿),随后7位指明是哪个设备(文件),最后一位为0(这样硬件就知道这个页面并不在内存中,后面交给操作系统处理)。关于操作这个swap_entry_t的宏也就简单了,无非是左移1位或者8位或者相反。(未完)

        
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: