操作系统笔记:(三)虚拟内存分配

本文介绍虚拟存储(虚拟存储分虚拟页式和段式,本文主要将页式,下面如不特别说明均指页式)的需求背景,概念,原理及缺页异常的处理流程
主要分为以下三部分:

  • 需求背景
  • 虚拟存储的原理特征
  • 缺页异常的处理流程

需求背景

  • 存储需求: 程序所需的存储空间越来越大
  • 存储体系结构: 这个在计算机组成原理里面学过,不同层次之间的访问时间差了几个数量级
  • 操作系统(Operating System, OS)对内存的抽象(0 4G-1)

解决方法

主要有3个:

  • 覆盖技术
  • 交换技术
  • 虚拟存储(现代计算机多用这个)
    这里写图片描述

覆盖技术

特点: 程序员手动将指令和数据装入内存,(是对于一个程序而言的,对程序员不透明,增加编程困难)

交换技术

OS 自动 把不能执行的程序放到外存中去

下面到达正题,虚拟存储

虚拟存储

程序的局部性原理

这是虚拟储存能起作用的重要支撑,就是说程序在运行是在时间和空间上有局部性

  • 时间: 访存的同一个地方在这次与下次执行集中在一个较短的时间间隔(e.g.: 循环)
  • 空间: 当前指令和下条指令以及当前访问的数据和下一个数据访问时间集中在同一个区域内(e.g.: 数组)

虚拟存储的idea: 以页为单位将不常用的内存页移动到外存中去。

原理

  • 装载程序时: 仅将当前程序所需要的部分页面装入内存
  • 缺页:(需要访问的内存块不在内存中): 产生缺页异常,处理器告知OS处理
  • OS 可将内存中暂时不用的页面放到外存中去

缺页处理的流程

这里写图片描述

我们通过在页表项中加入一些标识位可减少访存次数,如修改位,若没有修改位每次替换页面都需要两次访存(一次换入,一次写出),而加了修改位后可以仅在内存被修改时才写出(内存是外存的副本,可直接丢弃)。

页表项结构

这里写图片描述

X86 的页表结构

这里写图片描述

性能

有效访问时间(effective memory access time,EAT)

  • Th : 命中访存时间
  • Tm : 缺页(未命中的访存时间)
  • p : 缺页率

则:

EAT=Th(1p)+Tm(p)

一、 课程设计目的 本课程设计是学生学习完《计算机操作系统》课程后,进行的一次全面的综合训练,通过课程设计,让学生更好地掌握操作系统的原理及实现方法,加深对操作系统基础理论和重要算法的理解,加强学生的动手能力。 二、课程设计的内容 1、分页方式的地址换算 2、分段方式的地址换算 3、段页式的地址换算 、程序运行 1、 分页式地址转换: 数据: 逻辑地址:223、页面大小:23 2、 分段式地址转换 数据: 逻辑地址段号:223、段内地址:23 3、 段页式地址换算 逻辑地址的段号:2、页号:3 四、程序源代码 #include #include int page(int A,int L ); int Segment(int sn,int sl); int SegPagt(int sn,int pn,int pd); typedef struct segtable { int segf[256]; int segl[256]; }segtable; struct segtable st; typedef struct segpagt { int segf[256]; int segl[256]; int ptl[256]; int pt[256]; int pf[256]; int pl; }segpagt; struct segpagt sp; int main() { int code; int pl,pa,sn,sd,pd,pn; //const int ptl ; int temp; do{ printf("----------------地址换算过程----------------------------\n\n"); printf(" 1.分页式地址换算\n"); printf(" 2.分段式地址换算\n"); printf(" 3.段页式地址换算\n"); printf(" 4.结束运行\n\n"); printf("----------------------------------------------------------\n"); printf("请输入您的选择:"); scanf("%d",&code); switch(code) { case 1:{ printf("注意:请演示设定页表长度小于\n"); printf("请输入换算的逻辑地址:\n"); scanf("%d",&pa); printf("页面大小(B):\n"); scanf("%d",&pl); page(pa,pl); }break; case 2:{ printf("请演示设定段表长度小于\n"); printf("请输入逻辑地址的段号:\n"); scanf("%d",&sn); printf("段内地址:\n"); scanf("%d",&sd); Segment(sn,sd); }break; case 3:{ printf("预设定段表长为,页面大小为\n"); printf("请输入逻辑地址的段号:\n"); scanf("%d",&sn); printf("页号:\n"); scanf("%d",&pn); printf("页内地址:\n"); scanf("%d",&pd); SegPagt(sn,pn,pd); }break; case 4:{}break; } }while (code<4); } int page(int A,int L) { int d,P,kd,i; int WD; int PT[256]; for(i=1;iL) printf("页号大于页表长度,越界中断\n\n");//如果页号大于页表长度,输出越界中段 else { printf("页号=逻辑地址/页面大小=%d,页内地址=逻辑地址%页面大小=%d\n",P,d);//输出页号和页内地址 kd=PT[P];//根据页号随机产生快号 printf("根据页号%d得到块号%d\n",P,kd); WD=kd*L+d;//计算物理地址的公式 printf("物理地址=块号%d*页面大小%d+页内地址%d\n",kd,L,d);//输出物理地址=块号*页面大小+页内地址 printf("逻辑地址%d换算后的物理地址为%d\n\n",A,WD);//输出物理地址的结果 return (0); } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值