操作系统可变分区用C语言实现按最佳适应算法分配内存

类似上一篇博客,在分配内存使用最佳使用算法,即将空闲区按大小进行排序实现

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

typedef struct memory
{
    int startaddress;
    int size;
    char state[10];
    char number[10];
    struct memory *next;
}FENQU;
FENQU *ready=NULL,*p;
FENQU * paixu(FENQU *p)
{
    FENQU *first,*second;
    int insert=0;
    if((ready == NULL) || ((p->size) < (ready->size)))   

    {
        p->next = ready;   
        ready = p;        

    }
    else        
    {
        first = ready;
        second = first->next;
        while (second != NULL)
        {
            if (p->size < second->size)
            {
                p->next = second;
                first->next = p;
                insert = 1;
                break;
            }
            else
            {
                first = first->next;
                second = second->next;
            }
        }
        if (insert == 0) 
        {
            first->next = p;
            p->next = NULL;
        }
    }
    return ready;
}
void show(FENQU *p)
{
    printf("起始地址    大小      状态     进程号 \n");
    printf("%5d\t",p->startaddress);
    printf("%8d\t",p->size);
    printf("%s  \t",p->state);
    printf("%s  \t\n",p->number);

}
void input()
{
    int i,address,size1,n=7;

    for(i=1;i<=n;i++)
    {
        p=(FENQU*)malloc(sizeof(FENQU));
        printf("请输入第%d个分区的起始地址:\n",i);
        scanf("%d",&address);
        p->startaddress=address;
        printf("请输入第%d个分区的大小:\n",i);
        scanf("%d",&size1);
        p->size=size1;
        printf("请输入第%d个分区的状态:\n",i);
        scanf("%s",p->state);
        printf("请输入第%i个分区的进程号:\n",i);
        scanf("%s",p->number);
        p->next=NULL;
        paixu(p);   
    }
     p = ready;
        while (p != NULL)      
        {
          show(p);
          p = p->next;
        }
}

void zjsy()
{
    int asize,fazhi;
    char pcbnumber;
    //FENQU *a;
    printf("请输入进程号,大小和阀值\n");
    scanf("%s",&pcbnumber);
    scanf("%d",&asize);
    scanf("%d",&fazhi);
    FENQU *pretail,*tail,*q;
    p=ready;
    pretail=tail=p;
    while(tail!=NULL)
    {

        if(strcmp(tail->state,"空闲")==0 && tail->size>asize)
        {
        if(tail->size==asize)
        {
            strcpy(tail->number,&pcbnumber);
             strcpy(tail->state,"已分");
            break;

        }

            else  if(tail->size>asize)
            {
            q=(FENQU *)malloc(sizeof(FENQU));
            q->startaddress=tail->startaddress+tail->size-asize;
            q->size=asize;
            strcpy(q->state,"已分");
            strcpy(q->number,&pcbnumber);
            q->next=tail->next;
            tail->next=q;
            tail->size = tail->size-asize;
            strcpy(tail->number,"空闲");
            strcpy(tail->number,"?");
            break;
        }

    }

    else
    {
        pretail=tail;
        tail=tail->next;

    }
    }
    if(tail==NULL)
    {
        printf("没有足够的空间,分配失败!\n");
    }

pretail->next=tail->next;
    tail->next=NULL;
    p=paixu(tail);
}

