实验三 页面置换算法

一.  实验目的:

1、熟悉虚存管理的各种页面淘汰算法

二、实验环境:

硬件环境:计算机一台,局域网环境;

软件环境:Windows XP及以上版本 Professional操作系统平台,Visual C++ 6.0专业版或企业版。

三 . 实验指导:     

  制定为进程分配的物理块数;给出该进程的调页顺序,然后采用不同的页面置换算法,给出具体的页面调用情况。

  1. 输入具体的物理块数;
  2. 给出进程的调页顺序;
  3. 选择具体的页面置换算法;
  4. 给出该页面置换算法的调页结果,并计算缺页率。

四、实验步骤(含流程图,实验过程分析等)

算法流程:

  1. 初始化一个大小为物理块数的数组,用于存储当前在内存中的页面。
  2. 遍历给定的引用串中的每个页面。
  3. 对于每个页面,检查它是否已经在数组中。如果是,则跳过该页面并继续遍历下一个页面。
  4. 如果该页面不在数组中,则需要进行页面置换。
  5. 重复步骤3和4,直到遍历完引用串中的所有页面。
  6. 计算缺页次数和缺页率。

五、实验结果及分析

图表 1 先进先出算法

图表 2 最近最久未使用算法

图表 3 最佳置换算法

六、实验源代码

#include<stdio.h>

#define N 100   //物理块数量上限

#define M 1000    //页面数量上限

int list[N], num;      //队列存放物理块对应数据  ,物理块数量

int n, yebiao[M];    //n总数 ,yebiao[M]存放页面号引用串

int miss = 0, missl[N] = { 0 };   //缺页数,missl[n]判断缺页情况

int pro[N], prol[N] = { 0 };   //优先级

int temp;    //最久-》存在时记录调用页面

int k = 0;   //打印页面号

int cun[M][N], Re = 0;    //存放物理块信息,用于后续输出



void init() {

    Re = 0;

    k = 0;

    miss = 0;

    for (int i = 0;i < n;i++) {

       missl[i] = 0;

    }

    for (int i = 0; i < num; i++) {

       list[i] = -1;

    }

}    //初始化,全部置为-1



void _print() {

    printf("页面号:  ");

    for (int i = 0;i < n;i++) {

       printf("   %d", yebiao[i]);

    }

    printf("\n\n");

    for (int i = 0; i < num; i++) {

       printf("物理块:  ");

       for (int j = 0;j < n;j++) {

           if (cun[j][i] == -1) {

              printf("   *");

           }

           else {

              printf("%4d", cun[j][i]);

           }

       }

       printf("\n");

    }

    printf("缺页位置:");

    for (int i = 0;i < n;i++) {

       if (missl[i] == 1) {

           printf("   #");

       }

       else {

           printf("    ");

       }

    }

    k++;

    printf("\n");

}    //打印队列结果



void jilu() {

    for (int i = 0;i < num;i++) {

       cun[Re][i] = list[i];

    }

    Re++;

}



bool cunzai(int x) {

    for (int i = 0;i < num;i++) {

       if (x == list[i]) {

           temp = i;    //最近最久未使用存在时排序

           return true;

       }

    }

    return false;

}  //判断是否在队列内



void inlist(int x) {

    for (int i = 0;i < n;i++) {

       list[i] = list[i + 1];

    }

    list[num - 1] = x;

}   //进队列



void _printmiss() {

    printf("缺页次数:%d   \n缺页率:%d/%d\n", miss, miss, n);

}



void priority(int x) {

    for (;x < n;x++) {

       for (int i = 0;i < num;i++) {



           if (list[i] == yebiao[x] && prol[i] == 0) {

              pro[i] = x;      // 队列i在页表中的位置越靠后优先级越高

              prol[i] = 1;

           }

       }

    }

    for (int i = 0;i < num;i++) {   //页表中不存在队列i  优先级最大

       if (prol[i] == 0) {

           pro[i] = 1000;

       }

    }

}//判断优先级



void prosort() {

    int templ;

    for (int i = 0;i < num - 1;i++) {

       for (int j = 0;j < num - 1 - i;j++) {

           if (pro[j] < pro[j + 1]) {

              templ = pro[j];

              pro[j] = pro[j + 1];

              pro[j + 1] = templ;

              templ = list[j];

              list[j] = list[j + 1];

              list[j + 1] = templ;

           }

       }

    }

    for (int i = 0;i < num;i++) {   //复原

       prol[i] = 0;

    }

} //优先级排序



