Скачиваний:
13
Добавлен:
01.05.2014
Размер:
3.82 Кб
Скачать
 
int has_initialized = 0;
void *managed_memory_start;
void *last_valid_address;


// жХОЛГЙС ЙОЙГЙБМЙЪБГЙЙ БММПЛБФПТБ

/* рПДЛМАЮБЕН ЖХОЛГЙА sbrk */
#include <unistd.h>
void malloc_init()
{
/* чЩФБУЛЙЧБЕН РПУМЕДОЙК ЧБМЙДОЩК БДТЕУУ ЙЪ пу */
last_valid_address = sbrk(0);
/* рПЛБ Х ОБУ ЕЭЕ ОЕФ РБНСФЙ ДМС ХРТБЧМЕОЙС, РПЬФПНХ РТПУФП ХУФБОБЧМЙЧБЕН ОБЮБМП ОБ last_valid_address
*/
managed_memory_start = last_valid_address;
/* НЩ ЧУЕ РТПЙОЙГЙБМЙЪЙТПЧБМЙ Й ЗПФПЧЩ РТПДПМЦБФШ */
has_initialized = 1;
}



struct mem_control_block {
int is_available;
int size;
};


void free(void *firstbyte) {
struct mem_control_block *mcb;
/* рП РПМХЮЕООПНХ ХЛБЪБФЕМА ОБИПДЙН mem_control_block Й ЧПУУФБОБЧМЙЧБЕН УФТХЛФХТХ
*/
mcb = firstbyte - sizeof(struct mem_control_block);
/* рПНЕЮБЕН ВМПЛ ЛБЛ ДПУФХРОЩК (УЧПВПДОЩК) */
mcb->is_available = 1;
/* чПФ Й ЧУЕ! нЩ ЪБЛПОЮЙМЙ. */
return;
}


