目录
不同的页面访问序列(128000)缺页率、算法开销(内存块=6)
1.引言
本文档为实验四页面置换算法实验报告。其中2-6为概要设计,7为实验结果,8为附件。
术语
序号 | 用語 | 説明 |
1 | OPT | 最佳置换算法 |
2 | FIFO | 先进先出算法 |
3 | LRU | 最久最近未使用算法 |
4 | CLOCK | 改进型clock算法 |
5 | PBA | 页面缓冲算法 |
2.前提说明
模拟的虚拟内存的地址为16位,页面大小为1K。模拟的物理内存有32K。实验中为了测试会进行改动。
缺页率 = 缺页中断次数/页面访问次数。不计入为空时第一次存入。
3.算法功能概述
OPT
选择永不使用或是在最长时间内不再被访问(即距现在最长时间才会被访问)的页面淘汰出内存
理想化算法,具有最好性能(对于固定分配页面方式,本法可保证获得最低的缺页率),但实际上却难于实现,故主要用于算法评价参照
FIFO
选择最先进入内存即在内存驻留时间最久的页面换出到外存
进程已调入内存的页面按进入先后次序链接成一个队列,并设置替换指针以指向最老页面
简单直观,但不符合进程实际运行规律,性能较差,故实际应用极少
LRU
以“最近的过去”作为“最近的将来”的近似,选择最近一段时间最长时间未被访问的页面淘汰出内存
适用于各种类型的程序,性能较好,但需要较多的硬件支持
clock
① 从查寻指针当前位置起扫描内存分页循环队列,选择A=0且M=0的第一个页面淘汰;若未找到,转②
② 开始第二轮扫描,选择A=0且M=1的第一个页面淘汰,同时将经过的所有页面访问位置0;若不能找到,转①
与简单Clock算法相比,可减少磁盘的I/O操作次数,但淘汰页的选择可能经历多次扫描,故实现算法自身的开销增大
PBA
设立空闲页面链表和已修改页面链表,空闲页面链表同时用于物理块分配。
采用可变分配和基于先进先出的局部置换策略,并规定被淘汰页先不做物理移动,而是依据是否修改分别挂到空闲页面链表或已修改页面链表的末尾
当已修改页面链表达到一定长度如Z个页面时,一起将所有已修改页面写回磁盘,故可显著减少磁盘I/O操作次数
4.关键数据结构
页表用整数数组或结构数组来表示。
OPT\LRU
数组。具体见4.5。
FIFO
队列。因为stl中queue无法遍历,自定义。
typedef struct node
{
int num;
node* next;
} Node, *pNode;
typedef struct queue
{
int n;
pNode front;
pNode rear;
} Queue, *pQueue;
CLOCK
结构体
struct LNode
{
int data;
int flag;//访问位
int modify;//修改位
}* nodes;
PBA
队列加链表。其中队列在FIFO数据结构基础上增加信息,共用。
typedef struct node
{
int num;
int flag;//访问位
int modify;//修改位//PBA用
node* next;
} Node, *pNode;
typedef struct queue
{
int n;
pNode front;
pNode rear;
} Queue, *pQueue;//queue无法遍历
struct Link
{
int num;//当前链表上的结点数
Node* next;
};
Link idle;
Link modified;
访问序列与内存块等
页面访问序列串是一个整数序列,整数的取值范围为0到N - 1。页面访问序列串中的每个元素p表示对页面p的一次访问。
在宏定义中可修改序串长度及内存块数。
#define P 32 //物理内存块数
#define V 64 //虚拟内存块数
#define block 3 //分配内存块数
int* memo;//存储块
int access[V]; //访问序列
int lost = 0;//缺页数
int index = 0;//指示当前内存下标
5.主要算法
为计算开销使用了clock函数。
OPT
void initMemo();//初始化存储空间,主要是设置分配空间的大小
bool isInMemo (int n); //指定页号是否已经在内存中
void testOptimal();//算法实现函数
LRU
void testLRU();
void initMemo();
bool isInMemo (int n);
FIFO
void initQueue (pQueue q);//初始
void push (pQueue q, int num);//
void pop (pQueue q);//
void destroy (pQueue q);//销毁
bool findInQueue (pQueue q, int num);//查
void testfifo();
void fifo (pQueue q, int num);//算法
CLOCK
void testClock();
PBA
void addToLink (int data, int type);
void emptyIdle();
void emptyModi();
void PBA (pQueue q,int num);
void testPBA ();
void initQueue (pQueue q);//初始
void push (pQueue q, int num);//
void pop (pQueue q);//
void destroy (pQueue q);//销毁
bool findInQueue (pQueue q, int num);//查
随机序列
1.确定虚拟内存的尺寸N,工作集的起始位置p,工作集中包含的页数e,工作集移动率m(每处理m个页面访问则将起始位置p +1),以及一个范围在0和1之间的值t;
2.生成m个取值范围在p和p + e间的随机数,并记录到页面访问序列串中;
3.生成一个随机数r,0 ≤ r ≤ 1;
4.如果r < t,则为p生成一个新值,否则p = (p + 1) mod N;
5.如果想继续加大页面访问序列串的长度,请返回第2步,否则结束。
void generate();//生成访问序列
6.接口设计
随着访问序列的移动,每一页调用一次相关接口进行页面置换,同时计算开销。
void testOptimal();
void testLRU();
void testfifo();
void testClock();
void testPBA ();
7.实验结果
结果界面如图,方便起见直接放表格。
给定页面访问序列(64)各算法发生页面置换次数的平均值
序列 | OPT | LRU | FIFO | CLOCK | PBA |
1 | 31 | 46 | 46 | 44 | 28 |
2 | 30 | 47 | 45 | 44 | 26 |
3 | 33 | 44 | 44 | 44 | 27 |
内存块=3时平均 | 31.33333 | 45.66667 | 45 | 44 | 27 |
4 | 22 | 22 | 24 | 27 | 23 |
5 | 22 | 24 | 25 | 27 | 24 |
6 | 16 | 19 | 20 | 20 | 16 |
内存块=6时平均 | 20 | 21.66667 | 23 | 24.66667 | 21 |
不同的页面访问序列(128000)缺页率、算法开销(内存块=6)
| OPT | LRU | FIFO | CLOCK | PBA | |||||
序列 | 缺页率 | 算法开销ms | 缺页率 | 算法开销ms | 缺页率 | 算法开销ms | 缺页率 | 算法开销ms | 缺页率 | 算法开销ms |
1 | 0.26033 | 4962 | 0.3602 | 12 | 0.3689 | 11 | 0.4244 | 10 | 0.2987 | 17 |
2 | 0.2028 | 3013 | 0.3269 | 10 | 0.338 | 10 | 0.3779 | 10 | 0.2268 | 17 |
3 | 0.2921 | 5930 | 0.3808 | 13 | 0.3871 | 11 | 0.4505 | 8 | 0.3074 | 18 |
平均 | 0.251743 | 4635 | 0.355967 | 11.66667 | 0.364667 | 10.66667 | 0.4176 | 9.333333 | 0.277633 | 17.33333 |
7-2-1 缺页率
7-2-2 算法开销(除OPT)
不同的虚拟内存尺寸缺页率、算法开销
过小(128)时算法开销较小,不计
| OPT | LRU | FIFO | CLOCK | PBA | |||||
序列长 | 缺页率 | 算法开销ms | 缺页率 | 算法开销ms | 缺页率 | 算法开销ms | 缺页率 | 算法开销ms | 缺页率 | 算法开销ms |
128000 | 0.26033 | 4962 | 0.3602 | 12 | 0.3689 | 11 | 0.4244 | 10 | 0.2987 | 17 |
12800 | 0.331 | 70 | 0.4045 | 2 | 0.4059 | 2 | 0.4832 | 1 | 0.3433 | 2 |
128 | 0.2578 |
| 0.3593 |
| 0.3828 | 0.4141 |
| 0.3438 |
|
结论
1分配到内存块数越多,缺页率约小,置换次数越少。
2.最佳置换算法具有最好性能。但时间最久,可能是扫描了整个访问序列寻找最长时间不访问页面。
3.最近最久未使用置换算法与页面置换算法性能较好,尤其数据较大时PBA具有优越性。但可能与本实验设定的链表长度与算法逻辑有关。
4.改进型clock算法性能最差,但耗时较低,推测实现过程中对于是否修改的随机设定代码有待改进。
8.附件
代码地址
https://github.com/Woochy-Young/OS/tree/master/LAB4
参考文档
编号 | 文档名称 | 作者 |
1 | 页面置换算法 | 王飞 |