void optimal() {

    init();     //初始化

    int count = n;

    int i = 0;

    while (count != 0) {

       if (i < num) {

           list[i] = yebiao[i];

           miss++;

           missl[i] = 1;

       }

       else if (cunzai(yebiao[i])) {



       }

       else {

           priority(i);

           prosort();

           inlist(yebiao[i]);

           miss++;

           missl[i] = 1;

       }

       jilu();

       count--;

       i++;

    }

    _print();

    _printmiss();

}



void fifo() {    //先进先出

    init();     //初始化

    int count = n;

    int i = 0;

    while (count != 0) {

       if (i < num) {

           list[i] = yebiao[i];

           miss++;

           missl[i] = 1;

       }

       else if (cunzai(yebiao[i])) {



       }

       else {

           inlist(yebiao[i]);

           miss++;

           missl[i] = 1;

       }

       count--;

       i++;

       jilu();

    }

    _print();

    _printmiss();

}



void lru() {     //最近最久未使用

    init();     //初始化

    int count = n;

    int i = 0;

    while (count != 0) {

       if (i < num) {

           list[i] = yebiao[i];

           miss++;

           missl[i] = 1;

       }

       else if (cunzai(yebiao[i])) {

           list[num] = list[temp];

           for (int j = temp;j <= num;j++) {

              list[j] = list[j + 1];

           }

       }

       else {

           inlist(yebiao[i]);

           miss++;

           missl[i] = 1;

       }

       jilu();

       count--;

       i++;

    }

    _print();

    _printmiss();

}



int main() {



    printf("请输入物理块数量:");

    scanf("%d", &num);

    printf("请输入要访问的页面总数:");

    scanf("%d", &n);

    printf("请输入要访问的页面号:");

    for (int i = 0; i < n; i++) {

       scanf("%d", &yebiao[i]);

    }

    int chose = 1;

    while (chose) {

       printf("请选择所需的置换算法:\n");

       printf("1.FIFO 2.LRU 3.0PT 4.退出\n");

       scanf("%d", &chose);

       if (chose == 1) {

           fifo();

       }

       if (chose == 2) {

           lru();

       }

       if (chose == 3) {

           optimal();

       }

       if (chose == 4) {

           break;

       }

    }

}



