OS Lab Chanllenge

by 彭毛小民 17373260

Overview

  1. 竞速实验分享
    • 竞速实验设计
    • CLOCK,LRU及其相关变种比较
    • 改进思路
    • 实验效果
    • 结论
  2. Lab5 挑战性实验分享
    • 设计思路
    • 具体实现

PageReplace

  页面替换问题是一个非常经典的问题,在理论课程的学习中只是从书本上得到了各种算法的比较没有真实的进行操作。在这个挑战性实验能够加强自己的设计技巧和实战经验

CLOCK&LRU

  CLOCK算法:实现简单,有效改进FIFO设计存在的问题。

  LRU算法:非常理想的算法,但是实现较为复杂。

在实际实验中两者的比较在于:

  1. CLOCK算法本身效率更加快
  2. LRU算法本身替换效果较优,且能优化某些特定情况(重复循环的调用,多次交替调用)

Improvement

回忆OPT算法,页面替换的核心目标是:

从历史数据有效的估计最晚被再次使用的页面。

 

1. 如何预测最晚被再次使用。

2. 如何避免历史数据污染预测结果。

 

预测方面,CLOCK和LRU其实都提出了各自的标记策略,我最终使用了一种新的标记策略和的避免污染的测试方式。

Method

预测信息来源:

  1. 最近历史 (LRU)
  2. 最频繁访问 (LFU)
  3. 寻找页面调用区间

避免污染思路:

  1. 加快清除标记的速率
  2. 更新页面调用区间
  3. 分两块更迭使用

新的思路已经出现!

效率提升:分块hash表

Func

在工作集下定义如下页面重引用率p,在此值为零时,页框为可替换状态

p = \lfloor{ cnt \over{ 2^{miss} } } \rfloor

其中,cnt表示此页面替换后被再次引用的次数;

miss表示在此页面替换后总缺页次数。

这个指标的好处在于,有效的表示了:

1. 最近一段时间的引用次数

2. 快速清除历史页面对频繁缺页造成的影响

No Free Lunch:为了避免历史污染,可能会造成一定次数的缺页频繁,来剔除历史污染。为了保存间隔性调用的页面,可能会牺牲一定用于频繁调用的区间

Hash

如何查询一个miss?

  1. 逐一查找每一个页表项
  2. Hash表

传统Hash表存在的问题:

  1. 空间开销过于大,真实场景并不work
  2. 单位变量存取内容较少,缺少实际含义

将页面分成4块(4*16),用4个大小为32个int的hash表存放如下信息:

查询该段地址出现在那几个页表块中

Add1(5位) Add2(5位) Add3(5位) Add4(5位)

Hash

Add1(5位)
Add2(5位)
Add3(5位)
Add4(5位)
Hash1
Hash2
Hash3
Hash4

快速查询可能出现的页框

在中途查询的查询多次提前预知miss页

fortune:发现课程组数据访问页面不太相邻的特性

Compare

CLOCK 0.45124s (√)
LRU 0.71240s (x)
LFU 0.54214s
老化 0.61241s
My Algo 0.46124s (√)

实验用数据时间比较表

实验用替换次数比较表

CLOCK 25.3万次 (x)
LRU 25.5万次 (x)
LFU 25.3万次
老化 25.5万次
My Algo 24.8万次 (√)

Compare

Algorithm Fibo Recur Dijkstra Genetic
CLOCK 0.123s 0.71s 0.72s
LRU 0.211s 1.23s 1.12s
LFU 0.111s 0.91s 0.83s
My Algo 0.172s 0.81s 0.91s
OPT infty infty infty

测试用数据时间比较表

测试用替换次数比较表

Algorithm Fibo Recur Dijkstra Genetic
CLOCK 11.1万次 61.2万次 67.2万次
LRU 10.2万次 55.5万次 62.3万次
LFU 10.6万次 60.1万次 66.6万次
My Algo 10.5万次 51.5万次 67.1万次
OPT 9.1万次 51.2万次 61.3万次

Compare

  在竞速实验中,一直能保持在前十的水平,服务器上的测试有一定的不稳定性,但是依旧能稳定的依靠低于其他同学的替换次数,和较为优秀的效率,成功通过。

Lab5 Challenge

  1. 维护进程的读写权限进程
  2. 寻找关键的函数
  3. 增加系统调用

进程的读写权限

除了File System Server,其他进程要获得相关读写权限需要进行系统调用。

 

在ide读写判断前增加读写判断函数,检查该进程的权限

新增系统调用

1. 增删读写权限进程

2. 检查当前进程的读写权限

核心修改

1. 增删读写权限进程

2. 检查当前进程的读写权限

核心修改和效果

尝试突破权限调用,失败

Summary

  1. OS实验收获——理论和实践的结合
  2. OS挑战性探索——深入理解细节内容
  3. OS课程和日常学习生活

The End

Thanks for listening

OS Lab

By prime21

OS Lab

  • 1,672