1. 程式人生 > >計算機作業系統 ----記憶體空間回收(首次適應演算法和最佳適應演算法)

計算機作業系統 ----記憶體空間回收(首次適應演算法和最佳適應演算法)

#include<iostream.h>  
#include<stdlib.h>  
#define Free 0 //空閒狀態  
#define Busy 1 //已用狀態  
#define OK 1    //完成  
#define ERROR 0 //出錯  
#define MAX_length 32767 //最大記憶體空間為32767KB  
typedef int Status;  
int n=0;   
typedef struct freearea//定義一個空閒區說明表結構  
{  
    int ID;   //分割槽號  
    long size;   //分割槽大小  
    long address; //分割槽地址  
    int state;   //狀態  
}ElemType;  
  
//---------- 線性表的雙向連結串列儲存結構 ------------  
typedef struct DuLNode //double linked list  
{  
    ElemType data;   
    struct DuLNode *prior; //前趨指標  
    struct DuLNode *next; //後繼指標  
}DuLNode,*DuLinkList;  
  
DuLinkList block_first; //頭結點  
DuLinkList block_last; //尾結點  
  
Status alloc(int);//記憶體分配  
Status free(int); //記憶體回收  
Status First_fit(int,int);//首次適應演算法  
Status Best_fit(int,int); //最佳適應演算法  
void show();//檢視分配  
Status Initblock();//開創空間表  
  
Status Initblock()//開創帶頭結點的記憶體空間連結串列  
{  
    block_first=(DuLinkList)malloc(sizeof(DuLNode));  
    block_last=(DuLinkList)malloc(sizeof(DuLNode));  
    block_first->prior=NULL;  
    block_first->next=block_last;  
    block_last->prior=block_first;  
    block_last->next=NULL;  
    block_last->data.address=0;  
    block_last->data.size=MAX_length;  
    block_last->data.ID=0;  
    block_last->data.state=Free;  
    return OK;  
}  
  
