操作系统Linux环境下动态分区存储管理的内存分别配回收
生活随笔
收集整理的這篇文章主要介紹了
操作系统Linux环境下动态分区存储管理的内存分别配回收
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
今天上機要求Linux下實現動態分區存儲管理的內存分別配回收現在把源碼貢獻出來
#include<stdlib.h> #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, "A" );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, "B" );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( "\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++;//記錄已分配分區以及空閑分區之和的總個數}getc;}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該作業大小超出最大可分配空間" );getc;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分配成功!" );getc;}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回收成功!" );getc;}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;}}}總結
以上是生活随笔為你收集整理的操作系统Linux环境下动态分区存储管理的内存分别配回收的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 操作系统进程调度算法(先来先服务,短作业
- 下一篇: docker安装教程(windows和l