zoukankan      html  css  js  c++  java
  • 操作系统实验五(内存管理之动态分区分配(首次适应))

    #include<stdio.h>
    #include<stdlib.h>
    #include <iostream>
    #include <bits/stdc++.h>
    using namespace std;
    int SIZE=0;
    struct linkk//内存空闲分区 
    {
        int size;//内存块的大小 
        int addr;//起始地址 
        struct linkk *next;
    };
    struct jobtab//作业分区 
    {
        int jno;//作业的编号 
        int size;//作业的大小 
        int addr;//作业的起始地址 
        int flag;
    };
    struct  linkk *head,*p,*q;
    struct jobtab tab[20];
    void printlink()
    {
        int i;
        if(head!=NULL)
        {
            printf("
      分区号  分区地址 分区大小
    ");
            printf("========================
    ");
        }
      q=head; 
      i=1;
      while(q!=NULL) 
      {
          printf("   %d	   %d	   %d	
    ",i,q->addr,q->size);
          q=q->next;
          i++;
      }
      printf("===============================
    ");
      return;
    }
    void printtab()
    {
        int i,flag;
        flag=0;
        for(i=0;i<20&&flag==0;i++)
            if(tab[i].flag==1)  flag=1;
            if(flag==0)
            {
                printf("
     no job");
                return;
            }
            printf("
      作业号  作业地址 作业长度
    ");
            printf("
    ===========================
    ");
            for(i=0;i<20;i++)
                if(tab[i].flag==1)
                    printf("  %d	   %d	    %d
    ",i,tab[i].addr,tab[i].size);
                printf("
    =================================
    ");
                return;
    
    }
    void allocm()
    {   
        int n,l;
        struct linkk  *p1;
        printf("
     Input job n(0<=n<20):");//输入第n个作业
        scanf("%d",&n);
        printf("
    Input joblength:");
        scanf("%d",&l);//输入第n个作业的长度
        if(tab[n].flag==1)  
        {    
            printf("
     The job  has  create!
    ");//tab[n].flag==1说明作业已被创建;否则创建作业
            return;
        }
        else
        {
            tab[n].flag=1; //置创建标志位和作业大小
            tab[n].size=l;
            q=head;p=head;
        }
        while(q!=NULL)//注意理解
        {
            if(q->size==l)
            {
                tab[n].addr=q->addr;
                p1=q;
                if(p1==head) head=q->next;//释放第一个分区块
                else
                    p->next=q->next;
                free(p1);
                SIZE=0;
                return;
            }
            if(q->size>l)
            {
                tab[n].addr=q->addr;
                q->size=q->size-l;
                q->addr=q->addr+l;
                SIZE-=l;
                cout<<SIZE<<endl;
                return;
            }
            p=q;q=q->next;
        }
        tab[n].flag=0;
        printf("
     no  memory!!
    ");
        return;
    }
    void freem()
    {  /*完成回收代码,学生编写*/
       int n; 
       printf("
     Input job n(0<=n<20):");//输入需要回收的作业编号 
       scanf("%d",&n);
       int addr=tab[n].addr;//获得需要释放内存的起始地址;
       int size=tab[n].size;//获得需要释放内存的大小;
       tab[n].flag=0;
       struct linkk  *te;//设置一个节点
       te=(struct linkk *)malloc(sizeof(struct linkk)); 
       q=head;
       te->addr=addr;
       te->size=size;
       if(SIZE<=0){
            //考虑一下内存分配完之后回收的情况。
         te->next=NULL;
         q=te;
         head=q; 
         SIZE+=te->size;
       }else{
             if((te->addr+te->size==q->addr)||(te->addr-te->size==q->addr)){
              //此时代表区间地址相连
                if(te->addr+te->size==q->addr){
                   //后相连
                 q->addr=te->addr;
                 q->size+=te->size;
                }else if(te->addr-te->size==q->addr){
                   //前相连
                     q->size+=te->size;
                }
          }else{//此时代表释放的空间不相连 
                if(te->addr<q->addr){
                   //如果新节点的地址小于已经存在的,那么插在前面
                   te->next=q;
               q=te; 
             }else{
                  //否则插在后面 
                te->next=NULL;
                q->next=te; 
             }
            head=q;
          } 
       }
    }
    int main()
    {
        int i,m,t,n;
        head=(struct linkk *)malloc(sizeof(struct linkk));
        head->addr=0;//初始化地址为0 
        head->next=NULL;
        printf("
      Input memory size:");
        scanf("%d",&n);//输入内存的长度 
        head->size=n;
        SIZE=n;
        for(i=0;i<20;i++){//初始化作业的编号和状态,0代表为完成作业 
            tab[n].jno=i;
            tab[n].flag=0;
        }
        t=0;
        do{
          printf("
    =================================================
    "); 
          printf("	1--alloc memory   2--free memory
    ");
          printf("	3--print_LINK   4--print_TAB
    ");
          printf("	5--Quit
    ");
          printf("==================================================
    ");
          printf("            Select[]\b");
          scanf("%d",&m);
          switch(m){
            case 1:allocm() ;break;
            case 2:freem();break;
            case 3:printlink();break;
            case 4:printtab();break;
            case 5: t=1;
            }
        }
        while(!t);
        return 0;
    }
    一纸高中万里风,寒窗读破华堂空。 莫道长安花看尽,由来枝叶几相同?
  • 相关阅读:
    C#设计模式总结
    【23】备忘录模式(Memento Pattern)
    【22】访问者模式(Visitor Pattern)
    mycat 分库
    mysql的存储过程
    mysql的视图
    mysql的索引
    mysql权限操作
    mysql事务操作
    mysql常用函数
  • 原文地址:https://www.cnblogs.com/byczyz/p/12770365.html
Copyright © 2011-2022 走看看