最佳適應演算法
① 【高分懸賞】用C/C++語言設計一個適應演算法(最先、最佳或最壞適應演算法)
考的是內存的動態劃分區域內容,很好寫啊
1.可以用數字來模擬內存區域劃分情況,比如建一個100大小的數組(結構為struc (區號,值),值為0表示空閑,值為1表示佔用,初始化幾個已確定佔有的分區,分區一,1-5 佔有,6-12 空閑,。。。。。。。,並建立空閑區域表,很簡單,從頭到尾對數組掃描下就知道了
2.最先適應:從內存開始地址找到第一個大於請求大小的連續空閑區域,如請求5個空間,那就在剛開始6-12空閑處建立分區二 ,6-11 ,佔用
3.最佳適應:指所有空閑塊最適應請求大小的那塊,min(空閑塊大小-請求大小)
4.最壞:指適應請求大小,且最大的那塊空閑區域
② 首次適應演算法,最佳適應演算法和最壞適應演算法怎麼分配資源
首次適應演算法要求空閑分區鏈以空閑分區開始地址遞增的次序鏈接,從鏈首開始順序查找,直至找到一個能滿足程序大小要求的空閑分區為止
最佳適應演算法技能滿足要求,又是最小的空閑分區
最差適應演算法總是找到一個滿足程序長度要求的最大空閑分區
③ 什麼是最優適應分配演算法
分區分配演算法(Partitioning Placement Algorithm) ,共有3種。分別為最佳適應演算法、首次適應演算法、循環首次適應演算法。
1、最佳適應演算法(Best Fit):
它從全部空閑區中找出能滿足作業要求的、且大小最小的空閑分區,這種方法能使碎片盡量小。為適應此演算法,空閑分區表(空閑區鏈)中的空閑分區要按大小從小到大進行排序,自表頭開始查找到第一個滿足要求的自由分區分配。該演算法保留大的空閑區,但造成許多小的空閑區。
2、首次適應演算法(First Fit):
從空閑分區表的第一個表目起查找該表,把最先能夠滿足要求的空閑區分配給作業,這種方法目的在於減少查找時間。為適應這種演算法,空閑分區表(空閑區鏈)中的空閑分區要按地址由低到高進行排序。該演算法優先使用低址部分空閑區,在低址空間造成許多小的空閑區,在高地址空間保留大的空閑區。
3、循環首次適應演算法(Next Fit):
該演算法是首次適應演算法的變種。在分配內存空間時,不再每次從表頭(鏈首)開始查找,而是從上次找到空閑區的下一個空閑開始查找,直到找到第一個能滿足要求的的空閑區為止,並從中劃出一塊與請求大小相等的內存空間分配給作業。該演算法能使內存中的空閑區分布得較均勻。
④ 設計一個實現適應演算法的程序(操作系統)
/**------------------------------------------------------
進入程序後可以根據菜單選項進入不同的模塊
1.使用首次適應演算法分配空間
2.使用最佳適應演算法分配空間
3.釋放一塊空間
4.顯示內存分配情況
5.退出系統
----------------------------------------------------------**/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#define MEMSIZE 100 /*定義內存大小為100*/
#define MINSIZE 2 /*如果小於此值 將不再分割內存*/
typedef struct _MemoryInfomation{/* 內存空間分區表 結構*/
int start; /*起始地址*/
int size; /*大小*/
char info; /*狀態 F:空閑(Free) U:佔用(Used) E 結束(end)*/
}MEMINFO;
MEMINFO MemList[MEMSIZE]; //內存空間信息表
void Display();
/*--------------------------------------------------------
函數名:InitALL()
功 能:初始化所有變數
--------------------------------------------------------*/
void InitAll(){
int i;
MEMINFO temp={0,0,'e'};
for(i=0;i<MEMSIZE;i++) //初始化空間信息表
MemList[i]=temp;
MemList[0].start=0; //起始地址為0
MemList[0].size=MEMSIZE;//空間初始為最大的
MemList[0].info='f'; //狀態為空閑
}
/*--------------------------------------------------------
函數名:FirstFit_new()
功 能:首次適應演算法分配內存
--------------------------------------------------------*/
void FirstFit_new(){
int i,j,size;
char temp[10];
printf("FirstFit_new:How many MEMORY requir?");
gets(temp);
size=atoi(temp); //將字元串轉化為整數
for(i=0; i < MEMSIZE-1 && MemList[i].info != 'e';i++) //到了空間尾且沒有空間分配
{
if(MemList[i].size >= size && MemList[i].info=='f') //滿足所需要的大小,且是空閑空間
{
if(MemList[i].size - size <= MINSIZE) //如果小於規定的最小差則將整個空間分配出去
MemList[i].info='u'; //標志為使用
else
{
for(j = MEMSIZE-2; j > i; j--) //將i後的信息表元素後移
{
MemList[j+1]=MemList[j];
}
//將i分成兩部分,使用低地址部分
MemList[i+1].start= MemList[i].start+size;
MemList[i+1].size = MemList[i].size-size;
MemList[i+1].info='f';
MemList[i].size=size;
MemList[i].info='u';
}
break;
}
}
if(i == MEMSIZE-1 || MemList[i].info=='e') //沒有找到符合分配的空間
{
printf("Not Enough Memory!!\n");
getchar();
}
Display();
}
/*--------------------------------------------------------
函數名:BestFit_new()
功 能:最佳適應演算法分配內存
--------------------------------------------------------*/
void BestFit_new()
{
int i,j,k,flag,size;
char temp[10];
printf("BestFit_new How many MEMORY requir?");
gets(temp);
size=atoi(temp); //將字元串轉化為整數
j=0;
flag=0; //標志是否有合適的空間分配,0無,1有
k=MEMSIZE; //用來保存滿足要求的最小空間
for(i=0;i<MEMSIZE-1 && MemList[i].info!='e';i++)
{
if(MemList[i].size >= size && MemList[i].info == 'f') //符合要求
{
flag=1;
if(MemList[i].size < k) //比符合要求的最小空間小,則交換
{
k=MemList[i].size;
j=i;
}
}
}
i=j;
if(flag == 0) //沒找到
{
printf("Not Enough Memory!\n");
getch();
j=i;
}
else if(MemList[i].size - size <= MINSIZE) //小於規定的最小差,將整個空間分配
MemList[i].info='u';
else
{
for(j = MEMSIZE-2; j > i; j--) //後移
MemList[j+1]=MemList[j];
MemList[i+1].start=MemList[i].start+size;
MemList[i+1].size=MemList[i].size-size;
MemList[i+1].info='f';
MemList[i].size=size;
MemList[i].info='u';
}
Display();
}
/*--------------------------------------------------------
最壞適應演算法
*/
void BadFit_new()
{
int i,j,k,flag,size;
char temp[10];
printf("BadFit_new How many MEMORY requir?");
gets(temp);
size=atoi(temp);
j=0;
flag=0;
k=0; //保存滿足要求的最大空間
for(i=0;i<MEMSIZE-1&&MemList[i].info!='e';i++)
{
if(MemList[i].size>=size&&MemList[i].info=='f')
{
flag=1;
if(MemList[i].size>k)
{
k=MemList[i].size;
j=i;
}
}
}
i=j;
if(flag=0)
{
printf("Not Enough Memory!\n");
getch();
j=i;
}
else if(MemList[i].size-size<=MINSIZE)
MemList[i].info='u';
else
{
for(j=MEMSIZE-2;j>i;j--)
MemList[j+1]=MemList[j];
MemList[i+1].start=MemList[i].start+size;
MemList[i+1].size=MemList[i].size-size;
MemList[i+1].info='f';
MemList[i].size=size;
MemList[i].info='u';
}
Display();
}
/*--------------------------------------------------------
函數名:del()
功 能:釋放一塊內存
--------------------------------------------------------*/
void del()
{
int i,number;
char temp[10];
printf("\nplease input the NUMBER you want stop:");
gets(temp);
number=atoi(temp);
if(MemList[number].info == 'u') //輸入的空間是使用的
{
MemList[number].info = 'f'; //標志為空閑
if(MemList[number+1].info == 'f') //右空間為空則合並
{
MemList[number].size+=MemList[number+1].size; //大小合並
for(i=number+1;i < MEMSIZE-1 && MemList[i].info !='e';i++)/* i後的空間信息表元素前移 */
if(i>0)
MemList[i]=MemList[i+1];
}
if(number > 0 && MemList[number-1].info=='f') //左空間空閑則合並
{
MemList[number-1].size+=MemList[number].size;
for(i=number;i<MEMSIZE-1&&MemList[i].info!='e';i++)
MemList[i]=MemList[i+1];
}
}
else
{
printf("Thist Number is Not exist or is Not used!\n ");
getchar();
}
Display();
}
/*--------------------------------------------------------
函數名:Display()
功 能:顯示內存狀態
--------------------------------------------------------*/
void Display(){
int i,
used=0; //記錄可以使用的總空間量
/* clrscr();*/
printf("\n----------------------------------------------\n");
printf("%5s%15s%15s","Number","start","size","Info");
printf("\n----------------------------------------------\n");
for(i=0;i < MEMSIZE && MemList[i].info != 'e';i++)
{
if(MemList[i].info == 'u')
used+=MemList[i].size;
printf("%5d%15d%15d%15s\n",i,MemList[i].start,MemList[i].size,MemList[i].info=='u'?"USED":"FREE");
}
printf("\n----------------------------------------------\n");
printf("Totalsize:%-10d Used:%-10d Free:%-10d\n",MEMSIZE,used,MEMSIZE-used);
printf("\n\n Press Any Key to return...");
getch();
}
/*--------------------------------------------------------
函數名:main()
功 能:主函數
--------------------------------------------------------*/
void main(){
char ch;
InitAll();
while(1){
printf("========================================================\n");
printf(" 1.Get a block use the FISTFIT method\n");
printf(" 2.Get a block use the BESTFIT method\n");
printf(" 3.Get a block use the BadFIT method\n");
printf(" 4.Free a block\n");
printf(" 5.Display Mem info \n");
printf(" 6.Exit \n");
printf("========================================================\n");
ch=getch();
switch(ch){
case '1':FirstFit_new();break; //首次適應演算法
case '2':BestFit_new();break; //最佳適應演算法
case '3':BadFit_new();break; //最壞適應演算法
case '4':del();break; //刪除已經使用完畢的空間
case '5':Display();break; //顯示內存分配情況
case '6':exit(0);
}
}
}
求採納!!!
⑤ 採用首次適應演算法和最優置換演算法,對內存的分配和回收速度會造成什麼不同的影響
首次適應分配演算法(FF):
對空閑分區表記錄的要求是按地址遞增的順序排列的,每次分配時,總是從第1條記錄開始順序查找空閑分區表,找到第一個能滿足作業長度要求的空閑區,分割這個空閑區,一部分分配給作業,另一部分仍為空閑區。
最佳置換演算法(OPT):
選擇以後永不使用或在最長時間內不再被訪問的內存頁面予以淘汰。
⑥ 最先適應,下次適應,最佳和私營,最壞適應四種分配演算法中,哪一種更適合固定分區存儲管理系統為什麼
固定分區存儲管理系統適合採用最佳適應演算法。因為,此演算法所產生的內碎片最少。
這里還要介紹一下下次適應演算法。下次適應(next fit)演算法也稱「臨近適應」演算法,其工作方式和最先適應演算法相同(最先適應也稱首次適應演算法。它總是最先找到的、滿足存儲要求的那個空閑分區作為分配對象。),不同的是每次找到合適的空閑的分區時就記住它的位置,以便下次就從該位置開始往下查找,而不是每次都像最先適應演算法那樣從頭開始查找。但是這種演算法的總體結果通常要比最先適應演算法差。由於它經常會在內存的末尾分配存儲分區,使位於存儲空間末尾的最大分區被撕裂成小的外部碎片,因此必須經常不斷地進行存儲緊湊。在該演算法中應採取循環查找方式,即最後上個空閑區的大小仍不能滿足要求時,應再從第一個空閑區開始查找,故又稱為循環造就演算法
⑦ 最佳適應演算法的空白區一般是按照 ( )排列。
按大小遞增順序排列。
最佳適應演算法是從全部空閑區中找出能滿足作業要求的、且大小最小的空閑分區的一種計算方法,這種方法能使碎片盡量小。
最佳適應演算法(Best Fit):
它從全部空閑區中找出能滿足作業要求的、且大小最小的空閑分區,這種方法能使碎片盡量小。為適應此演算法,空閑分區表(空閑區鏈)中的空閑分區要按從小到大進行排序,自表頭開始查找到第一個滿足要求的自由分區分配。該演算法保留大的空閑區,但造成許多小的空閑區。
⑧ 內存狀態分區管理中最佳適應演算法的空白區是
實驗五 內存分區管理實驗
一、單項選擇題(共5題,每題10分,共50分)
1、最佳適應演算法的空白區是__B__.
A.按大小遞減順序連在一起 B.按大小遞增順序連在一起
C.按地址由小到大排列 D.按地址由大到小排序
2、在固定分區分配中,每個分區的大小是__C__.
A.相同 B.隨作業長度變化
C.可以不同但預先固定 D.可以不同但根據作業長度固定
3、採用__B__不會產生內部碎片.
A.分頁式存儲管理 B.分段式存儲管理
C.固定分區式存儲管理 D.段頁式存儲管理
4、在可變式分區存儲管理中的拼接技術可以_A___.A.集中空閑區 B.增加內存容量
C.縮短訪問周期 D.加速地址轉換
5、採用分段存儲管理的系統中,若地址用24位表示,其中8位表示段號,則允許每段的最大長度是_B___.
二、填空題(共4題,每題5分,共20分)
1、在分區分配演算法中,首次適應演算法傾向於優先利用內存中的_低地址___部分的空閑分區,從而保留了__高地址__部分的大空閑區.
2、在可變分區存儲管理中,分區的保護通常採用_地址越界___和__非法操作__兩種方法.
3、3、採用交換技術獲得的好處是以犧牲_增大系統開銷___為代價的.
4、在採用請求分頁式存儲管理的系統中,地址變換過程可能會因為_缺頁___、_越界___和_訪問許可權錯誤___等原因而產生中斷.
三、 簡答題(共2題,每題15分,共30分) 1、可採用哪幾種方式將程序裝入內存?它們分別適用於何種場合?
a.首先由編譯程序將用戶源代碼編譯成若干目標模塊,再由鏈接程序將編譯後形成的目標模塊和所需的
---庫函數鏈接在一起,組成一個裝入模塊,再由裝入程序將裝入模塊裝入內存;
b.裝入模塊的方式有:絕對裝入方式,可重定位方式和動態運行時裝入方式;
c.絕對裝入方式適用於單道程序環境下;
d.可重定位方式適用於多道程序環境下;
e.動態運行時裝入方式也適用於多道程序環境下.
2、何謂靜態鏈接?何謂裝入時動態鏈接和運行時的動態鏈接?
a.靜態鏈接是指事先進行鏈接形成一個完整的裝入模塊,以後不再拆開的鏈接方---式;
b.裝入時動態鏈接是指目標模塊在裝入內存時,邊裝入邊鏈接的鏈接方式;
c.運行時的動態鏈接是將某些目標模塊的鏈接推遲到執行時才進行.
⑨ 設內存的分配情況如表所示。若要申請一塊40KB位元組的內存空間,採用最佳適應演算法,則所得到的分區首址
最佳適應演算法(Best Fit):
它從全部空閑區中找出能滿足作業要求的、且大小最小的空閑分區,這種方法能使碎片盡量小
所以正確答案顯然應該是 C 330KB