ʵÑéÈý ÐéÄâ´æ´¢¹ÜÀíÀí
?Ò»¡¢ÊµÑé?Ä¿µÄ
´æ´¢¹ÜÀíÀíµÄÖ÷Òª¹¦ÄÜÖ®?Ò»ÊǺÏÀíÀíµÄ·ÖÅä¿Õ¼ä¡£ÇëÇó?ҳʽ¹ÜÀíÀíÊÇ?Ò»ÖÖ³£?ÓõÄÐéÄâ´æ´¢¹ÜÀíÀí¼¼Êõ¡£±¾ÊµÑéµÄ?Ä¿µÄÊÇÇëÇó?ҳʽ´æ´¢¹ÜÀíÀíÖÐ?Ò³?ÃæÖû»Ë㷨ģÄâÉè¼Æ£¬ÁËÁ˽âÐéÄâ´æ´¢¼¼ÊõµÄÌص㣬ÕÆÎÕÇëÇó?ҳʽ´æ´¢¹ÜÀíÀíµÄ?Ò³?ÃæÖû»?·½·¨¡£
?¶þ¡¢ÊµÑéÔÀíÀí
Éè¼Æ³ÌÐòÄ£ÄâÄÚ´æ?Ê×´ÎÊÊÓ¦Ëã·¨£¬×î¼ÑÊÊÓ¦Ëã·¨ºÍ×î²îÊÊÓ¦Ëã·¨µÄ?¹¤×÷¹ý³Ì¡£
Èý¡¢ÊµÑéÒªÇó
´æ·ÖÅäËã·¨µÄ¹ý³Ì£»
2. ÉÏ»úʱ¶À?Á¢±à³Ì¡¢µ÷ÊÔ³ÌÐò£»3. ¸ù¾Ý¾ßÌåʵÑéÒªÇó£¬Íê³ÉºÃʵÑ鱨¸æ¡£
1. ÉÏ»úÇ°ÈÏÕ渴ϰ?Ò³?ÃæÖû»Ëã·¨£¬ÊìϤÄÚ´æ?Ê×´ÎÊÊÓ¦Ëã·¨£¬×î¼ÑÊÊÓ¦Ëã·¨ºÍ×î²îÊÊÓ¦Ëã·¨ÈýÖÖÄÚ
ËÄ¡¢ÊµÑé´úÂë·ÖÎö
First_fit ¡ª ?Ê×´ÎÊÊÓ¦Ëã·¨
123456789101112131415161718
Status First_fit(int request) { //ΪÉêÇë×÷Òµ¿ª±ÙпռäÇÒ³õʼ»¯
DuLinkList temp = (DuLinkList) malloc(sizeof(DuLNode)); temp->data.size = request; temp->data.state = Busy;
DuLNode *p = block_first->next; while (p) {
if (p->data.state == Free && p->data.size == request) {//ÓÐ?´ó?СǡºÃºÏÊʵĿÕÏпé
p->data.state = Busy; return OK; break; }
if (p->data.state == Free && p->data.size > request) {//ÓпÕÏпéÄÜÂú?×ãÐèÇóÇÒÓÐÊ£Óà
temp->prior = p->prior; temp->next = p;
temp->data.address = p->data.address; p->prior->next = temp;
19202122232425262728
p->prior = temp;
p->data.address = temp->data.address + temp->data.size; p->data.size -= request; return OK; break; }
p = p->next; }
return ERROR;}
Best_fit ¡ª ×î¼ÑÊÊÓ¦Ëã·¨
1234567891011121314151617181920212223242526272829303132333435
Status Best_fit(int request) { int ch; //¼Ç¼×î?СʣÓà¿Õ¼ä
DuLinkList temp = (DuLinkList) malloc(sizeof(DuLNode)); temp->data.size = request; temp->data.state = Busy;
DuLNode *p = block_first->next; DuLNode *q = NULL; //¼Ç¼×î¼Ñ²å?ÈëλÖÃ
while (p) //³õʼ»¯×î?С¿Õ¼äºÍ×î¼ÑλÖà {
if (p->data.state == Free && (p->data.size >= request)) { if (q == NULL) { q = p;
ch = p->data.size - request;
} else if (q->data.size > p->data.size) { q = p;
ch = p->data.size - request; } }
p = p->next; }
if (q == NULL) return ERROR;//ûÓÐÕÒµ½¿ÕÏпé else if (q->data.size == request) { q->data.state = Busy; return OK; } else {
temp->prior = q->prior; temp->next = q;
temp->data.address = q->data.address; q->prior->next = temp; q->prior = temp;
q->data.address += request; q->data.size = ch; return OK;
363738
}
return OK;}
Worst_fit ¡ª ×î²îÊÊÓ¦Ëã·¨
1234567891011121314151617181920212223242526272829303132333435363738
Status Worst_fit(int request) { int ch; //¼Ç¼×î?´óÊ£Óà¿Õ¼ä
DuLinkList temp = (DuLinkList) malloc(sizeof(DuLNode)); temp->data.size = request; temp->data.state = Busy;
DuLNode *p = block_first->next; DuLNode *q = NULL; //¼Ç¼×î¼Ñ²å?ÈëλÖÃ
while (p) //³õʼ»¯×î?´ó¿Õ¼äºÍ×î¼ÑλÖà {
if (p->data.state == Free && (p->data.size >= request)) { if (q == NULL) { q = p;
ch = p->data.size - request;
} else if (q->data.size < p->data.size) { q = p;
ch = p->data.size - request; } }
p = p->next; }
if (q == NULL) return ERROR;//ûÓÐÕÒµ½¿ÕÏпé else if (q->data.size == request) { q->data.state = Busy; return OK; } else {
temp->prior = q->prior; temp->next = q;
temp->data.address = q->data.address; q->prior->next = temp; q->prior = temp;
q->data.address += request; q->data.size = ch; return OK; }
return OK;}
Î塢ʵÑé½á¹û
¸½£ºÊµÑéÔ´Âë
Memory_Allocation.cpp
123456789101112131415161718192021222324252627
//
// Created by Plusirin on 2020/5/30.//
#include
using namespace std;
#define Free 0 //¿ÕÏÐ״̬#define Busy 1 //ÒÑ?ÓÃ״̬#define OK 1 //Íê³É#define ERROR 0 //³ö´í
#define MAX_length 640 //×î?´óÄÚ´æ¿Õ¼äΪ640KBtypedef int Status;int flag;
typedef struct freearea//¶¨Òå?Ò»¸ö¿ÕÏÐÇø˵Ã÷±í½á¹¹{
long size; //·ÖÇø?´ó?С long address; //·ÖÇøµØÖ· int state; //״̬} ElemType;
// ÏßÐÔ±íµÄË«ÏòÁ´±í´æ´¢½á¹¹typedef struct DuLNode { ElemType data;
28293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
struct DuLNode *prior; //Ç°Ç÷Ö¸Õë struct DuLNode *next; //ºó¼ÌÖ¸Õë}
DuLNode, *DuLinkList;
DuLinkList block_first; //Í·½áµãDuLinkList block_last; //β½áµãStatus alloc(int);//ÄÚ´æ·ÖÅäStatus free(int); //ÄÚ´æ»ØÊÕ
Status First_fit(int);//?Ê×´ÎÊÊÓ¦Ëã·¨Status Best_fit(int); //×î¼ÑÊÊÓ¦Ëã·¨Status Worst_fit(int); //×î²îÊÊÓ¦Ëã·¨void show();//²é¿´·ÖÅä
Status Initblock();//¿ª´´¿Õ¼ä±í
Status Initblock()//¿ª´´´øÍ·½áµãµÄÄÚ´æ¿Õ¼äÁ´±í{
block_first = (DuLinkList) malloc(sizeof(DuLNode)); block_last = (DuLinkList) malloc(sizeof(DuLNode)); block_first->prior = NULL; block_first->next = block_last; block_last->prior = block_first; block_last->next = NULL; block_last->data.address = 0; block_last->data.size = MAX_length; block_last->data.state = Free; return OK;}
//·ÖÅäÖ÷´æ
Status alloc(int ch) { int request = 0;
cout << \ÇëÊä?ÈëÐèÒª·ÖÅäµÄÖ÷´æ?´ó?С(µ¥Î»:KB)£º\; cin >> request;
if (request < 0 || request == 0) {
cout << \·ÖÅä?´ó?С²»²»ºÏÊÊ£¬ÇëÖØÊÔ£¡\ << endl; return ERROR; }
if (ch == 2) //Ñ¡Ôñ×î¼ÑÊÊÓ¦Ëã·¨ {
if (Best_fit(request) == OK) cout << \·ÖÅä³É¹¦£¡\ << endl; else cout << \ÄÚ´æ²»²»?×㣬·ÖÅäʧ°Ü£¡\ << endl; return OK; }
if (ch == 3) //Ñ¡Ôñ×î²îÊÊÓ¦Ëã·¨ {
if (Worst_fit(request) == OK) cout << \·ÖÅä³É¹¦£¡\ << endl; else cout << \ÄÚ´æ²»²»?×㣬·ÖÅäʧ°Ü£¡\ << endl;
ʵÑéÈý ²Ù×÷ϵͳ - ÐéÄâ´æ´¢¹ÜÀí - ͼÎÄ



