實驗五 操作系統之存儲管理
一、實驗目的
連續內存分配方式會形成許多“碎片”,雖然可以通過“緊湊”方法將許多碎片拼接成可用的大塊空間,但須為之付出很大開銷。如果允許將一個進程直接分散地裝入到許多不相鄰接的分區中,則無需再進行“緊湊”。基於這一思想而產生了離散分配方式。
如果離散分配的基本單位是頁,則稱為分頁存儲管理方式;如果離散分配的基本單位是段,則稱為分段存儲管理方式。
在分頁存儲管理方式中,如果不具備頁面兌換功能,則稱為基本的分頁存儲管理方式,或稱為純分頁存儲管理方式,它不具備支持虛擬存儲器的功能,它要求把每個作業全部裝入內存后方能運行。
本實驗通過程序模擬操作系統的基本分頁存儲管理方式,進一步理解這一內存分配方式的原理和特點,加深對理論知識的掌握。
二、實驗要求
1、用C語言或Java語言編寫程序模擬操作系統對內存的基本分頁存儲管理方式
2、程序要能正確對“內存”進行“分配”和“回收”,能接受用戶的輸入,顯示內存的分配情況,並有一定的容錯能力。
3、每個人獨立按時完成實驗內容。
三、實驗內容
本實驗假定內存空間已經按塊划分,目標程序無需關心內存塊大小等底層細節,只需按算法對內存塊進行分配即可。程序應該實現以下功能:
1、內存初始化。假定內存塊共有N個,初始化后的內存空間應該有一部分已經被使用,這可以用隨機數或程序內部的其他算法完成。
2、程序應該能接受用戶輸入的進程信息,並為之分配內存,返回分配結果(成功或失敗),注意,此處應該考慮到不合法的輸入並進行相應處理。
3、程序能回收用戶指定的進程所占用的內存空間,因此,程序可能需要為每個進程分配一個唯一的進程號並給出詳細的提示信息。
4、能直觀合理地顯示內存分配情況。
5、程序界面友好,便於操作和查看運行結果。
四.實驗代碼
#include<stdio.h> #include<stdlib.h> #include<time.h> struct memory{ int memory_number; char proname; }; struct memory memory_table[20]={0}; struct page{ char proname;//進程名稱 int prosize;//進程大小 int pagetable[10];//進程頁表 };//頁表 struct page page_table[10]={0}; int allocate(int memorysize,int i,int pagesize);//為進程分配內存空間 int reclaim(int memorysize,char proname);//釋放進程占用的空間 void output(); int main() { int pagesize;//分頁大小 int memorysize=80;//內存大小 char proname; int choice;//操作選擇 int i; printf("Please enter the page size:\n"); scanf("%d",&pagesize); //初始化 for(i=0;i<20;i++) { memory_table[i].memory_number=i; memory_table[i].proname='0'; } for(i=0;i<10;i++) { page_table[i].proname='0'; } srand((unsigned)time(NULL)); for(i=0;i<7;i++) { int number=rand()%19+1; memory_table[number].proname='a'; memorysize--; } output(); //進入存儲分配 while(memorysize!=0) { printf("Selecting Operation\n1.Allocate 2.Reclaim\n"); scanf("%d",&choice); if(choice==1) { for( i=0;i<10;i++) { if(page_table[i].proname=='0') { getchar(); printf("Please enter process name:"); scanf("%c",&page_table[i].proname); getchar(); printf("Please enter process size:"); scanf("%d",&page_table[i].prosize); break; } } memorysize=allocate(memorysize,i,pagesize); }else { printf("Please enter process name:"); getchar(); scanf("%c",&proname); memorysize=reclaim(memorysize,proname); } output(); } return 0; } int allocate(int memorysize,int i,int pagesize) { int k; int j; for(k=0;k<(page_table[i].prosize/pagesize);k++) { for( j=0;j<20;j++) { if(memory_table[j].proname=='0') { memory_table[j].proname=page_table[i].proname; page_table[i].pagetable[k]=j; memorysize--; break; } } } return memorysize; } int reclaim(int memorysize,char proname) { int j; int k; for( j=0;j<20;j++) { if(memory_table[j].proname==proname) { memory_table[j].proname='0'; memorysize++; } } for (j=0;j<10;j++) { if(page_table[j].proname==proname) { page_table[j].proname='0'; page_table[j].prosize=0; for(k=0;k<10;k++) { page_table[j].pagetable[k]=0; } break; } } return memorysize; } void output(){ int i; printf("————————memory allocation——————————\n"); printf("Physical Block No. Process Name\n"); for(i=0;i<20;i++) { printf("%d %c\n",memory_table[i].memory_number , memory_table[i].proname); } }
五.運行結果




六.實驗總結
通過這次的實驗更好地加深了我對基本分頁存儲的理解。同時也提高了編碼能力。
