實驗:動態分區式存儲管理
實驗內容:
編寫程序模擬完成動態分區存儲管理方式的內存分配和回收。實驗具體包括:首先確定內存空閑分配表;然后采用最佳適應算法完成內存空間的分配和回收;最后編寫主函數對所做工作進行測試。
實驗提示
由於是實驗,沒有真正的內存分配。所以在實驗中首先應建立一張空閑區表,初始狀態只有一個空閑登記項(假定的內存空閑區)和一張所有狀態都為“空”的已分配區表。假定內存空間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; }
歡迎批評指正。