首次适应算法 C语言实现
生活随笔
收集整理的這篇文章主要介紹了
首次适应算法 C语言实现
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
廣東工業大學 操作系統實驗
用C語言實現采用首次適應算法的動態分區分配過程和回收過程。
其中,空閑分區通過空閑分區鏈(表)來管理;在進行內存分配時,系統優先使用空閑區低端的空間,要求每次分配和回收后顯示出空閑內存分區鏈的情況。
#include <stdio.h> #include <stdlib.h> #include <stdbool.h>#define FREE 0 #define BUSY 1 #define Max_length 640typedef struct freearea//空閑區的結構體 {int ID;//分區號int size;//分區大小int address;//分區地址bool isUsed;//使用狀態,0為未占用,1為已占用 } freearea;typedef struct DuNode//首尾不互連的雙向鏈表結點 {freearea data;//數據域struct DuNode *prior;//指針域struct DuNode *next; } DuNode, *DuLinkList;DuLinkList m_rid; DuLinkList m_last;void init()//空閑區隊列初始化 {m_rid = (DuLinkList)malloc(sizeof(DuNode));m_last = (DuLinkList)malloc(sizeof(DuNode));m_rid->prior = NULL;m_rid->next = m_last;m_last->prior = m_rid;m_last->next = NULL;m_rid->data.size = 0;m_rid->data.isUsed = BUSY; //首結點不會被使用,定義為占用狀態防止分區合并失敗m_last->data.address = 0;m_last->data.size = Max_length;m_last->data.ID = 0;m_last->data.isUsed = 0; }int first_fit(int ID,int size)//首次適應算法 {DuLinkList temp = (DuLinkList)malloc(sizeof(DuNode));DuNode *p = m_rid->next;temp->data.ID=ID;temp->data.size=size;temp->data.isUsed=BUSY;while(p){if(p->data.ID == ID)//不允許存在同名作業{printf("該作業號對應的作業已經在內存中!");return 0;}if (p->data.isUsed==FREE && p->data.size==size)//請求大小剛好滿足{p->data.isUsed=BUSY;p->data.ID=ID;return 1;}if (p->data.isUsed==FREE && p->data.size>size)//空閑區比所需內存大,則需要將多的內存作回收處理{temp->next=p;temp->prior=p->prior;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-=size;return 1;}p=p->next;}return 0; }void alloc()//分配內存 {int ID,size1;printf("請輸入作業號:");scanf("%d", &ID);printf("請輸入所需內存大小:");scanf("%d", &size1);if (ID<=0 || size1<=0)printf("錯誤!請輸入正確的作業號和請求的內存大小");if(first_fit(ID,size1))printf("分配內存成功!\n");elseprintf("分配內存失敗!\n"); }void freeNode()//釋放內存 {int ID;DuNode *p = m_rid->next;printf("輸入需要釋放內存的作業號:");scanf("%d", &ID);while (p){if (p->data.ID == ID){p->data.ID = 0;p->data.isUsed = FREE;if (!p->prior->data.isUsed && p->next->data.isUsed)//與前一個空閑區相鄰,則合并{p->prior->data.size += p->data.size;p->prior->next = p->next;p->next->prior = p->prior;}if (!p->next->data.isUsed && p->prior->data.isUsed) //與后一個空閑區相鄰,則合并{p->data.size += p->next->data.size;if(p->next->next){p->next->next->prior=p;p->next = p->next->next;}elsep->next = p->next->next;}if(!p->prior->data.isUsed && !p->next->data.isUsed) //前后的空閑區均為空{p->prior->data.size += p->data.size + p->next->data.size;if(p->next->next){p->next->next->prior = p->prior;p->prior->next = p->next->next;}elsep->prior->next = p->next->next;}printf("釋放內存成功!\n");break;}p = p->next;if(!p)printf("內存中沒有該需要釋放內存的作業!");} }void show() {printf("------------------");printf("內存分配情況");printf("------------------\n");DuNode *p = m_rid->next;while(p){printf("分區號:");if (p->data.ID==FREE)printf("FREE\n");elseprintf("%d \n", p->data.ID);printf("起始地址:%d\n", p->data.address);printf("內存大小:%d\n", p->data.size);printf("分區狀態:");if (p->data.isUsed==FREE)printf("空閑\n");elseprintf("已分配\n");printf("------------------\n");p=p->next;} }int main() {printf("------------------");printf("首次適應算法");printf("------------------\n");init();int tag = 1;while(tag < 3 && tag > 0){printf("輸入要進行的操作");printf("(1-分配內存,2-內存釋放,其他-退出程序):");scanf("%d", &tag);switch(tag){case 1:alloc();show();break;case 2:freeNode();show();break;default:printf("程序已退出!");}} }總結
以上是生活随笔為你收集整理的首次适应算法 C语言实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python Network(二)绘图d
- 下一篇: 中国富人的身影:世界最大楼市泡沫在加拿大