/*

3

20

7 0 1 2 0 3 0 4 2 3 0 3 2 1 2 0 1 7 0 1



*/

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,下面是Linux实验三页面置换算法的模拟。 页面置换算法操作系统中的一重要的内存管理技术,它的主要目的是在有限的物理内存中尽量多地运行进程。当内存中没有足够的空间来加载一个进程时,操作系统需要将一些页面从内存中换出,以便为新的页面腾出空间。常见页面置换算法有FIFO、最近最少使用(LRU)、最不常用(LFU)等。 本次实验我们将模拟FIFO和LRU两页面置换算法的过程。 首先,我们需要定义一些数据结构来模拟内存和页面。 ```c #define MEMORY_SIZE 4 // 物理内存大小 #define PAGE_SIZE 2 // 页面大小 struct page { int id; // 页面编号 int counter; // 计数器,用于LRU算法 }; struct memory { struct page pages[MEMORY_SIZE / PAGE_SIZE]; // 物理内存中的所有页面 int count; // 物理内存中已经使用的页面数量 }; ``` 接下来,我们可以定义FIFO算法和LRU算法的函数。这两个函数都接受一个要加载的页面编号参数,然后返回一个需要从内存中换出的页面编号。如果返回0,则表示不需要换出任何页面。 ```c // FIFO算法 int fifo(struct memory *mem, int page_id) { int i; // 检查页面是否已经在内存中 for (i = 0; i < mem->count; i++) { if (mem->pages[i].id == page_id) { return 0; } } // 如果内存中没有这个页面,则需要换出最先进入内存的页面 if (mem->count < MEMORY_SIZE / PAGE_SIZE) { // 如果物理内存还有空余,则直接将页面添加到物理内存中 mem->pages[mem->count].id = page_id; mem->count++; return 0; } else { // 如果物理内存已经满了,则需要将最先进入内存的页面换出 int page_to_swap = mem->pages[0].id; for (i = 1; i < MEMORY_SIZE / PAGE_SIZE; i++) { mem->pages[i - 1] = mem->pages[i]; } mem->pages[MEMORY_SIZE / PAGE_SIZE - 1].id = page_id; return page_to_swap; } } // LRU算法 int lru(struct memory *mem, int page_id) { int i, j, min_counter = -1, min_index = -1; // 检查页面是否已经在内存中 for (i = 0; i < mem->count; i++) { if (mem->pages[i].id == page_id) { // 如果页面已经在内存中,则将计数器加1 mem->pages[i].counter++; return 0; } } // 如果内存中没有这个页面,则需要换出最近最少使用的页面 if (mem->count < MEMORY_SIZE / PAGE_SIZE) { // 如果物理内存还有空余,则直接将页面添加到物理内存中 mem->pages[mem->count].id = page_id; mem->pages[mem->count].counter = 1; mem->count++; return 0; } else { // 如果物理内存已经满了,则需要将计数器最小的页面换出 for (i = 0; i < mem->count; i++) { if (min_counter == -1 || mem->pages[i].counter < min_counter) { min_counter = mem->pages[i].counter; min_index = i; } } int page_to_swap = mem->pages[min_index].id; mem->pages[min_index].id = page_id; mem->pages[min_index].counter = 1; for (i = 0; i < mem->count; i++) { if (i != min_index) { mem->pages[i].counter++; } } return page_to_swap; } } ``` 最后,我们可以编写一个测试函数来模拟页面置换算法的过程。 ```c void test() { int i, j, k, page_id, page_to_swap; struct memory mem; mem.count = 0; // 生成一些随机的页面访问序列 int page_sequence[] = {1, 2, 3, 4, 1, 2, 5, 1, 2, 3, 4, 5}; int sequence_length = sizeof(page_sequence) / sizeof(page_sequence[0]); // 使用FIFO算法模拟页面置换过程 printf("FIFO algorithm:\n"); for (i = 0; i < sequence_length; i++) { page_id = page_sequence[i]; page_to_swap = fifo(&mem, page_id); printf("Accessing page %d: ", page_id); if (page_to_swap == 0) { printf("no page swapping needed\n"); } else { printf("page %d swapped out\n", page_to_swap); } printf("Current memory status: "); for (j = 0; j < mem.count; j++) { printf("%d ", mem.pages[j].id); } printf("\n"); } // 使用LRU算法模拟页面置换过程 printf("\nLRU algorithm:\n"); mem.count = 0; for (i = 0; i < sequence_length; i++) { page_id = page_sequence[i]; page_to_swap = lru(&mem, page_id); printf("Accessing page %d: ", page_id); if (page_to_swap == 0) { printf("no page swapping needed\n"); } else { printf("page %d swapped out\n", page_to_swap); } printf("Current memory status: "); for (j = 0; j < mem.count; j++) { printf("%d ", mem.pages[j].id); } printf("\n"); } } ``` 当我们调用test()函数时,就可以看到FIFO算法和LRU算法的模拟过程了。下面是一个样例输出: ``` FIFO algorithm: Accessing page 1: no page swapping needed Current memory status: 1 Accessing page 2: no page swapping needed Current memory status: 1 2 Accessing page 3: no page swapping needed Current memory status: 1 2 3 Accessing page 4: no page swapping needed Current memory status: 1 2 3 4 Accessing page 1: page 1 swapped out Current memory status: 2 3 4 1 Accessing page 2: page 2 swapped out Current memory status: 3 4 1 2 Accessing page 5: page 3 swapped out Current memory status: 4 1 2 5 Accessing page 1: page 4 swapped out Current memory status: 1 2 5 4 Accessing page 2: no page swapping needed Current memory status: 1 2 5 4 Accessing page 3: no page swapping needed Current memory status: 1 2 5 4 Accessing page 4: page 1 swapped out Current memory status: 2 5 4 1 Accessing page 5: no page swapping needed Current memory status: 2 5 4 1 LRU algorithm: Accessing page 1: no page swapping needed Current memory status: 1 Accessing page 2: no page swapping needed Current memory status: 1 2 Accessing page 3: no page swapping needed Current memory status: 1 2 3 Accessing page 4: no page swapping needed Current memory status: 1 2 3 4 Accessing page 1: no page swapping needed Current memory status: 2 3 4 1 Accessing page 2: no page swapping needed Current memory status: 3 4 1 2 Accessing page 5: page 3 swapped out Current memory status: 4 1 2 5 Accessing page 1: page 4 swapped out Current memory status: 1 2 5 4 Accessing page 2: no page swapping needed Current memory status: 2 5 4 1 Accessing page 3: page 2 swapped out Current memory status: 3 5 4 2 Accessing page 4: page 1 swapped out Current memory status: 5 4 2 1 Accessing page 5: no page swapping needed Current memory status: 5 4 2 1 ``` 从输出中可以看到,FIFO算法和LRU算法的结果不同,但都符合预期的页面置换规则。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

还没有名字哦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值