1.連續內存分配方式會造成許多「碎片」,雖然能夠經過「緊湊」方法將許多碎片拼接成可用的大塊空間,但須爲之付出很大開銷。若是容許將一個進程直接分散地裝入到許多不相鄰接的分區中,則無需再進行「緊湊」。基於這一思想而產生了離散分配方式。算法
2.若是離散分配的基本單位是頁,則稱爲分頁存儲管理方式;若是離散分配的基本單位是段,則稱爲分段存儲管理方式。 oop
3.在分頁存儲管理方式中,若是不具有頁面兌換功能,則稱爲基本的分頁存儲管理方式,或稱爲純分頁存儲管理方式,它不具有支持虛擬存儲器的功能,它要求把每一個做業所有裝入內存後方能運行。this
4.本實驗經過程序模擬操做系統的基本分頁存儲管理方式,進一步理解這一內存分配方式的原理和特色,加深對理論知識的掌握。spa
實驗內容:本實驗假定內存空間已經按塊劃分,目標程序無需關心內存塊大小等底層細節,只需按算法對內存塊進行分配便可。程序應該實現如下功能:操作系統
一、內存初始化。假定內存塊共有N個,初始化後的內存空間應該有一部分已經被使用,這能夠用隨機數或程序內部的其餘算法完成。3d
二、程序應該能接受用戶輸入的進程信息,併爲之分配內存,返回分配結果(成功或失敗),注意,此處應該考慮到不合法的輸入並進行相應處理。code
三、程序能回收用戶指定的進程所佔用的內存空間,所以,程序可能須要爲每一個進程分配一個惟一的進程號並給出詳細的提示信息。blog
四、能直觀合理地顯示內存分配狀況。進程
五、程序界面友好,便於操做和查看運行結果。內存
實驗要求:
一、用C語言或Java語言編寫程序模擬操做系統對內存的基本分頁存儲管理方式
二、程序要能正確對「內存」進行「分配」和「回收」,能接受用戶的輸入,顯示內存的分配狀況,並有必定的容錯能力。
三、每一個人獨立按時完成實驗內容。
#include <stdio.h> #include <stdlib.h> #include <time.h> /* run this program using the console pauser or add your own getch, system("pause") or input loop */ struct wuli{ int wuli_number; char pname; //已分配區表登記欄標誌,用"0"表示空欄目 }; //內存表 struct wuli wuli_table[20]={0}; struct page{ char pname; //進程名稱 int psize; //進程大小 int pagetable[10];//進程頁表 };//頁表 struct page page_table[10]={0}; void output(); int allocate(int wulisize,int i,int pagesize);//爲進程分配內存空間 int reclaim(int wulisize,char pname);//釋放進程佔用的空間 void output(){ int i; printf("-------------------內存分配狀況------------------------\n"); printf("\t物理塊號(PBN)\t\t進程名(PN)\n"); for(i=0;i<20;i++){ printf("\t %d",wuli_table[i].wuli_number); printf("\t\t\t %c\n",wuli_table[i].pname); } } int allocate(int wulisize,int i,int pagesize) { int k; int j; for(k=0;k<(page_table[i].psize/pagesize);k++){ for( j=0;j<20;j++){ if(wuli_table[j].pname=='0'){ wuli_table[j].pname=page_table[i].pname; page_table[i].pagetable[k]=j; wulisize--; break; } } } return wulisize; } int reclaim(int wulisize,char pname) { int j; int k; for( j=0;j<20;j++){ if(wuli_table[j].pname==pname){ wuli_table[j].pname='0'; wulisize++; } } for (j=0;j<10;j++){ if(page_table[j].pname==pname){ page_table[j].pname='0'; page_table[j].psize=0; for(k=0;k<10;k++){ page_table[j].pagetable[k]=0; } break; } } return wulisize; } int main(int argc, char *argv[]) { int pagesize;//分頁大小 int wulisize=80;//內存大小 char pname; int xuanze;//操做選擇 int i; printf("Please input the process size:"); scanf("%d",&pagesize); //初始化 for(i=0;i<20;i++) { wuli_table[i].wuli_number=i; wuli_table[i].pname='0'; } for(i=0;i<10;i++) { page_table[i].pname='0'; } //初始化後的內存空間有一部分已經被使用 srand((unsigned)time(NULL)); for(i=0;i<7;i++) { int number=rand()%19+1; wuli_table[number].pname='a'; wulisize--; } output(); //進入存儲分配 while(wulisize!=0){ printf("\n 1.分配 2.回收\n Please choose to operate:"); scanf("%d",&xuanze); if(xuanze==1){ for( i=0;i<10;i++){ if(page_table[i].pname=='0'){ getchar(); printf("Please input the process name:"); scanf("%c",&page_table[i].pname); getchar(); printf("Please input the process size:"); scanf("%d",&page_table[i].psize); break; } } wulisize=allocate(wulisize,i,pagesize); }else{ printf("Please input the process name:"); getchar(); scanf("%c",&pname); wulisize=reclaim(wulisize,pname); } output(); } return 0; }
此次實驗參考了同窗的代碼,本身對着代碼一點一點理解,仍是能作出來的。