学习笔记-操作系统虚拟内存篇

  内存管理问题:
  • 如何进行内存分配如何管理空闲内存
    • 如何找到合适的内存空闲块给进程使用?使用什么算法?
    • 使用合种方式对内存进行管理?
  • 如何处理内存碎片
  • 内存交换技术
    • 解决什么问题,很明显解决程序所需内存大于内存的大小
    • 优点,局部性,可以不需要一次把所有的程序load到内存
    • 缺点,很明显,由于磁盘的读写速度的限制,当程序增大时会整个交换技术会变的很慢
  • 虚拟内存
    • 虚拟内存的概念,说直白点是对物理内存的一个管理
    • 解决什么问题
      • 多个进程在内存中共存的问题,因为采用虚拟化的技术,操作的不再是具体的物理内存。这样其实中间多了一层映射。如果两个进程中有操作同一个内存地址就变的容易。
    • MMU,内存管理单元
    • 缺页中断
        • 为什么会发生缺页中断?
          • 由于虚拟内存往往会比实际的物理物理内存大,所以一定会有一部分的虚拟内存找不到物理内存的映射。这样当访问虚拟内存地址时就会找不到相应的物理内存地址,就发生了缺页中断。
    • 使得转换检测缓冲区(TLB)
      • 这种设计是基于怎么样的考虑
      • 如何提高TLB的命中率
        • 预装载
    • 虚拟内存的映射算法
      • 页框+偏移量
    • 对虚拟内存的散列
      • 这样维护一个虚拟内存到物理内存的映射表,通过查找虚拟内存就可以定位到物理内存
    • 对物理内存的散列
      • 当系统是64位的时候,虚拟地址空间是264,这样整个虚拟地址对应物理地址的映射表会变的很大。这个时候就需要使用倒排页表。不过问题很明显,需要搜索。
    •  页面转换算法
      • 这里有一些需要思考的点:1)具体的转换策略,当发生缺页中断时是采用何种置换。2)是转换进程本身的页面,还是可以转换其他进程的页面。
    • 具体的页面置换策略:
    •      最优页面置换算法:这种算法是是根据当前页面之后被访问的时间来判断频率来判断把哪些页面置换出,而现实情况是无法对将来进行判断,只能“机器学习”对过去的一些数据进行总结来作判断。所有这种置换算法并不实用。
    •      最近未使用页面算置换算法(NRU):两个状态位,一个R位,一个M位。当页面被访问时设置R位,当页面被修改时设置M位。定期的对R位进行清零操作。   
    •      先进先出(FIFO)算法:维护一个页面的链表。最新页面进入表尾,当链表满的时候淘汰表头的页面,这样链表是一个动态的,表尾的页面逐渐向表头移动。如果单纯采用这种算法,一些被常用的页面也同样很容易被淘汰。
    •      第二次机会页面置换算法 :这上算法是对FIFO算法的一次改进,根据在一个时钟周期内是否有过访问(R位可以判断,前面NRU算法中有讲)来判断是否淘汰该页面。如果不淘汰该页面则把该页面放入表尾,并清除R位。这里非常有意思,为什么要清除R位,假设不清除R位,后果会是什么,如果链表中的页面在一个时钟周期内都被访问过,那么至少在下一个时钟周期之前会出现死循环。
    •     时钟页面置换算法:这个算法和第二次机会页面转换算法类似,只是有一些策略的实现不同,在第二次机会页面置换算法中会涉及到比较多的页表移动,这样相对会比较耗时。
    •     最近最少使用页面置换算法(LRU):
      • 实现代价高昂,需要动态维护整个链表,在页表移动的过程中还是相当耗时的。
      • 硬件实现LRU算法
        • 有n个页框,n x n的矩阵(这里原理和上面所讲的置换算法类似),每个表格中用0或1填充,当访问第k个页框时,k行的位都置为1,而第k列都设为0。这里和上面说的设置R,M很类似。最后根据行的位二进制大小来排序。
      • 软件实现LRU算法(老化算法)
        • 用一个有限位的计数器记录,比如说8位计数,首先把计数器右移一位,然后把R值加到计数器的最高位。当发生缺页中断时只需要置换计数值最小的页。
        • 和LRU算法的算法的区别
          • 严格的来讲LRU算法是只需要有访问则其优先级就是最高。而老化算法则在一个时钟周期内无法判断哪个页面前被访问,哪个页面后被访问。但是其基本思想是一样的。
          • 另外一个区别是计数器的有限位限制了历史数据的保存,比如说8位计数器,在9个时钟周期之前被访问和1000个时钟周期之前被访问是无法被区分的。这里基本上会基于二八原则处理。
        工作集页面置换算法
        • 实现起来开销很大
      • 工作集时钟页面置换算法
        • 对工作集页面置换算法的改进
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一、 课程设计目的 本课程设计是学生学习完《计算机操作系统》课程后,进行的一次全面的综合训练,通过课程设计,让学生更好地掌握操作系统的原理及实现方法,加深对操作系统基础理论和重要算法的理解,加强学生的动手能力。 二、课程设计的内容 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、付费专栏及课程。

余额充值