问题 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;
}