void *malloc(long numbytes) {
/* ъБРПНЙОБЕН ФЕЛХЭХА ПВМБУФШ РБНСФЙ, ЗДЕ НЩ ЙЭЕН */
void *current_location;
/* ьФП ФПЦЕ УБНПЕ, ЮФП Й current_location, ОП ТБУРПМБЗБЕФУС ЧЩЫЕ ОБ ЧЕМЙЮЙОХ memory_control_block */
struct mem_control_block *current_location_mcb;
/* ьФП НЕУФП РБНСФЙ НЩ ЧЕТОЕН. пОП ВХДЕФ ХУФБОПЧМЕОП Ч 0, РПЛБ НЩ ОЕ ОБКДЕН РПДИПДСЭЕЗП ТБЪНЕТБ РБНСФЙ Ч ДПУФХРОПК ПВМБУФЙ */
void *memory_location;
/* йОЙГЙБМЙЪЙТХЕНУС, ЕУМЙ НЩ ЕЭЕ ЬФПЗП ОЕ УДЕМБМЙ */
if(! has_initialized) {
malloc_init();
}
/* рБНСФШ, ЛПФПТХА НЩ ЙЭЕН, ДПМЦОБ ЧЛМАЮБФШ РБНСФШ ДМС ИТБОЕОЙС ВМПЛБ ХРТБЧМЕОЙС РБНСФША (memory control block), ОП РПМШЪПЧБФЕМСН ЖХОЛГЙЙ malloc ОЕ ПВСЪБФЕМШОП ЪОБФШ ПВ ЬФПН, РПЬФПНХ НЩ РТПУФП УЛТЩЧБЕН ЬФП ПФ ОЙИ.*/
numbytes = numbytes + sizeof(struct mem_control_block);
/* хУФБОБЧМЙЧБЕН ЪОБЮЕОЙЕ memory_location Ч 0, РПЛБ НЩ ОЕ ОБКДЕН РПДИПДСЭЕЗП НЕУФБ (ЛХУЛБ Ч РБНСФЙ)*/
memory_location = 0;
/* оБЮЙОБЕН ЙУЛБФШ У ОБЮБМБ ХРТБЧМСЕНПК РБНСФЙ. */
current_location = managed_memory_start;
/* рТПДПМЦБЕН ЬФП ДЕМБФШ, РПЛБ ОЕ РТПУНПФТЙН ЧУЕ ДПУФХРОПЕ РТПУФТБОУФЧП */
while(current_location != last_valid_address)
{
/* current_location Й current_location_mcb ХЛБЪЩЧБАФ ОБ ПДЙО Й ФПФ ЦЕ БДТЕУ. фБЛ ЛБЛ current_location_mcb ЙНЕЕФ УППФЧЕФУФЧХАЭЙК ФЙР, ФП НЩ НПЦЕН ЕЗП ЙУРПМШЪПЧБФШ Ч ЛБЮЕУФЧЕ УФТХЛФХТЩ. current_location ЬФП УЧПВПДОЩК ХЛБЪБФЕМШ (void pointer), РПЬФПНХ НЩ НПЦЕН ЕЗП ЙУРПМШЪПЧБФШ, ЮФПВЩ РТПУЮЙФБФШ БДТЕУБГЙА. */
current_location_mcb =
(struct mem_control_block *)current_location;
if(current_location_mcb->is_available)
{
if(current_location_mcb->size >= numbytes)
{
/* нЩ ОБЫМЙ ПФЛТЩФПЕ (ОЕ ЪБОСФПЕ) НЕУФП РПДИПДСЭЕЗП ТБЪНЕТБ.*/
/* ФЕРЕТШ ПОП ВПМШЫЕ ОЕ УЧПВПДОП */
current_location_mcb->is_available = 0;
/* фЕРЕТШ НЩ ЕЗП ЧМБДЕМШГЩ */
memory_location = current_location;
/* чЩИПДЙН ЙЪ ГЙЛМБ */
break;
}
}
/* фБЛ ЛБЛ фЕЛХЭЙК ВМПЛ РБНСФЙ ОЕ РПДИПДЙФ, ФП РЕТЕИПДЙН ДБМШЫЕ */
current_location = current_location +
current_location_mcb->size;
}
/* еУМЙ ОБН ЧУЕ ЕЭЕ ОЕ ХДБМПУШ ОБКФЙ РПДИПДСЭЕЕ НЕУФП Ч РБНСФЙ, ФП НЩ РТПУЙН Х ПРЕТБГЙПООПК УЙУФЕНЩ ЕЭЕ РБНСФЙ */
if(! memory_location)
{
/* уДЧЙЗБЕН ЗТБОЙГХ ОБ ЪБДБООПЕ ЮЙУМП ВБКФ ЧЧЕТИ */
sbrk(numbytes);
/* оПЧБС РБНСФШ ВХДЕФ ОБИПДЙФУС Ч НЕУФЕ, ЗДЕ ТБОШЫЕ ОБИПДЙМУС РПУМЕДОЙК ЧБМЙДОЩК БДТЕУ (РПУМЕ ЧЩДЕМЕОЙС ОПЧПК РБНСФЙ ПО УНЕУФЙМУС). */
memory_location = last_valid_address;
/* нЩ УДЧЙЗБЕН ЪОБЮЕОЙЕ РПУМЕДОЕЗП ЧБМЙДОПЗП БДТЕУБ ОБ numbytes ВБКФ. */
last_valid_address = last_valid_address + numbytes;
/* фЕРЕТШ ОХЦОП ЙОЙГЙБМЙЪЙТПЧБФШ mem_control_block */
current_location_mcb = memory_location;
current_location_mcb->is_available = 0;
current_location_mcb->size = numbytes;
}
/* фЕРЕТШ, Ч МАВПН УМХЮБЕ (ОХ ЪБ ЙУЛМАЮЕОЙЕН, УПУФПСОЙС ПЫЙВЛЙ), memory_location БДТЕУХЕФ РБНСФШ, ЧЛМАЮБС ВМПЛ mem_control_block */
/* рЕТЕДЧЙЗБЕН ХЛБЪБФЕМШ ОБЪБД ОБ ТБЪНЕТ УФТХЛФХТЩ mem_control_block */
memory_location = memory_location + sizeof(struct mem_control_block);
/* чПЪЧТБЭБЕН ХЛБЪБФЕМШ */
return memory_location;
}
Соседние файлы в папке Лабораторная работа №36