问题 G: 存储管理—可变分区存储管理方式的最佳适应、下次适应、最差适应分配算法

题目描述

当采用可变分区分配方案对1024KB的内存进行管理时,要求输入多个进程已经占用分区信息、一个进程内存请求以及所选用的分配算法,输出显示分配给进程的分区信息。

输入格式

程序要求输入4行,以回车符号作为分隔,第一行是一个整数n(4>n>0),表示进程已经占用分区的数量;第二行是2n个整数,依次按地址递增对应第一行n个进程已经占用分区的起始地址和存储容量(单位为KB)。第三行是三个整数,表示进程申请的内存空间大小(存储容量单位为KB);第四行是一个字符串,用”BEST”、 ”NEXT”、 ”WORST” (不含双引号,所有字母皆为大写)分别表示所选用的最佳适应、下次适应和最差适应分配算法。

输出格式

输出三个整数或字符串”false”(不含双引号,所有字母皆为小写),分别表示给进程所分配分区的起始地址;若某进程分配失败,则用”false”表示(不含双引号,所有字母皆为小写)。

输入样例 复制
1
50 100
20 20 80
BEST
输出样例 复制
0 20 150
#include <stdio.h>
int num = 0;
int idx = 0;
int A[10] ={0};
int B[] ={0,0,0,0,0,0,0,0,0,0};
int space[3] ={0};
void best(int len) {
    int min = 1024;
    int minQuality = 1024;
    int isPos = 0;
    for (int i = 0; i <= len; i++) {
        if (B[i] < minQuality) {
            if((space[num] <= B[i])==1){
                min = i;
                minQuality = B[i];
                isPos = 1;
            }
        }
    }
 
    isPos != 0 ? printf("%d ", A[min]): printf("false ");
    if(isPos!=0){A[min] += space[num];B[min] -= space[num];}
    num++;
    if (num != 3) {
        best(len);
    } else {
        return;
    }
    if(!(num!=3)) return;
    else best(len);
}
void next(int len) {
    int i = idx;
    do {
        if (space[num] <= B[i]) {
            idx = (i + 1) % (len + 1);
            printf("%d ", A[i]);
            A[i] =A[i] + space[num];
            B[i] =B[i] - space[num];
            num++;
            break;
        }
        i = (i + 1) % (len + 1);
    } while (i != idx);
    
    if(!(num==3)){next(len);
         
    }else{return;}
}
void worst(int len) {
    int size = len + 1;
    int max = -1;
    int maxQuality = -1;
    int isPos = 0;
    int i =0;
    while(i < size){
        if (B[i] > maxQuality && space[num] <= B[i]) {
            max = i;
            maxQuality = B[i];
            isPos = 1;
        }
        i++;
    }
    isPos!=0 ? printf("%d ", A[max]): printf("false ");
    if(isPos!=0){A[max] =A[max] + space[num];
        B[max] =B[max] - space[num];}
    num++;
  
    if(num!=3){
        worst(len);
         
    }else{return;}
}
int main() {
    int n = 0 ;
    scanf("%d", &n);
    int array[n][2];
    A[0] = 0;
    for (int i = 0; i <= n-1; i++) {
        scanf("%d %d", &array[i][0], &array[i][1]);
        A[i + 1] = array[i][0] + array[i][1];
        B[i] = array[i][0] - A[i];
        if (i == (n - 1)) {
            B[i + 1] = 1024 -A[i + 1];
        }
    }
    for (int i = 0; i <= (2+5-5); i++) {
        scanf("%d", &space[i]);
    }
    char way[5];
    scanf("%s", way);
    switch(way[0]){
        case 'B':best(n);break;
        case 'N':next(n);break;
        case 'W':worst(n);
    }
 
    return 0;
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

宇治小抹茶

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

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

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

打赏作者

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

抵扣说明:

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

余额充值