linux操作系统第四章

上传人:今*** 文档编号:107048073 上传时间:2019-10-17 格式:PPT 页数:66 大小:1.15MB
返回 下载 相关 举报
linux操作系统第四章_第1页
第1页 / 共66页
linux操作系统第四章_第2页
第2页 / 共66页
linux操作系统第四章_第3页
第3页 / 共66页
linux操作系统第四章_第4页
第4页 / 共66页
linux操作系统第四章_第5页
第5页 / 共66页
点击查看更多>>
资源描述

《linux操作系统第四章》由会员分享,可在线阅读,更多相关《linux操作系统第四章(66页珍藏版)》请在金锄头文库上搜索。

1、第四章 内存管理,Linux的内存管理,进程的用户空间管理,请页机制,物理内存的分配与回收,交换机制,内存管理示例,内存的层次结构,4.1 Linux的内存管理概述,虚拟内存的基本思想:在计算机中运行的程序,其代码、数据和堆栈的总量可以超过实际内存的大小,操作系统只将当前使用的程序块保留在内存中,其余的程序块则保留在磁盘上。必要时,操作系统负责在磁盘和内存之间交换程序块。,扩大了的记忆虚拟内存,虚地址到实地址转换,虚拟内存、内核空间和用户空间,内核空间(1GB),进程1的用户空间(3GB),进程2的用户空间(3GB),进程n的用户空间(3GB),虚拟地址空 间,虚拟内存共4G字节,分为内核空间

2、(最高的1G字节)和用户空间(较低的3G字节)两部分,每个进程最大拥有3G字节私有虚存空间 地址转换通过页表把虚存空间的一个地址转换为物理空间中的实际地址。,虚拟内存、内核空间和用户空间,内核空间由所有进程共享,其中存放的是内核代码和数据,即“内核映象” 进程的用户空间中存放的是用户程序的代码和数据 内核空间映射到物理内存总是从最低地址(0x00000000)开始,使之在内核空间与物理内存之间建立简单的线性映射关系。,内核空间到物理内存的映射,0,3G,4G,0,X,虚拟地址空间,物理内存,图4.1 内核的虚拟地址空间到物理地址空间的映射,内核空间到物理内存的映射,y-PAGE_OFFSET

3、x+PAGE_OFFSET PAGE_OFFSET=0xC0000000,内核映像:把内核的代码和数据称作内核映像(kernel image)。 当系统启动时,Linux内核映像被装入物理地址0x00100000(1MB)开始的位置。 PAGE_OFFSET=0xC0100000,内核空间到物理内存的映射,Linux虚拟内存的实现需要多种机制的支持 地址映射机制 请页机制 内存分配和回收机制 交换机制 缓存和刷新机制,虚拟内存实现机制,地址映射,图4.2 虚拟内存实现机制及之间的关系,虚拟内存实现机制及之间的关系,每个进程经编译、链接后形成的二进制映像文件有一个代码段和数据段。 进程运行时须有

4、独占的堆栈空间。 向内核申请一块空间:请求内核分配一块虚存区间和相应的若干物理页面,并在它们之间建立起映射关系。,4.2 进程的用户空间管理,堆栈段,空洞,数据段,代码段,进程的用户空间(3G),动态内存或堆,Linux把进程的用户空间划分为一个个区间,便于管理。 一个进程的用户地址空间主要由mm_struct结构和vm_area_structs结构来描述。 mm_struct结构它对进程整个用户空间进行描述。 vm_area_structs结构对用户空间中各个区间(简称虚存区)进行描述。,进程用户空间,struct mm_struct atomic_t count; pgd_t * pgd;

5、 int map_count; struct semaphore mmap_sem; unsigned long start_code,end_code,start_data,end_data; unsigned long start_brk, brk, start_stack; unsigned long arg_start, arg_end, env_start, env_end; unsigned long rss, total_vm, locked_vm; unsigned long def_flags; struct vm_area_struct *mmap, *mmap_avl,

6、*mmap_cache; unsigned long swap_cnt; unsigned long swap_address; ;,mm_struct 结构,struct vm_area_struct struct mm_struct * vm_mm; unsigned long vm_start; unsigned long vm_end; pgprot_t vm_page_prot; unsigned short vm_flags; struct vm_area_struct *vm_next; short vm_avl_height; struct vm_area_struct *vm

7、_avl_left, *vm_avl_right; struct vm_operations_struct * vm_ops; struct vm_area_struct *vm_next_share, *vm_pprev_share; unsigned long vm_offset; struct file * vm_file; unsigned long vm_pte; ;,VM_AREA_STRUCT 结构,划分虚存区原因:每个虚存区来源不同。,struct vm_operations_struct void (*open)(struct vm_area_struct * area);

8、void (*close)(struct vm_area_struct * area); struct page * (*nopage)(struct vm_area_struct * area, unsigned long address, int unused); ;,进程控制块是内核中的核心数据结构。 在进程的 task_struct 结构中包含一个mm域,它是指向 mm_struct 结构的指针。 struct mm_struct *mm; /描述进程的地址空间 而进程的 mm_struct结构则包含进程的可执行映像信息以及进程的页目录指针pgd等。 该结构还包含有指向 vm_area

