ºÃÎĵµ - רҵÎÄÊéд×÷·¶ÎÄ·þÎñ×ÊÁÏ·ÖÏíÍøÕ¾

ʵÑéÈý ²Ù×÷ϵͳ - ÐéÄâ´æ´¢¹ÜÀí - ͼÎÄ

ÓÉ ÌìÏ ·ÖÏí ʱ¼ä£º ¼ÓÈëÊÕ²Ø ÎÒҪͶ¸å µãÔÞ

ʵÑéÈý ÐéÄâ´æ´¢¹ÜÀíÀí

?Ò»¡¢ÊµÑé?Ä¿µÄ

´æ´¢¹ÜÀíÀíµÄÖ÷Òª¹¦ÄÜÖ®?Ò»ÊǺÏÀíÀíµÄ·ÖÅä¿Õ¼ä¡£ÇëÇó?ҳʽ¹ÜÀíÀíÊÇ?Ò»ÖÖ³£?ÓõÄÐéÄâ´æ´¢¹ÜÀíÀí¼¼Êõ¡£±¾ÊµÑéµÄ?Ä¿µÄÊÇÇëÇó?ҳʽ´æ´¢¹ÜÀíÀíÖÐ?Ò³?ÃæÖû»Ë㷨ģÄâÉè¼Æ£¬ÁËÁ˽âÐéÄâ´æ´¢¼¼ÊõµÄÌص㣬ÕÆÎÕÇëÇó?ҳʽ´æ´¢¹ÜÀíÀíµÄ?Ò³?ÃæÖû»?·½·¨¡£

?¶þ¡¢ÊµÑéÔ­ÀíÀí

Éè¼Æ³ÌÐòÄ£ÄâÄÚ´æ?Ê×´ÎÊÊÓ¦Ëã·¨£¬×î¼ÑÊÊÓ¦Ëã·¨ºÍ×î²îÊÊÓ¦Ëã·¨µÄ?¹¤×÷¹ý³Ì¡£

Èý¡¢ÊµÑéÒªÇó

´æ·ÖÅäËã·¨µÄ¹ý³Ì£»

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#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;

ʵÑéÈý ²Ù×÷ϵͳ - ÐéÄâ´æ´¢¹ÜÀí - ͼÎÄ

ʵÑéÈýÐéÄâ´æ´¢¹ÜÀíÀí?Ò»¡¢ÊµÑé?Ä¿µÄ´æ´¢¹ÜÀíÀíµÄÖ÷Òª¹¦ÄÜÖ®?Ò»ÊǺÏÀíÀíµÄ·ÖÅä¿Õ¼ä¡£ÇëÇó?ҳʽ¹ÜÀíÀíÊÇ?Ò»ÖÖ³£?ÓõÄÐéÄâ´æ´¢¹ÜÀíÀí¼¼Êõ¡£±¾ÊµÑéµÄ?Ä¿µÄÊÇÇëÇó?ҳʽ´æ´¢¹ÜÀíÀíÖÐ?Ò³?ÃæÖû»Ë㷨ģÄâÉè¼Æ£¬ÁËÁ˽âÐéÄâ´æ´¢¼¼ÊõµÄÌص㣬ÕÆÎÕÇëÇó?ҳʽ´æ´¢¹ÜÀíÀíµÄ?Ò³?ÃæÖû»?·½·¨¡£?¶þ¡¢ÊµÑéÔ­ÀíÀíÉè¼Æ³ÌÐòÄ£ÄâÄÚ´æ?
ÍƼö¶È£º
µã»÷ÏÂÔØÎĵµÎĵµÎªdoc¸ñʽ
0rjo63kpil4i6jo0x1m776vac3ljqt012ey
ÁìÈ¡¸£Àû

΢ÐÅɨÂëÁìÈ¡¸£Àû

΢ÐÅɨÂë·ÖÏí