一、实验目的
(1)理解页面淘汰算法原理,编写程序演示页面淘汰算法。
(2)验证 Linux 虚拟地址转化为物理地址的机制
(3)理解和验证程序运行局部性的原理。
二、实验内容
(1)在Windows环境下编写一个程序,模拟实现OPT,FIFO,LRU等页面淘汰算法。可以使用数组模拟内存,数组中的元素模拟为指令或数据。写不同方式的程序去 访问数组来模拟 CPU 访问内存的情况。分析运算结果,在分配不同的物理块情况下, 各算法的缺页情况有什么规律?可以 srand( )和 rand( )等函数定义和产生“指令”
序列,然后将指令序列变换成相应的页地址流,并针对不同的算法计算出相应的
命中率。 例如,实验中可以产生 320 条“指令”,每个“虚拟页”存放 10 条指令。 进程分配的页框是 4(可变,例如 32)。
(2)在 Linux 环境下,编写一个小程序,获取该程序中的某个变量的虚拟地址,
虚拟页号,页内偏移地址,物理页框号,页内偏移地址,物理地址,并将它们打 印出来。建议使用/proc/pid/pagemap 技术。
(3)在Windows 环境下,编写一个函数(特点:比较耗时,比如大型的多维数
组读写),用不同的方法测试其所花费的时间。在不同环境下比较其时间是否不同,并分析其含义。测量时间的函数请 baidu。
三、实验过程
(一)实验步骤
1)模拟实现OPT,FIFO,LRU等页面淘汰算法(Windows)
1.定义内存帧,指令序列,引用串,内存容量,虚拟内存容量;
1. #define MAX_VIR_SIZE 64
2. #define MAX_MEM_SIZE 32
3. #define VIR_NO 2
4. #define MEM_NO 3
5. #define FALSE -1
6.
7. int mem_frame[MAX_MEM_SIZE]; //内存帧
8.
9. int instruction[MAX_VIR_SIZE * 10]; //指令序列
10. int reference[MAX_VIR_SIZE * 10]; //引用串
11.
12. int mem_size[MEM_NO] = {
4, 18, 32 }; //内存容量
13. int vir_size[VIR_NO] = {
32, 64 }; //虚存容量
- 初始化页地址流,指令序列全为-1,引用串全为-1;
- 产生页地址流
1. int generate_page(int vsize)
2. {
3. srand((unsigned)time(NULL)); /*播种子*/
4. //产生指令序列
5. for (int i = 0; i < vsize * 10; i += 5) {
6. instruction[i] = rand() % (vsize * 10 - 1);
7. instruction[i + 1] = instruction[i] + 1;
8. instruction[i + 2] = rand() % instruction[i + 1];
9. instruction[i + 3] = instruction[i + 2] + 1;
10. instruction[i + 4] = rand() % (vsize * 10 - instruction[i + 3] - 2) + instruction[i + 3] + 1;
11. }
12.
13. //将指令序列变换为对应的页地址流
14. for (int i = 0; i < vsize * 10; i++)
15. instruction[i] /= 10;
16.
17. reference[0] = instruction[0];
18.
19. int base = 0, j = 1;
20. for (int i = 1; i < vsize * 10; i++) {
21. if (instruction[i] != instruction[base]) {
22. reference[j] = instruction[i];