FENQU * huishou()
{
    char pcbnumber1;
    printf("请输入被回收空间的进程号\n");
        scanf("%s",&pcbnumber1);

    FENQU *pretail,*tail;
     p=ready;
     pretail=tail=p;

     while(tail!=NULL)
     {
         if(strcmp(tail->number,&pcbnumber1)==0)
         {
             if(tail->next!=NULL)
             {
                 if(strcmp(pretail->state,"已分")==0 && strcmp(tail->next->state,"已分")==0)
                 {
                     strcpy(tail->state,"空闲");
                     strcpy(tail->number,"?");
                     break;

                 }
                 if(strcmp(pretail->state,"空闲")==0 && strcmp(tail->next->state,"已分")==0)
                 {
                     pretail->next=tail->next;
                     pretail->size=tail->size+pretail->size;
                     free(tail);
                     break;
                 }
                 if(strcmp(pretail->state,"已分")==0 && strcmp(tail->next->state,"空闲")==0)
                 {
                     if(pretail!=tail)
                     {
                         pretail->next=tail->next;
                         tail->next->size=tail->next->size+tail->size;
                         tail->next->startaddress=tail->startaddress;
                         free(tail);
                         break;

                     }
                     else
                     {
                         p=tail->next;
                         tail->next->startaddress=0;
                         tail->next->size+=tail->size;
                         break;
                     }

                 }
                 if(strcmp(pretail->state,"空闲")==0 && strcmp(tail->next->state,"空闲")==0)
                 {
                     pretail->next=tail->next->next;
                     pretail->size=pretail->size+tail->size+tail->next->size;
                     free(tail->next);
                     free(tail);
                     break;

                 }
             }
             else
             {
                 if(strcmp(pretail->state,"已分")==0)
                 {
                     strcpy(tail->state,"空闲");
                     break;
                 }
                 else
                 {
                     pretail->next=NULL;
                     pretail->size=pretail->size+tail->size;
                     free(tail);
                     break;
                 }

             }
         }
         pretail=tail;
         tail=tail->next;
     }
      return p;
}

void function()
{
    int i;
    printf("请选择:(1) 分配空间 (2)回收空间  (3)结束\n");
    scanf("%d",&i);
    switch(i)
    {
    case 1: 
        zjsy();

        printf("分配成功!\n");
        while (p != NULL)      
        {
          show(p);
          p = p->next;
        }
        break;

    case 2:
        p=huishou();
        while (p != NULL)      
        {
          show(p);
          p = p->next;
        }
        break;
     case 3: 
             exit(0);
             }
    function();
}
void main()
{
    input();
    function();
}
  • 4
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是可变分区最先适应算法C语言实现: ```c #include <stdio.h> #define MAX_MEM_SIZE 100 // 内存大小 #define MAX_PROC_SIZE 10 // 进程个数 int mem[MAX_MEM_SIZE]; // 内存 int proc_sizes[MAX_PROC_SIZE]; // 进程大小 int proc_num = 0; // 进程个数 void init_mem() { for (int i = 0; i < MAX_MEM_SIZE; i++) { mem[i] = 0; } } void print_mem() { for (int i = 0; i < MAX_MEM_SIZE; i++) { printf("%d ", mem[i]); } printf("\n"); } int find_first_fit(int size) { int start = -1; int end = -1; int block_size = 0; for (int i = 0; i < MAX_MEM_SIZE; i++) { if (mem[i] == 0) { if (start == -1) { start = i; } block_size++; if (block_size == size) { end = i; break; } } else { start = -1; block_size = 0; } } if (end == -1) { return -1; } else { return start; } } int main() { // 初始化内存 init_mem(); printf("初始内存:\n"); print_mem(); // 输入进程大小 printf("请输入进程个数:"); scanf("%d", &proc_num); printf("请输入进程大小:\n"); for (int i = 0; i < proc_num; i++) { scanf("%d", &proc_sizes[i]); } // 分配内存 for (int i = 0; i < proc_num; i++) { int start = find_first_fit(proc_sizes[i]); if (start == -1) { printf("内存不足,无法分配大小为%d的进程\n", proc_sizes[i]); } else { for (int j = start; j < start + proc_sizes[i]; j++) { mem[j] = i + 1; } printf("分配大小为%d的进程到内存位置%d\n", proc_sizes[i], start); print_mem(); } } return 0; } ``` 该程序首先初始化内存为全部空闲,然后输入进程个数和大小。在分配内存时,使用最先适应算法查找空闲块,如果找到就将进程分配到该块中,否则输出错误信息。分配后打印内存状态。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值