大二作業——操作系統實驗——C語言用雙向鏈表,模擬實現動態分區式存儲管理


實驗:動態分區式存儲管理

實驗內容:

編寫程序模擬完成動態分區存儲管理方式的內存分配和回收。實驗具體包括:首先確定內存空閑分配表;然后采用最佳適應算法完成內存空間的分配和回收;最后編寫主函數對所做工作進行測試。

實驗提示

由於是實驗,沒有真正的內存分配。所以在實驗中首先應建立一張空閑區表,初始狀態只有一個空閑登記項(假定的內存空閑區)和一張所有狀態都為“空”的已分配區表。假定內存空間110KB,OS占用10KB,其余為空閑區。然后可以選擇進行內存分配或回收:若是分配,要求輸入作業名和所需內存空間大小;若是回收,輸入回收作業的作業名。程序循環進行內存分配和回收,直到用戶選擇退出系統。在每次作業提交(內存分配)及作業結束(內存回收)時顯示兩張表的內容,以檢查內存的分配和回收是否正確。

用C語言編程實現:

#include<stdio.h>
#include<malloc.h>
typedef struct storage
{
    int name;
    int size;
    int startaddress;
    int stuta;//0表示空閑;1表示已分配
    storage* next;
    storage* front;
}storage;
//初始化
void initialize(storage *s,int name){
    s->name=name;
    s->size=0;
    s->startaddress=0;
    s->stuta=0;
    s->front=NULL;
    s->next=NULL;
}
//判斷是否可以分配0表示不能分配,1表示可以分配
int IFallocation(storage *s,int Size)
{
    storage *p;
    while (s!=NULL)
    {
        p=s->next;
        if(s->stuta==0 && s->size>Size)//空閑而且存在 夠分的情況
        {
            return 1;
        }
        s=p;
    }
    printf("不允許分配\n");
    return 0;
}
//分配
void allocation(storage* head,int name,int size)
{
    //找最佳位置
        //創建兩個指針 一個掃描移動 一個記錄最佳
        //假設頭指針就是最佳插入位置
        //掃描 先看是不是空閑區  在看能不能分配  在看是不是最佳位置
    storage *h,*p,*great;
    h=head;
    while(h){
        p=h->next;
        if(h->stuta==0)
        {
            great=h;
            if(h->size>size)
            {
                if(h->size<great->size)
                {
                    great=h;
                }
            }
        }
        h=p;
    }
    //創建節點
    p=(storage*)malloc(sizeof(storage));
    initialize(p,great->name);
    //修改數據
    p->size=great->size-size;
    p->startaddress=great->startaddress+size;
    great->size=size;
    great->stuta=1;
    //鏈接
        //分為尾部為空的鏈接  和不為空的鏈接
    if(great->next==NULL)
    {
        p->next=great->next;
        p->front=great;
        great->next=p;
    }
    else
    {
        p->next=great->next;
        p->next->front=p;
        great->next=p;
        p->front=great;
    }
    printf("分配成功\n");
}
//回收有四種情況
//return 0則是找不到name return 1是成功
int recycle(storage** head,int name)
{
    //根據名字找到節點
    storage *h,*p;
    h=*head;
    while (h!=NULL)
    {
        p=h->next;
        if(h->name==name && h->stuta==1)
        {
            break;
        }
        h=p;
    }
    if(h==NULL)
    {
        printf("任務不存在\n");
        return 0;
    }
    //根據幾點前后 區塊 和區塊 空閑情況回收
        //如果不用合並只需要把狀態設置為0
        //如果下面有節點而且空閑則合並
        //如果上面有幾點而且空閑則合並
    h->stuta=0;
    if(h->next && h->next->stuta==0)
    {
        //修改值
        h->next->size+=h->size;
        h->next->startaddress=h->startaddress;
        //鏈接
        if(h==*head)
        {
            *head=h->next;
            h->next->front=NULL;
        }
        else{
            h->next->front=h->front;
            h->front->next=h->next;
        }
        //釋放
        p=h->next;
        free(h);
        h=p;
    }
    if(h->front &&h->front->stuta==0)
    {
        //修改值
        h->front->size+=h->size;
        //鏈接
        if(h->next)
        {
            h->next->front=h->front;
            h->front->next=h->next;
        }
        else{
            h->front->next=NULL;
        }
        //釋放
        free(h);
    }
    printf("回收成功\n");
    return 1;
}
//顯示分配情況
void display(storage*head){
    storage*p;
    while (head)
    {
        p=head->next;
        printf("片號%d,大小%d,狀態%d,起始位置%d\n",head->name,head->size,head->stuta,head->startaddress);
        head=p;
    }
}
void Menu()
{
    printf("按1添加任務,按2刪除任務,按0退出\n");
}
//退出
void Exit(storage*head)
{
    printf("1\n");
    storage*p,*h;
    h=head;
    while (h)
    {
        p=h->next;
        free(h);
        h=p;
    }
}
int main()
{
    int menu;
    storage*head;
    head=(storage*)malloc(sizeof(storage));    
    initialize(head,1);
    head->size=100;
    Menu();
    scanf("%d",&menu);
    while (menu)
    {
        display(head);
        if(menu==1)
        {
            int name,size;
            printf("請輸入任務號");
            scanf("%d",&name);
            printf("請輸入任務大小");
            scanf("%d",&size);
            if(IFallocation(head,size))
                {
                allocation(head,name,size);    
            }
        }
        if(menu==2)
        {
            int name;
            printf("請輸入要刪除的任務號");
            scanf("%d",&name);
            recycle(&head,name);
        }
        printf("本操作結束請再次選擇操作");
        scanf("%d",&menu);
        Menu();
    }
    Exit(head);
    return 0;
}

歡迎批評指正。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM