¥á¥â¥ê´ÉÍý(¤³¤Îµ»ö¤Ï2008ǯ8·î21Æü¤Ë½Ð¸½¤·¤Þ¤·¤¿)º£¤Î¼ÂÁõ
º£Æü¤ÎÎÁÍý¤È¤ê¤¢¤¨¤º¥á¥â¥ê¤Ï¸Â¤é¤ì¤Æ¤ë¤ó¤À¤·¡¢¥á¥â¥ê´ÉÍý¤ò¤â¤¦¾¯¤·¿¿ÌÌÌܤˤä¤ë¤« ¼º¤ï¤ì¤¿¥á¥â¥ê¡¢¤É¤¦¤¹¤ë¤è¡©¤¢¤ÎÍ̾¤Ê²«ÎÐËܤνéÈǤǸÀ¤¦¤È¤³¤í¤Î189¥Ú¡¼¥¸(9¾Ï4Àá)¤Ëû¤¯
¤³¤³¤Ç¤Õ¤Èµ¿Ì䤬É⤫¤Ó¤Þ¤¹¡£³Î¤«¡ÖºÇ½é¤ÎÊýË¡¡×¤Ï¡Öº£»È¤Ã¤Æ¤ëÀ¨¤¯Â®¤¤ÊýË¡¡×¤è¤ê¥á¥â¥ê¤ò¿©¤¦¤Ï¤º¡¦¡¦¡¦
¤·¤«¤â¤½¤ó¤Ê¼êÈ´¤¤ò½¤Àµ¤·¤Ê¤¯¤Æ¤â¡¢¤ä¤Ã¤Ñ¤êÎΰè¤Î¥µ¥¤¥º¤Ï²ÄÊÑĹ¡£´ÉÍýÍѤο·¤¿¤Ê¹½Â¤ÂΤ¬Æþ¤ëÊݾڤϤ¢¤ê¤Þ¤»¤ó¡£
¤È¤¤¤¦¤³¤È¤Ç¡¢¡Ö¹½Â¤ÂΤΥµ¥¤¥º¤¬¤È¤Æ¤â¾®¤µ¤¤¡×¤È¡ÖÊ£»¨¤Ç¤Ï¤Ê¤¤¡×¡¢¤½¤ì¤Ë¡Ö¼ÂÍÑŪ¤Ê»þ´Ö¤Çư¤¯¡×¤ò struct SinglyLinkedList {
int data; // ³ÊǼ¤·¤Æ¤¤¤ë¥Ç¡¼¥¿
struct SinglyLinkedList *next; // ¼«Ê¬¤ÈƱ¤¸¹½Â¤ÂΤؤΥݥ¤¥ó¥¿
};
struct MEMLIST {
void* addr; // ¼º¤ï¤ì¤¿¶õ¤ÎÎ°è¤Ø¤Î¥¢¥É¥ì¥¹
unsigned int size; // ¤È¤½¤Î¥µ¥¤¥º
struct MEMLIST *next;
};
¤è¤¯¹Í¤¨¤è¤¦¡£¾¯¤·¹Í¤¨¤Æ¤ß¤Æ¤¯¤À¤µ¤¤¡£¤³¤Î¹½Â¤ÂΤϰìÂΤɤ³¤ËÇÛÃÖ¤µ¤ì¤ë»ö¤Ë¤Ê¤ë¤«¤ò¡£ struct MEMLIST {
unsigned int size; // ¼º¤ï¤ì¤¿¶õ¤Îΰè¤Î¥µ¥¤¥º
struct MEMLIST *next;
};
struct MEMMAN {
int frees, maxfrees, lostsize, losts;
struct FREEINFO free[MEMMAN_FREES];
struct MEMLIST *list; // ¥ê¥¹¥È¤ÎÀèÆ¬¤Ø¤Î¥Ý¥¤¥ó¥¿
};
man->list=LIST_END; // ²òÊü¤Ë¼ºÇÔ¤·¤¿Îΰè¤òÉü¸µ¤µ¤»¤ë¤¿¤á¤Î¥Ò¥ó¥È(LIST_END¤Ï¥Ø¥Ã¥À¤«¤É¤³¤«¤ÇÄê¿ô¤È¤·¤ÆÄêµÁ¡£)
#define LIST_END 0
/* ¸å¤í¤Ë¤º¤é¤»¤Ê¤«¤Ã¤¿ */
// ºÇ¤â¾®¤µ¤Ê¶õ¤Îΰè¤òõ¤¹(¤³¤³¤«¤éÄɵ)
unsigned int lostaddr,lostsize;
lostsize=size;// º£³«ÊüÍ׵᤬Í褿ÅÛ¤è¤ê¾®¤µ¤¤ÅÛ¤òõ¤»¤Ð¤¤¤¤¡£
j=-1;
for(i=0;i<MEMMAN_FREES;i++){
if(lostsize>man->free[i].size){
lostsize=man->free[i].size;
j=i;
}
}
if(j==-1){// Í׵ᤵ¤ì¤¿ÅÛ¤¬¼Â¤Ï°ìÈÖ¾®¤µ¤¤ÅÛ¤À¤Ã¤¿
lostaddr=addr;
man->losts++;
man->lostsize+=lostsize;
}else{
lostaddr=man->free[j].addr;
// ºÇ¤â¾®¤µ¤Ê¶õ¤Îΰè¤ò°®¤ê¤Ä¤Ö¤¹
for (i=j;i<MEMMAN_FREES-1;i++) {
man->free[i]=man->free[i+1];
}
man->frees--;
man->losts++;
man->lostsize+=lostsize;
// ºÇ¤â¾®¤µ¤Ê¶õ¤Îΰè¤òÄÙ¤·¤¿Ê¬¡¢´ÉÍýÎΰ褬¶õ¤¤¤¿¤Î¤Çfree²Äǽ¤ÎȦ
memman_free(man,addr,size);
}
// ¤¢¤È¤Ç¥á¥â¥ê¤òÉü³è¤Ç¤¤ë¤è¤¦¤ËºÙ¹©
struct MEMLIST *t;
if(man->list==LIST_END){// ¥ê¥¹¥È¤¬¶õ¤Ê¤é¡¢¤¿¤ÀÄɲ乤ë
man->list=(struct MEMLIST *)lostaddr;// ï¤â»È¤ï¤Ê¤¤Îΰè¤ÎÀèÆ¬Éôʬ
man->list->size=lostsize;
man->list->next=LIST_END;
}else{// ÊÒÊý¸þ¥ê¥¹¥È¤ÎÀèÆ¬¤ËÁÞÆþ¤¹¤ë
t=(struct MEMLIST *)lostaddr;// ï¤â»È¤ï¤Ê¤¤Îΰè¤ÎÀèÆ¬Éôʬ
t->size=lostsize;
t->next=man->list;
man->list=t;
}
void memman_GarbageCollection(struct MEMMAN *man){
if(/* Éü³è¤µ¤»¤ë¤Ù¤¤â¤Î¤¬¤Ê¤¤¤Ê¤é¤Ð */){
return;
}
// ²òÊü¤·¤¿»þ¶õ¤Îΰè¤òÄÙ¤µ¤Ê¤¤¤Ê¤é¡¢²òÊü¤·¤Æ¤¤¤¯(¤³¤Î´Ø¿ô¤Î¼Â¹ÔÃæ¤Ëman->list¤ÎÃæ¿È¤¬ÊѤï¤ë¤È¤ä¤ä¤³¤·¤¤¤Î¤Ç¡£)
while(-1){
if(/* ¥á¥â¥ê´ÉÍýÎΰè¤Ë;͵¤¬¤¢¤ê¡¢¤«¤ÄÉü³è¤µ¤»¤ë¤Ù¤¤â¤Î¤¬¤¢¤ë¤Ê¤é¤Ð */){
/* ¤½¤ì¤ò²òÊü */
}
if(/* ¤â¤·Éü³è¤µ¤»¤ë¤Ù¤¤â¤Î¤¬¤Ê¤¯¤Ê¤Ã¤Æ¤·¤Þ¤Ã¤¿¤Ê¤é¤Ð */) break;
// ¤³¤Î»þÅÀ¤Ç¥á¥â¥ê´ÉÍýÎΰè¤Ë;͵¤Ï¤Ê¤¤¤Ï¤º
if(/* Á°¸å¤É¤Á¤é¤«¤Ç¤Þ¤È¤á¤ë»ö¤¬¤Ç¤¤ë¤â¤Î¤¬¤¢¤ë¤Ê¤é¤Ð */){
/* ¤½¤ì¤ò²òÊü */
}
// Á°¸å¤É¤Á¤é¤«¤Ç¤Þ¤È¤á¤ë»ö¤¬¤Ç¤¤¿»þ¡¢¥á¥â¥ê´ÉÍýÎΰè¤Ë¾¯¤·Í¾Íµ¤¬À¸¤Þ¤ì¤ë¤«¤â¤·¤ì¤Ê¤¤¡£
if(/* ¥á¥â¥ê´ÉÍýÎΰè¤Ë;͵¤¬¤¢¤ê¡¢¤«¤ÄÉü³è¤µ¤»¤ë¤Ù¤¤â¤Î¤¬¤Þ¤À¤¢¤ë¤Ê¤é¤Ð */){
continue;//¤â¤¦°ì¼þ¡£
}else{
break;//¤â¤¦²¿¤â½ÐÍè¤ë»ö¤¬¤Ê¤¤
}
}
return;
}
¤µ¤Æ¼ÂÁõ¤³¤ó¤Ê´¶¤¸¤«¤Ê¡£ void memman_GarbageCollection(struct MEMMAN *man){
struct MEMLIST *t,*k;
if((int)man->list==LIST_END){//Éü³è¤µ¤»¤ë¤Ù¤¤â¤Î¤¬¤Ê¤¤
return;
}
// ²òÊü¤·¤¿»þ¶õ¤Îΰè¤òÄÙ¤µ¤Ê¤¤¤Ê¤é¡¢²òÊü¤·¤Æ¤¤¤¯(¤³¤Î´Ø¿ô¤Î¼Â¹ÔÃæ¤Ëman->list¤ÎÃæ¿È¤¬ÊѤï¤ë¤È¤ä¤ä¤³¤·¤¤¤Î¤Ç¡£)
while(-1){
// ¥á¥â¥ê´ÉÍýÎΰè¤Ë;͵¤¬¤¢¤ê¡¢¤«¤ÄÉü³è¤µ¤»¤ë¤Ù¤¤â¤Î¤¬¤¢¤ë¤Ê¤é¤Ð½ç¼¡²òÊü
while(man->frees<MEMMAN_FREES&&(int)man->list!=LIST_END){
t=man->list;
man->list=t->next;// ²òÊü²Äǽ¤Ê¸ºß¤ò¥ê¥¹¥È¤«¤éºï½ü
memman_free(man,t,t->size);
}
// Éü³è¤µ¤»¤ë¤Ù¤¤â¤Î¤¬¤Ê¤¯¤Ê¤Ã¤¿¤é¥ë¡¼¥×¤òÈ´¤±¤ë
if((int)man->list==LIST_END) break;
// ¥á¥â¥ê´ÉÍýÎΰè¤Ë;͵¤¬¤Ê¤¯¤Æ¤â¡¢Á°¸å¤É¤Á¤é¤«¤Ç¤Þ¤È¤á¤ë»ö¤¬½ÐÍè¤ë¤Ê¤é¤½¤ì¤ò²òÊü
while((int)man->list!=LIST_END){// ÀèÆ¬¤ÏÆÃḚ̂·¤¤
t=man->list;
if(memman_canfree(man,t,t->size)){// ¤Þ¤È¤á¤é¤ì¤ë¤è¤¦¤Ê¾õÂ֤ʤé
man->list=t->next;// ²òÊü²Äǽ¤Ê¸ºß¤ò¥ê¥¹¥È¤«¤éºï½ü
memman_free(man,t,t->size);
}else{
break;
}
}
k=man->list;
while((int)k->next!=LIST_END){
t=k->next;
if(memman_canfree(man,t,t->size)){// ¤Þ¤È¤á¤é¤ì¤ë¤è¤¦¤Ê¾õÂ֤ʤé
k->next=t->next;// ²òÊü²Äǽ¤Ê¸ºß¤ò¥ê¥¹¥È¤«¤éºï½ü
memman_free(man,t,t->size);
}else{
k=k->next;
}
}
// ¤Þ¤È¤á¤ë»ö¤Ë¤è¤Ã¤Æ¥á¥â¥ê´ÉÍýÎΰè¤Ë;͵¤¬½ÐÍè¤Æ¡¢¤«¤ÄÉü³è¤µ¤»¤ë¤Ù¤¤â¤Î¤¬¤Þ¤À¸ºß¤¹¤ë¤Ê¤é¤â¤¦1¼þ
if(man->frees<MEMMAN_FREES&&(int)man->list!=LIST_END){
continue;// ¤â¤¦°ì¼þ¡£
}else{
break;// ¤â¤¦²¿¤â½ÐÍè¤ë»ö¤¬¤Ê¤¤
}
}
return;
}
int memman_canfree(struct MEMMAN *man,void* addr,unsigned int size){// ´û¸¤Î¶õ´Ö¤È¤Þ¤È¤á¤ë»ö¤¬¤Ç¤¤ë¤«¤É¤¦¤«¤òȽÄê
int i;
for(i=0;i<man->frees;i++){
if(man->free[i].addr>addr){
break;
}
}
if(i>0&&man->free[i-1].addr+man->free[i-1].size==addr) return -1;// Á°¤È¤Þ¤È¤á¤é¤ì¤ë
if(i<man->frees&&addr+size==man->free[i].addr) return -1;// ¸å¤í¤È¤Þ¤È¤á¤é¤ì¤ë
return 0;
}
int memman_alloc(struct MEMMAN *man,unsigned int size){
unsigned int i, a;
// ¥µ¥¤¥º¤ò8byteñ°Ì¤ËÀÚ¤ê¾å¤²
size=(size+(8-1))&(-8);
/* (¾Êά) */
return 0; // ¤¢¤¤¬¤Ê¤¤
}
Ãí°Õ»ö¹à(·ü°Æ»ö¹à)¡memman_free¤¹¤ë»þ¤Ë¡¢²¿¤â¹Í¤¨¤º¤Ë¥ê¥¹¥È¤ÎÀèÆ¬¤ËÆþ¤ì¤Æ¤¤¤Ã¤¿¤¿¤á¡¢Î㤨¤Ð¼¡¤Î¤è¤¦¤Ê¾ì¹ç¤Ë¤¦¤Þ¤¯Á´Éô²òÊü¤Ç¤¤Ê¤¤¤«¤â¤·¤ì¤Þ¤»¤ó¡£ ´Ê°×Åêɼ(º£²ó¤Î¥á¥â¥ê´ÉÍý¤Ë´Ø¤¹¤ëµ»ö¤Ë¤Ä¤¤¤Æ¡£)¤É¤ÎÄøÅÙÌò¤ËΩ¤Ã¤¿¡© ÀâÌÀ¤ÏŬÀÚ¡© ¥½¡¼¥¹¥³¡¼¥ÉÃæ¤Î¥³¥á¥ó¥È¤Ï¡© ¤¢¤Î¡Öcdr´Ø¿ô¡×¤ò¤è¤¯»È¤¦¡¢³ç¸ÌÃϹö¤È¤â¸À¤ï¤ì¤ëË¿¸À¸ì¤Ë¤Ä¤¤¤Æ²¿¤«ÃΤäƤ롩 ¥³¥á¥ó¥È
|