9、_struct 结构的几个指针,每个 vm_area_struct 代表进程的一个虚拟地址区间。,相关数据结构间的关系,相关数据结构之间的关系示意图,fork()系统调用在创建新进程时也为该进程创建完整的用户空间。 具体而言,是通过拷贝或共享父进程的用户空间来实现的,即内核调用copy_mm( )函数,为新进程建立所有页表和mm_struct结构。 Linux利用“写时复制”技术来快速创建进程。 用户空间的创建过程中的工作:建立mm_struct结构,vm_area_struct结构以及页目录和页表,并没有真正的复制一个物理页面。,创建进程用户空间,执行一个进程时,其可执行映像必须装入进程的用

10、户地址空间。 虚存映射:将映像链接到进程用户空间的方法称为“虚存映射”,即把文件从磁盘映射到进程的用户空间,对文件的访问转化为对虚存区的访问。 分类:共享的、私有的虚存映射和匿名映射。 当可执行映像映射到进程的用户空间时,将产生一组 vm_area_struct 结构来描述各虚拟区间的起始点和终止点。,虚存映射,例:exam.c int main() printf(“virtual area test!”); ,进程的虚存区举例,exam进程的虚存区,与用户空间相关的主要系统调用,进程运行时,CPU访问的是用户空间的虚地址。 Linux仅把当前要使用的少量页面装入内存,需要时再通过请页机制将特

11、定的页面调入内存。 当要访问的虚页不在内存时,产生一个页故障并报告故障原因。,4.3 请页机制实现虚存管理的重要手段,页故障产生原因: 程序出现错误;(如:地址无效) 虚地址有效,但所对应的页不在物理内存中-缺页异常; 从磁盘或交换文件中将其装入物理内存。 要访问的虚地址被写保护,即保护错误。 若某用户进程正在写当前进程的地址空间,则发一个信号并终止进程的运行。 若错误发生在一个旧的共享页上,则对其进行复制,即“写时复制”。,请页机制,缺页异常处理程序,否,是,是,是,否,否,总体方案,缺页异常处理流程图,否,否,否,否,否,否,否,否,否,是,是,是,是,是,是,是,是,是,请求调页:把页面

12、的分配推迟到进程要访问的页不在物理内存时为止,由此引起一个缺页异常。 引入原因:进程开始运行时并不访问其地址空间中的全部地址。 程序的局部性原理保证请求调页从总体上使系统有更大的吞吐量。,请求调页动态内存分配技术,写时复制技术可以推迟、甚至免除数据的拷贝。 进程创建之初内核并不复制整个进程空间,而是使父子进程以只读方式共享同一个拷贝。 数据只有在需要写入时才会被复制,从而使各个进程拥有各自的拷贝。,写时复制(copyonwrite)技术,在Linux中,CPU所访问的地址是虚拟地址空间的虚地址; 管理内存页面时,先在虚存空间中分配一个虚存区间,然后才根据需要为此区间分配相应的物理页面并建立起映

13、射。-虚存区分派在前,物理页面分配在后。,4.4 物理内存的分配与回收,每个物理页面对应一个page结构(mem_map_t)。 typedef struct page struct page *next; /*双向链表的下一个*/ struct page *prev; /*双向链表的前一个*/ struct page *next_hash; /*指向hash表后一个*/ struct page *prev_hash; /*指向hash表前一个*/ unsigned dirty:16,age:8;/*age记载被访问的情况;dirty:是否被修改*/ atomic_t count; /*共享进

14、程数目*/ unsigned long flags; /*页面状态*/ struct inode *inode; /*当页面内容是文件的一部分,指向文件的inode */ unsigned long offset; /*指出在文件中的偏移量 */ unsigned long map_nr; /*在mem_map数组中的下标*/ unsigned long swap_unlock_entry; struct wait_queue *wait; struct buffer_head * buffers; /*如果页用做buffer,则指向其 buffer_heads*/ mem_map_t Lin

15、ux采用著名的伙伴(Buddy)算法来解决外碎片问题。,物理内存的分配与回收,Linux的伙伴算法把所有的空闲页面分为10个块链表,每个链表中的一个块含有2的幂次个页面(叫做“页块”或简称“块” ) 大小相同、物理地址连续的两个页块被称为“伙伴”。 1页块中:0和1、2和3、4和5、.;就是一对对的1页块buddy“伙伴”; 2页块中:01和23、45和67、89和1011、. 就是一对对的2页块buddy“伙伴”。 工作原理:首先在大小满足要求的块链表中查找是否有空闲块,若有则直接分配,否则在更大的块中查找。其逆过程就是块的释放,此时会把满足伙伴关系的块合并。,页面分配与回收算法伙伴算法,s

16、truct free_area_struct Struct page *next; /*空闲链表下一个节点*/ Struct page *prev; /*空闲链表前一个节点*/ Unsigned int *map; /*指向相应页块的位图,其位于内存 bitmap区*/ free_area10;,伙伴算法,Linux通过free_area 数组采用有两种方法可用来管理物理内存的空闲页面,来进行内存的分配和释放:,一种是采用位图(跟踪内存块使用情况),一种是采用空闲页块组链表 (管理维护空闲块),Linux对内存页面块的每种划分都对应一个位图map,下图给出了1、2、4页块位图示意图。在位图中每一位表示一对buddy页块的使用情况,方法: 如果: 1对都空闲,则该位为0; 1对都占

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号