//----------------------- 分 配 主 存 -------------------------  
Status alloc(int ch)  
{  
    int ID,request;  
    cout<<"請輸入作業(分割槽號):";   
    cin>>ID;  
    cout<<"請輸入需要分配的主存大小(單位:KB):";   
    cin>>request;  
    if(request<0 ||request==0)   
    {  
        cout<<"分配大小不合適,請重試!"<<endl;  
        return ERROR;  
    }  
  
    if(ch==2) //選擇最佳適應演算法  
    {  
        if(Best_fit(ID,request)==OK) cout<<"分配成功!"<<endl;  
        else cout<<"記憶體不足,分配失敗!"<<endl;  
        return OK;  
    }  
    else //預設首次適應演算法  
    {  
        if(First_fit(ID,request)==OK) cout<<"分配成功!"<<endl;  
        else cout<<"記憶體不足,分配失敗!"<<endl;  
        return OK;  
    }  
}  
//------------------ 首次適應演算法 -----------------------  
Status First_fit(int ID,int request)//傳入作業名及申請量  
{  
    //為申請作業開闢新空間且初始化  
    DuLinkList temp=(DuLinkList)malloc(sizeof(DuLNode));   
    temp->data.ID=ID;   
    temp->data.size=request;  
    temp->data.state=Busy;        
    DuLNode *p=block_first->next;  
    while(p)  
    {  
        if(p->data.state==Free && p->data.size==request)  
        {//有大小恰好合適的空閒塊  
            p->data.state=Busy;  
            p->data.ID=ID;  
            return OK;  
            break;  
        }  
        if(p->data.state==Free && p->data.size>request)  
        {//有空閒塊能滿足需求且有剩餘"  
            temp->prior=p->prior;  
            temp->next=p;        
            temp->data.address=p->data.address;  
            p->prior->next=temp;   
            p->prior=temp;  
            p->data.address=temp->data.address+temp->data.size;  
            p->data.size-=request;  
            return OK;  
            break;  
        }  
        p=p->next;  
    }  
    return ERROR;  
}   
//-------------------- 最佳適應演算法 ------------------------ 
Status Best_fit(int ID,int request)   
{   
    int ch; //記錄最小剩餘空間  
    DuLinkList temp=(DuLinkList)malloc(sizeof(DuLNode));   
    temp->data.ID=ID;   
    temp->data.size=request;  
    temp->data.state=Busy;  
    DuLNode *p=block_first->next;  
    DuLNode *q=NULL; //記錄最佳插入位置  
    while(p) //初始化最小空間和最佳位置  
    {   
        if(p->data.state==Free &&  (p->data.size>request || p->data.size==request) )  
        {  
            q=p;  
            ch=p->data.size-request;  
            break;  
        }  
        p=p->next;    
    }   
    while(p)  
    {    
         if(p->data.state==Free && p->data.size==request)  
        {//空閒塊大小恰好合適  
            p->data.ID=ID;  
            p->data.state=Busy;  
            return OK;  
            break;  
        }   
        if(p->data.state==Free && p->data.size>request)  
        {//空閒塊大於分配需求  
            if(p->data.size-request<ch)//剩餘空間比初值還小  
            {  
                ch=p->data.size-request;//更新剩餘最小值  
                 q=p;//更新最佳位置指向  
            }  
        }   
        p=p->next;   
    }    
    if(q==NULL) return ERROR;//沒有找到空閒塊   
    else 
    {//找到了最佳位置並實現分配 
        temp->prior=q->prior;   
        temp->next=q;   
        temp->data.address=q->data.address;  
        q->prior->next=temp;  
        q->prior=temp;  
        q->data.address+=request;  
        q->data.size=ch;  
        return OK; 
    }  
}  
//-----------------------   主 存 回 收   --------------------  
Status free(int ID)  
{   
    DuLNode *p=block_first;   
    while(p)   
    {   
        if(p->data.ID==ID)  
        {  
            p->data.state=Free;  
            p->data.ID=Free;  
            if(p->prior->data.state==Free)//與前面的空閒塊相連  
            {  
                p->prior->data.size+=p->data.size; 
                p->prior->next=p->next;  
                p->next->prior=p->prior;  
            }  
            if(p->next->data.state==Free)//與後面的空閒塊相連  
            {  
                p->data.size+=p->next->data.size;  
                p->next->next->prior=p;  
                p->next=p->next->next;      
            }  
            break;   
        }  
        p=p->next;  
    }    
    return OK;  
}   
//--------------- 顯示主存分配情況 ------------------  
void show()    
{    
    cout<<"***********-----------------************\n";   
    cout<<"****       主 存 分 配 情 況        ****\n";   
    cout<<"***********-----------------************\n";    
    DuLNode *p=block_first->next;   
    while(p)    
    {  
        cout<<"分 區 號:";  
        if(p->data.ID==Free) cout<<"Free"<<endl;  
        else cout<<p->data.ID<<endl;  
        cout<<"起始地址:"<<p->data.address<<endl;  
        cout<<"分割槽大小:"<<p->data.size<<" KB"<<endl;  
        cout<<"狀    態:";  
        if(p->data.state==Free) cout<<"空 閒"<<endl;  
        else cout<<"已分配!"<<endl;  
        cout<<"-----------------------"<<endl;  
        p=p->next;  
    }   
}  
//----------------------- 主 函 數---------------------------  
void main()  
{  
    int ch,d=0;//演算法選擇標記   
    cout<<"1.首次適應演算法 2.最佳適應演算法 0.退出\n";    
    cout<<"請選擇分配演算法:";    
    cin>>ch;    
    if(ch==0||ch==1||ch==2) d++;    
    while(d==0)    
    {    
        cout<<"請選擇正確的數字0 ,1 或2"<<endl;  
        cin>>ch;    
        if(ch==0||ch==1||ch==2) d++;   
    }   
    if(ch==0) exit(0);   
    if(n==0) Initblock(); //開創空間表   
    int choice; //操作選擇標記    
    while(1)    
    {   
        cout<<"********************************************\n";    
        cout<<"**    1: 分配記憶體        2: 回收記憶體      **\n";   
        cout<<"**    3: 檢視分配        0: 返    回      **\n";   
        cout<<"********************************************\n";  
        cout<<"請輸入您的操作 :";  
        cin>>choice;  
        if(choice==1)   
        {   
            alloc(ch); // 分配記憶體  
            n++;   
        }   
        else if(choice==2) // 記憶體回收   
        {   
            int ID;    
            cout<<"請輸入您要釋放的分割槽號:";    
            cin>>ID;    
            free(ID);   
            n++;    
        }    
        else if(choice==3)    
        {   
            show();//顯示主存   
            n++;   
        }   
        else if(choice==0)    
        {    
            main(); //退出    
            n++;   
        }    
        else //輸入操作有誤    
        {    
            cout<<"輸入有誤,請重試!\n"<<endl;   
            continue;   
        }   
    }