一、实验目的理解内存的虚拟分配存储管理技术;理解请求分页存储管理的思想;.掌握常用的页面置换算法的思想 二、实验环境概述C语言或其它高级语言 三、实验内容对教材中所讲述的几种页面调度算法进行深入的分析,设计一个程序模拟实现一个作业在内存中执行的页面置换,并计算缺页中断次数。 编程实现三种页面置换算法: 四、实验原理1)FIFO页面置换算法; 初始化内存帧: 2)LRU页面置换算法: LRU 页面置换算法原理解释 3)OPT最佳页面置换算法 未来最长时间不被访问的页面: 五、实验步骤1)FIFO页面置换算法; #include <stdio.h> #define MAX_FRAMES 3 // 页面帧数 #define MAX_PAGES 10 // 页面总数 void fifoPageReplacement(int pages[], int n) { int frames[MAX_FRAMES]; int frameIndex = 0; int pageFaults = 0; for (int i = 0; i < MAX_FRAMES; i++) { frames[i] = -1; // 初始化页面帧 } for (int i = 0; i < n; i++) { int currentPage = pages[i]; int pageHit = 0; // 检查页面是否已在内存中 for (int j = 0; j < MAX_FRAMES; j++) { if (frames[j] == currentPage) { pageHit = 1; break; } } // 页面不在内存中,进行页面置换 if (!pageHit) { frames[frameIndex] = currentPage; frameIndex = (frameIndex + 1) % MAX_FRAMES; pageFaults++; } // 打印当前内存状态 printf("Step %d: ", i + 1); for (int j = 0; j < MAX_FRAMES; j++) { printf("%d ", frames[j]); } printf("\n"); } printf("\nTotal Page Faults: %d\n", pageFaults); } int main() { int pages[MAX_PAGES] = {1, 2, 3, 4, 2, 1, 5, 6, 2, 1}; int n = sizeof(pages) / sizeof(pages[0]); printf("FIFO Page Replacement Algorithm\n"); fifoPageReplacement(pages, n); return 0; } 2)LRU页面置换算法: #include <stdio.h> #define MAX_FRAMES 3 // 页面帧数 #define MAX_PAGES 10 // 页面总数 void lruPageReplacement(int pages[], int n) { int frames[MAX_FRAMES]; int pageOrder[MAX_PAGES]; // 用于记录页面的访问顺序 int pageFaults = 0; for (int i = 0; i < MAX_FRAMES; i++) { frames[i] = -1; // 初始化页面帧 } for (int i = 0; i < n; i++) { int currentPage = pages[i]; int pageHit = 0; // 检查页面是否已在内存中 for (int j = 0; j < MAX_FRAMES; j++) { if (frames[j] == currentPage) { pageHit = 1; // 更新页面访问顺序 for (int k = 0; k < MAX_PAGES; k++) { if (pageOrder[k] == currentPage) { // 移动当前页面到最近使用的位置 for (int l = k; l > 0; l--) { pageOrder[l] = pageOrder[l - 1]; } pageOrder[0] = currentPage; break; } } break; } } // 页面不在内存中,进行页面置换 if (!pageHit) { int replacedPage = frames[MAX_FRAMES - 1]; // 将最近最少使用的页面替换出去 for (int j = 0; j < MAX_FRAMES; j++) { if (frames[j] == replacedPage) { frames[j] = currentPage; break; } } // 更新页面访问顺序 for (int j = MAX_PAGES - 1; j > 0; j--) { pageOrder[j] = pageOrder[j - 1]; } pageOrder[0] = currentPage; pageFaults++; } // 打印当前内存状态 printf("Step %d: ", i + 1); for (int j = 0; j < MAX_FRAMES; j++) { printf("%d ", frames[j]); } printf("\n"); } printf("\nTotal Page Faults: %d\n", pageFaults); } int main() { int pages[MAX_PAGES] = {1, 2, 3, 4, 2, 1, 5, 6, 2, 1}; int n = sizeof(pages) / sizeof(pages[0]); printf("LRU Page Replacement Algorithm\n"); lruPageReplacement(pages, n); return 0; } 3)OPT最佳页面置换算法 #include <stdio.h> #include <limits.h> #define MAX_FRAMES 3 // 页面帧数 #define MAX_PAGES 10 // 页面总数 int findOptimal(int frames[], int pages[], int start, int end) { int index = -1, farthest = start; for (int i = 0; i < MAX_FRAMES; i++) { int j; for (j = start; j < end; j++) { if (frames[i] == pages[j]) { if (j > farthest) { farthest = j; index = i; } break; } } if (j == end) return i; } return (index == -1) ? 0 : index; } void optPageReplacement(int pages[], int n) { int frames[MAX_FRAMES]; int pageFaults = 0; for (int i = 0; i < MAX_FRAMES; i++) { frames[i] = -1; // 初始化页面帧 } for (int i = 0; i < n; i++) { int currentPage = pages[i]; int pageHit = 0; // 检查页面是否已在内存中 for (int j = 0; j < MAX_FRAMES; j++) { if (frames[j] == currentPage) { pageHit = 1; break; } } // 页面不在内存中,进行页面置换 if (!pageHit) { int index = findOptimal(frames, pages, i + 1, n); frames[index] = currentPage; pageFaults++; } // 打印当前内存状态 printf("Step %d: ", i + 1); for (int j = 0; j < MAX_FRAMES; j++) { printf("%d ", frames[j]); } printf("\n"); } printf("\nTotal Page Faults: %d\n", pageFaults); } int main() { int pages[MAX_PAGES] = {1, 2, 3, 4, 2, 1, 5, 6, 2, 1}; int n = sizeof(pages) / sizeof(pages[0]); printf("OPT Page Replacement Algorithm\n"); optPageReplacement(pages, n); return 0; } 六、实验结论及感悟1)FIFO页面置换算法; 2)LRU页面置换算法: 3)OPT最佳页面置换算法 FIFO 页面置换算法: 算法复杂度: |
01-29
1万+
05-22
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交