操作系统实验课设-三种适应算法

本文介绍了一种使用C++实现的内存分配算法,包括首次适应、最佳适应及最坏适应三种算法。通过用户输入分区块数量、大小及作业数等信息,程序能够展示不同算法下内存的分配情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include<iostream>
#include<cstdio>
using namespace std;
//定义一些全局变量
int FreePartition[100];//空闲分区块数组

int FirstPartition[100];//首次适应算法数组
int BestPartition[100];//最佳适应算法数组
int WorstPartition[100];//最坏适应算法数组

int JobSize[100];//每个作业的大小
int FreePartitionNum,JobNum;//分区块数,作业数

//首次适应算法
void First()
{
    int i,j;
    char str;
    for(i=0;i<FreePartitionNum;i++)
        FirstPartition[i]=FreePartition[i];
    for(i=0;i<JobNum;i++)//找出第一块满足作业的分区
    {
        str='A'+i;
        for(j=0;j<FreePartitionNum;j++)
        {
            if(FirstPartition[j]>=JobSize[i])   //有空闲内存块可以存储该进程
            {
                FirstPartition[j]-=JobSize[i];//找到后把分区大小减去作业的大小
                printf("作业%c在第%d块分区中\n",str,j+1);
                break;
            }
            else      //整个内存都不能满足情况
            {
                if(j==FreePartitionNum-1)
                    printf("作业%c不能装入到分配的内存中!\n",str);
            }
        }
    }
    printf("\n");
    printf("分配之后剩余的情况:\n");
    for(i=0;i<FreePartitionNum;i++)
        printf("%d ",FirstPartition[i]);
    printf("\n\n");
}


//最佳适应算法
void Best()
{
    int i,j,k=0,n;
    char str;
    for(i=0;i<FreePartitionNum;i++)
    {
        BestPartition[i]=FreePartition[i];
    }
    for(i=0;i<JobNum;i++)
    {
        str='A'+i;
        for(j=0;j<FreePartitionNum;j++)
        {
            if(BestPartition[j]>=JobSize[i])//有空闲内存块可以存储该进程
            {
                k=j;
                for(n=0;n<FreePartitionNum;n++)  //寻找最小的满足条件的空闲块
                {
                    if(BestPartition[n]<BestPartition[k] && BestPartition[n]>=JobSize[i])//找最佳的
                    k=n;
                }
                BestPartition[k]-=JobSize[i];
                printf("作业%c在第%d块分区中\n",str,k+1);
                break;
            }
            else  //整个内存都不能满足情况
                if(j==FreePartitionNum-1)
                {
                    printf("作业%c不能装入到分配的内存中!\n",str);
                    break;
                }
        }
    }
    printf("\n");
    printf("分配之后剩余的情况:\n");
    for(i=0;i<FreePartitionNum;i++)
        printf("%d ",BestPartition[i]);
    printf("\n\n");
}


//最坏适应算法
void Worst()
{
    int i,j,k=0;
    char str;
    for(i=0;i<FreePartitionNum;i++)
    {
        WorstPartition[i]=FreePartition[i];
    }
    for(i=0;i<JobNum;i++)
    {
        str='A'+i;
        for(j=0;j<FreePartitionNum;j++)  //寻找最大的空闲内存块
        {
            if(WorstPartition[k]<WorstPartition[j])
                k=j;
        }
        if(WorstPartition[k]>=JobSize[i])  //只需要比较一次,若不满足则不能存储
        {
            WorstPartition[k]-=JobSize[i];
            printf("作业%c在第%d块分区中\n",str,k+1);
        }
        else   //整个内存都不能满足的情况
            printf("作业%c不能装入到分配的内存中!\n",str);
    }
    printf("\n");
    printf("分配之后剩余情况:\n");
    for(i=0;i<FreePartitionNum;i++)
        printf("%d ",WorstPartition[i]);
    printf("\n\n");
}

void scanfmenu()
{
    int i;
    printf("输入分区块数:\n");
    scanf("%d",&FreePartitionNum);
    printf("输入每个分区的大小:\n");
    for(i=0;i<FreePartitionNum;i++)
        scanf("%d",&FreePartition[i]);
    printf("输入作业数:\n");
    scanf("%d",&JobNum);
    printf("输入每个作业的大小:\n");
    for(i=0;i<JobNum;i++)
        scanf("%d",&JobSize[i]);
}
void mainmenu()
{
    printf("\n\n\n");
    printf("----------------------请输入你想选用的算法!-----------------\n");
    printf("------------------------1.首次适应算法-----------------------\n");
    printf("------------------------2.最佳适应算法-----------------------\n");
    printf("------------------------3.最坏适应算法-----------------------\n");
    printf("------------------------4.重新输入信息-----------------------\n");
    printf("------------------------0.退出-------------------------------\n");
    printf("\n");
}
void printmenu()
{
    int n=1;  //设置选择变量n
    while(n!=0)  //除0的循环
    {
        mainmenu();  //主菜单
        scanf("%d",&n);
        switch(n)   //switch选择
        {
        case 0:
            break;
        case 1:
            printf("------------首次适应算法-----------------\n");
            First();  //首次适应算法函数
            break;
        case 2:
            printf("------------最佳适应算法-----------------\n");
            Best();   //最佳适应算法函数
            break;
        case 3:
            printf("------------最坏适应算法-----------------\n");
            Worst();   //最坏适应算法函数
            break;
        case 4:
            printf("----请重新输入你想要准备分配的作业!--\n");
            scanfmenu();
            break;
        default:
            break;
        }
    }
}
int main()
{
    scanfmenu();    //调用输入菜单函数
    printmenu();    //带用输出菜单函数
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值