《操作系统》实验报告——主存空间的分配与回收
生活随笔
收集整理的這篇文章主要介紹了
《操作系统》实验报告——主存空间的分配与回收
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
理論知識
Linux——Linux C語言編程基礎知識
一、實驗目的
采用可變式分區管理,使用最佳適應算法實現主存的分配與回收。
通過本次實驗,幫助學生理解在可變式分區管理方式下,如何實現主存空間的分配與回收。
二、實驗內容
主存是中央處理機能直接存取指令和數據的存儲器。能否合理而有效地使用主存,在很大程度上將影響到整個計算機系統的性能。本實驗采用可變式分區管理,使用首次或最佳適應算法實現主存空間的分配與回收。要求采用分區說明表進行。
三、代碼及運行結果分析
流程圖
源代碼?
#include <stdio.h> #include <string.h> #define MAX 600 //設置總內存大小為512kstruct partition {char pn[10];//分區名字int begin;//起始地址int size;//分區大小int end;//結束地址char status;//分區狀態 }; struct partition part[MAX]; int p = 0; //標記上次掃描結束處void Init()//初始化分區地址、大小以及狀態 {int i;for ( i = 0; i < MAX; i++ )part[i].status = '-';strcpy( part[0].pn, "SYSTEM" );part[0].begin = 0;part[0].size = 100;part[0].status = 'u';strcpy( part[1].pn, "-----" );part[1].begin = 100;part[1].size = 100;part[1].status = 'f';strcpy( part[2].pn, "作業1" );part[2].begin = 200;part[2].size = 50;part[2].status = 'u';strcpy( part[3].pn, "-----" );part[3].begin = 250;part[3].size = 50;part[3].status = 'f';strcpy( part[4].pn, "作業2" );part[4].begin = 300;part[4].size = 100;part[4].status = 'u';strcpy( part[5].pn, "-----" );part[5].begin = 400;part[5].size = 200;part[5].status = 'f';for ( i = 0; i < MAX; i++ )part[i].end = part[i].begin + part[i].size-1; }void Output( int i ) //以行的形式輸出結構體的數據 {printf( "\t%s", part[i].pn );printf( "\t%d", part[i].begin );printf( "\t%d", part[i].size );printf( "\t%d", part[i].end );printf( "\t%c", part[i].status ); }void display() //顯示分區{int i;int n; //用n來記錄分區的個數printf("\n");printf( "\n 已分配分區表Used:" );printf( "\n\tNo.\tproname\tbegin\tsize\tend\tstatus" );printf("\n");n = 1;for ( i = 0; i < MAX; i++ ){if ( part[i].status == '-' )break;if ( part[i].status == 'u' ){printf( "\n\tNo.%d", n );Output( i );n++;// 記錄已分配使用的分區個數}}printf("\n");printf( "\n 空閑分區表Free:" );printf( "\n\tNo.\tproname\tbegin\tsize\tend\tstatus" );printf("\n");n = 1;for ( i = 0; i < MAX; i++ ){if ( part[i].status == '-' )break;if ( part[i].status == 'f' ){printf( "\n\tNo.%d", n );Output( i );n++; //記錄空閑分區的個數}}printf("\n");printf( "\n 內存使用情況,按起始址增長的排:" );//printf( "\n printf sorted by address:" );printf( "\n\tNo.\tproname\tbegin\tsize\tend\tstatus" );printf("\n");n = 1;for ( i = 0; i < MAX; i++ ){if ( part[i].status == '-' )break;printf( "\n\tNo.%d", n );Output( i );n++;//記錄已分配分區以及空閑分區之和的總個數} }void Fit( int a, char workName[], int workSize ) //新作業把一個分區分配成兩個分區:已使用分區和空閑分區 {int i;for ( i = MAX; i > a + 1; i-- ){//通過逆向遍歷,把在a地址后的所有分區往后退一個分區,目的在于增加一個分區if ( part[i - 1].status == '-' )continue;part[i]=part[i-1];}strcpy( part[a + 1].pn, "-----" );part[a + 1].begin = part[a].begin + workSize;part[a + 1].size = part[a].size - workSize;part[a + 1].end = part[a].end-1;part[a + 1].status = 'f';strcpy( part[a].pn, workName );part[a].size = workSize;part[a].end = part[a].begin + part[a].size-1;part[a].status = 'u'; } void fenpei() // 分配 {int i;int a;int workSize;char workName[10];int pFree;printf( "\n請輸入作業名稱:" );scanf( "%s", &workName );for(i=0;i<MAX;i++){if(!strcmp(part[i].pn,workName))//判斷作業名稱是否已經存在{printf("\n作業已經存在,不必再次分配!\n");return;}}printf( "請輸入作業大小(k):" );scanf( "%d", &workSize );for ( i = 0; i < MAX; i++ ){//通過循環在空閑區找是否有適合區間存儲作業if ( part[i].status == 'f' && part[i].size >= workSize ){pFree = i;break;}}if ( i == MAX ){printf( "\n該作業大小超出最大可分配空間" );getch();return;}for ( i = 0; i < MAX; i++ )//最佳適應算法if ( part[i].status == 'f' && part[i].size >= workSize )if ( part[pFree].size > part[i].size )pFree = i;//通過遍歷所有區間,每次都找到最小空閑分區進行分配Fit( pFree, workName, workSize );printf( "\n分配成功!" ); } void hebing() //合并連續的空閑分區 {int i = 0;while ( i != MAX - 1 ){for ( i = 0; i < MAX - 1; i++ ){if ( part[i].status == 'f' )if ( part[i + 1].status == 'f' ){part[i].size = part[i].size + part[i + 1].size;part[i].end = part[i].begin + part[i].size-1;i++;for ( i; i < MAX - 1; i++ ){if ( part[i + 1].status == '-' ){part[i].status = '-';break;}part[i]=part[i+1];}part[MAX - 1].status = '-';break;} }} } void huishou() // 回收分區 {int i;int number;int n=0;printf( "\n請輸入回收的分區號:" );scanf( "%d", &number );if ( number == 1 ){printf( "\n系統分區無法回收" );return;}for ( i = 0; i < MAX; i++ )//通過循環查找要回收的已使用分區區號{if ( part[i].status == 'u' ){n++;if ( n == number ){strcpy( part[i].pn, "-----" );part[i].status = 'f';}}}if ( i == MAX - 1 ){printf( "\n找不到分區" );return;}hebing();//合并連續的空閑分區printf( "\n回收成功!" ); } void main() {int selection;Init();printf( "初始化完成,設內存容量%dk", MAX );printf( "\n系統文件從低址存儲,占%dk", part[0].size );while ( 1 ){printf( "\n----------選擇----------" );printf( "\n| 0、退出系統 |" );printf( "\n| 1、顯示分區 |" );printf( "\n| 2、分配分區 |" );printf( "\n| 3、回收分區 |" );printf( "\n------------------------");printf( "\n請選擇 > " );while ( 1 ){scanf( "%d", &selection );if ( selection == 0 ||selection == 1 || selection == 2 || selection == 3 )break;printf( "輸入錯誤,請重新輸入:" );}switch ( selection ){case 0:exit(0); //退出系統break;case 1:display(); //顯示分區break;case 2:fenpei(); //分配作業break;case 3:huishou(); //回收分區break;default:break;}printf("\n"); } }運行結果
?
四、實驗心得
理解在可變式分區管理方式下,如何實現主存空間的分配與回收。
掌握使用最佳適應算法實現主存的分配與回收。
參考文章
操作系統——實驗四:主存空間的分配和回收
主存儲器空間的分配和回收
操作系統實驗報告---主存分配與回收(最佳適應算法)
?
總結
以上是生活随笔為你收集整理的《操作系统》实验报告——主存空间的分配与回收的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JAVA——文件操作工具类封装的简单实现
- 下一篇: 《软件工程》实验报告——软件测试