操作系統原理-內存分配與回收_第1頁
操作系統原理-內存分配與回收_第2頁
操作系統原理-內存分配與回收_第3頁
操作系統原理-內存分配與回收_第4頁
操作系統原理-內存分配與回收_第5頁
已閱讀5頁,還剩10頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

內存的動態存儲管理一、實驗內容編寫程序實現動態分區存儲管理方式的主存分配與回收。具體內容包括:首先確定主存空間分配表;然后采用最先適應算法完成主存空間的分配與回收;最后編寫主函數對所做工作進行測試二、實驗原理模擬存儲管理中內存空間的管理和分配內存空間的管理分為固定分區管理方式,可變分區管理方式,頁式存儲管理,段式存儲管理。題目:模擬內存分配與回收三、實驗步驟(或過程)在Microsoft

Visual

C++

6.0環境下運行設計一個空閑分區表,空閑分區表通過空閑分區鏈表來管理,在進行內存分配時,系統優先使用空閑分區低端的空間。設計一個內存分區表,可用鏈表管理,用以表示當前以內存使用情況。設計一個進程申請隊列以及進程完成后的釋放順序,實現主存的分配和回收。要求每次分配和回收后把空閑分區的變化情況以及各進程的申請、釋放情況以及各進程的申請、釋放情況以圖形方式顯示、打印出來。最佳適應算法:該算法總是把滿足要求、又是最小的空閑區分配給作業。檢查空閑區說明表是否有滿足作業要求的空閑區,也分為三種情況:大于,等于,小于。若檢查到有“等于”的情況,就可以直接分配,若沒有,則繼續檢查是否有“大于”的情況代碼實現如下:#include<stdio.h>#include<malloc.h>#include<stdlib.h>#definen64//定義內存的大小inta[n],count=0;//數組a用來保存內存使用狀況1為已分配0為未分配,count用來記name數組中元素個數charname[n];//已分配內存的名稱(字符類型)typedefstructlinknode{charpid;intstart;intlength;structlinknode*left,*right;}de_node;//進程節點結構體定義//head1表示未分配內存隊列頭指針,head2便是已分配進程隊列頭指針de_node*head1,*head2=NULL;structlinknode*creat()//創建一個進程節點{intlen,flag1=1;//用于表示進程是否可以創建charid;structlinknode*p;p=(de_node*)malloc(sizeof(de_node));//試圖在系統內存中開辟空間創建一個進程if(p==NULL)//p為空,說明系統沒有可用內存用于創建此模擬進程{printf("系統沒有足夠的內存可供使用!\n");//輸出return(NULL);//返回空指針}printf("請輸入進程id(字符類型)和長度:");//為進程輸入id和分配的長度scanf("%c%d",&id,&len);fflush(stdin);//清除輸入緩存if((id>='a'&&id<='z'||id>='A'&&id<='Z')&&(len>0)){for(inti=0;i<count;i++)//判斷輸入的進程名,如果已使用,返回空指針,并釋放p指針if(name[i]==id){printf("此名稱進程已存在!!");flag1=0;//標志位為0,表示下面對p指向內容不做修改if(head2==NULL)//表示當前沒有進程{printf("已沒有進程!\n");}else{//已分配內存隊列如果不為空printf("輸入要回收的進程id:");//輸入要回收進程的idscanf("%c",&id);fflush(stdin);for(inti=0;i<count;i++)//雙重循環把要回收的進程找出來,并把記錄的id去掉if(name[i]==id){//判斷當前的進程是否滿足要求for(intj=i;j<count;j++)name[j]=name[j+1];//向前覆蓋name[j+1]=NULL;//置空count--;//減一}//判斷是否總共只有一個進程且是夠剛好也滿足條件 if(q->pid==id&&q->right==q&&head2==q){head2=NULL;//把已分配隊列直接置空flag=1;//表示找到滿足條件的進程}if(flag==0){//上面的都沒找到do{ if(q->pid==id){//如果找到 if(q==head2) head2=q->right; q->left->right=q->right;//修改指針指向 q->right->left=q->left;flag=1;break;}elseq=q->right;}while(q!=head2);}//如果找到或是遍歷一遍結束if(flag==0)printf("沒有此進程號!!!\n");//沒有找到滿足的進程if(flag==1){//表示找到了for(inti=q->start;i<q->start+q->length;i++)//釋放占有的內存a[i]=0;//接下來修改可用內存的隊列,while(q->start>p->start&&p->right!=head1){//從第一個開始找到回收回來的內存開始地址大的那個隊列 p=p->right;}if(p==head1)//表示比第一個的開始還小,那么就要修改頭地址head1=q;//其他情況不用修改頭地址,只需找到應該的位置,把此進程插進去q->left=p->left;//修改指針的指向q->right=p;p->left->right=q;p->left=q; if(q->start+q->length==p->start)//可以與后面合并的情況 {q->length+=p->length;//修改指針的指向 p->right->left=q; q->right=p->right;free(p);} if(q->left->start+q->left->length==q->start)//可以與前面合并的情況 {q->left->length+=q->length;//修改指針的指向 q->left->right=q->right; q->right->left=q->left;free(q);}}} }//打印輸出voidprint(){de_node*q=head2,*p=head1;if(count==0)printf("沒有進程占有內存。\n");else{printf("輸出進程id號:\n");for(inti=0;i<count;i++)printf("%c\t",name[i]);}printf("\n");printf("輸出內存當前使用情況:\n");for(intj=0;j<n;j++)printf("%d%d\t",j,a[j]);printf("\n");printf("內存初始名稱為i,回收后可能會變,可以查看回收來自那個進程\n");do//輸出可用內存序列{if(p!=NULL){printf("進程id:%c開始地址:%d長度%d\n",p->pid,p->start,p->length);p=p->right;}}while(p!=head1);printf("\n");printf("已分配進程隊列:\n");do//已分配進程隊列{if(q!=NULL){printf("進程id:%c開始地址:%d長度%d\n",q->pid,q->start,q->length);q=q->right;}}while(q!=head2);}//主函數voidmain(){intx;de_node*point,*p1;//創建內存的初始狀態point=(structlinknode*)malloc(sizeof(structlinknode));head1=point;point->pid='i';point->start=0;point->length=n;head1->left=point;head1->right=point;print();while(1){printf("------MENU-------\n");printf("1----distribute(分配)\n");printf("2----reclaim(回收)\n");printf("3----view(瀏覽)\n");printf("4----exit(退出)\n");printf("請輸入上面的選項(1--4):\n");scanf("%d",&x);fflush(stdin);switch(x){case1:{p1=creat();if(p1==NULL)printf("創建進程失敗。\n");elsedistribute(p1);x=0;break; }case2:{reclaim();x=0;break;}case3:{print();x=0;break;}case4: {printf("Thanks;Bye-bye!");exit(0);x=0;break;}default:{printf("輸入有誤,請重新輸入。\n");}}

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論