虚拟内存

来源:互联网 发布:易语言砍价源码 编辑:程序博客网 时间:2024/05/22 06:38

简介

虚拟内存的由来

1.问题提出:
当直接让进程使用直接的物理内存时,当对物理内存操作时会出现混乱。比如进程A装在0-30的物理内层,在29处是一条ADD指令。而进程B装在30-40处第一条指令为JMP 29.没有使用虚拟内存的话,进程B将直接跳到进程A从而使两者程序都破坏掉。
2.解决办法:
有两种解决这个问题:一种通过基址寄存器和界线寄存器形成地址空间,通过交换技术解决内存超载。另外一种就是基于分页的虚拟地址技术
1)交换技术:把一个进程完整调入内存运行一段时间,然后把他存回磁盘,空闲进程主要存储在磁盘上。缺点:当进程空间大于内存时,不能使用。
2)虚拟内存:把一个进程的一部分调入内存中运行,当内存没有空闲空间时,将新的覆盖旧的页,同时将旧 页写入磁盘。虚拟内存主要使用分页存储管理模式。

概念

虚拟存储器(Virtual Machine-VM)是值具有请求调入功能和置换功能,能从逻辑上对内存容量加以扩充的一种存储系统.

有了虚拟内存,操作系统中诸如进程间隔离, 文件缓存, 存储交换(swapping)等一系列高级的功能才得以实现.

虚拟内存管理分为

分页存储管理

页面是主存物理空间中划分出来的等长的固定区域
逻辑地址
逻辑页号
页内地址
逻辑地址由两部分组成:页号P和页内位移量W。
页面大小:页内地址从000000000000开始到2的y次方,y是页内位移量的位数

若给定一个逻辑地址为A,页面大小为L,则
页号P=INT[A/L],页内地址W=A MOD L

地址变换
页号:虚拟地址(10进制)/页面大小(单位bit)
页内偏移:虚拟地址(10进制)%页面大小(单位bit)
物理页块号:查询页表–>存储的是页面对应的物理块
物理地址:物理块号*页面大小+ 页内偏移

分段存储管理

将用户程序地址空间分成若干个大小不等的段,每段可以定义一组相对完整的逻辑信息。存储分配时,以段为单位,段与段在内存中可以不相邻接,也实现了离散分配。
整个作业的地址空间是二维的。
绝对地址=根据段号找到段表中的起始地址+段内地址

段页式存储、

是分段式和分页式结合的存储组织方法,这样可充分利用分段管理和分页管理的优点
(不写了,明天再写)

MMU

内存管理单元,
实现虚拟内存系统的物理硬件基础
允许软件通过一个别名的地址跟物理地址建立映射,通常是多于一个
MMU再使用一部分内存,通过一系列的查找表(Table lookups)来翻译虚拟地址到物理地址的映射

映射的实现

通过使用分页(pages)和分页表
建立全局段描述符表
分页表:分页表是一种数据结构,为使用电脑操作系统之虚拟内存技术,将 内存空间切割成分页的形式,用于储存虚拟内存及实体内存间的对应).

Zoned Buddy Allocator 暂译为:区域内存分配器

提供什么功能

负责整个虚拟内存系统分页存储管理
管理连续物理内存分页的链表映射到MMU的分页表(page tables),
提供有效的物理地址—->为请求分配物理地址的系统
(物理地址到虚拟内存地址的映射是被虚拟内存系统较高层处理的)

物理分页怎么进入列表

被友内存分配器分类和分组进入列表

虚拟内存

允许执行进程的一部分在内存中,程序可以比物理内存大
将内存抽象成一个巨大的数组,程序员不受内存存储的限制
虚拟内存展现在程序员面前的是一个比物理内存要大得多的、地址连续的内存空间
事实上是映射到支离破碎的物理内存,乃至磁盘上。

二、按需调页

页需要用到的时才调入内存
需要硬件支持区分哪些页在内存,哪些在磁盘

怎么区分

采用有效/无效位来表示
当页表中,一个条目的该位为有效时,表示该页合法且在内存中;反之,可能非法,也可能合法但不在内存中。
进程试图访问这些尚未调入内存的页时,会引起页错误陷阱(page-fault trap)

怎么处理页面调度

  1. 检查进程内部页表,确定该引用的合法性
  2. 非法(在内存中),进程终止;否则进行调入
  3. 找到一个空闲帧
  4. 调度一个磁盘操作,将所需页调入刚分配的帧
  5. 修改内部表和页表(有效无效位?),表示该页已在内存中
  6. 重新开始因陷阱而中断的指令

从交换空间进行按需调页

磁盘IO到交换空间比到文件系统要:
因为交换空间是按大块进行分配,并不使用文件查找和间接分配方法
进程开始时将整个文件镜像复制到交换空间,并从空间交换执行按页调度,那么有可能获得更好的性能。

从文件系统进行按需调页

三、写时复制

fork()出来的子进程,并不需要按需调页,与父进程共享页面,当子进程需要修改页的时候,才对该页复制一个副本,在副本上进行修改。是为写时复制

四、页面置换

进行页面置换的原因:

内存相对需求僧多粥少的局面:进程需要使用的页大于可分配内存IO缓存也需要使用大量的内存
导致 进程发生页错误的时候,操作系统准备好了要调入的所需页,却发现没有空闲帧可供分配。
以上情况使用页置换解决
方式
没有空闲帧,就查找当前没有使用的帧,将其释放,空出来保存进程出错的页(也就是需要换入的页)
换出的页有修改的话,还必须将页写回磁盘。可以通过设置修改位或脏位来提高性能

页置换算法:

2、FIFO页置换
FIFO使用的是页调入时间
为创建一个FIFO队列来管理内存中的所有页,队列中的首页被置换,而新调入的页到队尾
3、最优置换
最优置换看重的是页将来使用的时间
置换最长时间不使用的页(预测其未来经过最长时间才被使用)
错误率最低。
难以实现
4、LRU页置换
根据过去来猜测未来
实现LRU算法,可用计数器,也可用栈:凡用过的页,就放到顶部,不用的就沉到栈底
5、近似LRU页置换
页表内的每个条目都关联一个引用位,每当引用一个页时,相应的引用位就被硬件置位
开始时清零,通过检查引用位,可以知道哪些页使用过而哪些没有
6、基于计数的页置换
为每个页设置一个计数器,形成两种方案
1)最不经常使用页置换算法(LFU)
置换计数最小页
2)最常使用页置换算法(MFU)
置换计数最大页
7、页缓冲算法
8、应用程序与页置换

原创粉丝点击