semTake(semSynStart,WAIT_FOREVER); FOREVER { }
return (OK); }
/* timer(id)向客户端定时发送的定时器*/ STATUS timer(int id) {
……
semTake(semSynStart,WAIT_FOREVER); FOREVER { }
/*client(id)向服务器任务发请求消息*/ STATUS client(int id) {
……
semTake(semSynStart,WAIT_FOREVER); FOREVER { }
return (OK); }
4. 体现前次实验中实现的自定义内存管理机制,最大限度降低外部碎片对系统可靠性的威胁。
静态内存的数据结构为单链表,采用头插法,申请内存时,修改firstavailable另
其指向第二块,将firstavailable指向的头块取出,回收内存时,将回收的块的
frontBlock指向第一块,修改firstavailable另其指向回收的块,将回收的块作为第一块,数据结构如下所示:
……
……
}
return (OK);
……
poolpoolHeadnextfirstavailable blockHeadfrontBlockblockHeadfrontBlockblockHeadfrontBlockblockHeadpoolHeadfirstavailableblockHeadfrontBlockblockHeadfrontBlockblockHeadfrontBlockblockHead 静态分配了含有32个16B块的内存池和含有16个256B块的内存池,如果申请的内存大于256B,调用系统malloc。
/*initial() 初始化内存池*/ pool* initial(void) { int i; pool* mem; pool* poolPtr; poolHead* poolHeadPtr; blockHead* blockHeadPtr;
mem=(pool*)malloc(6000);/*分配6000B内存作为内存池*/
/*初始化pool*/ poolPtr = (pool*)mem; poolPtr->poolNum = 2;
poolPtr->pool = (poolHead*)((char*)mem + sizeof(pool)); /*pool指向申请内存区尾*/
/*初始化pool 1 该内存池分配大小为16B的内存*/
poolHeadPtr = (poolHead*)((char*)mem + sizeof(pool));/*初始化内存池的首地址*/
poolHeadPtr->available = 32; /*初始化可用块数32*/ poolHeadPtr->blockSize = 16; /*块大小16B*/
blockHeadPtr = (blockHead*)((char*)poolHeadPtr+sizeof(poolHead)); 初始化块的首地址*/
poolHeadPtr->firstavailable = blockHeadPtr; /*初始化第一块可用块的地址*/ poolHeadPtr->next= (poolHead*)((char*)poolHeadPtr + sizeof(poolHeadPtr)
/*
+ 32*(sizeof(blockHead)+16)); /*next指向第二个内存池 */
blockHeadPtr->poolId =1; blockHeadPtr->frontBlock = 0;
for(i=1;i<32;i++) /*将该内存池划分为32个容量16B的内存块*/ { 址*/
}
/*初始化pool 2 该内存池分配大小为256B的内存*/ poolHeadPtr = poolHeadPtr->next;
poolHeadPtr->available = 16; /*初始化可用块数16*/ poolHeadPtr->blockSize = 256; /*块大小256*/
blockHeadPtr = (blockHead*)((char*)poolHeadPtr+sizeof(poolHead));
poolHeadPtr->firstavailable = blockHeadPtr; poolHeadPtr->next = 0;
blockHeadPtr->poolId =2; blockHeadPtr->frontBlock = 0;
for(i=1;i<16;i++) /*将该内存池划分为16个容量256B的内存块*/ { }
return (pool*)mem; }
blockHeadPtr=(blockHead*)((char*)blockHeadPtr +
blockHeadPtr->poolId = 2; /* pool号为2,表示他是256B容量的*/ blockHeadPtr->frontBlock = poolHeadPtr->firstavailable; poolHeadPtr->firstavailable = blockHeadPtr;
(sizeof(blockHead)+256));
blockHeadPtr=(blockHead*)((char*)blockHeadPtr +
blockHeadPtr->poolId = 1; /* pool号为1,表示他是16B容量的*/ blockHeadPtr->frontBlock = poolHeadPtr->firstavailable; /* 当前首poolHeadPtr->firstavailable = blockHeadPtr; /* 求下一首个可用块地
(sizeof(blockHead)+16)); /*块的首址移动16加结构体的开销长度*/
个可用块地址赋给frontBlock */
/*memMalloc() 分配内存*/ void* memMalloc(int Size) {
void* mem;
poolHead* poolHeadPtr; blockHead* blockHeadPtr;
semTake(semMalloc,WAIT_FOREVER);
poolHeadPtr = initialPtr->pool;
if((Size <= 16)&&(poolHeadPtr->available != 0)) /*长度小于16时,分配长度为16的内存空间*/
{
blockHeadPtr = poolHeadPtr->firstavailable; /*首个可用块地址赋给poolHeadPtr->firstavailable = blockHeadPtr->frontBlock; /*改变下poolHeadPtr->available --; /*可用块数减一*/ semGive(semMalloc);
分配块的首地址*/ 一第一可用块的地址*/
return (void*)((char*)blockHeadPtr + sizeof(blockHead)); /*分配内存时加入块头开销*/
}
else if((Size <= 256)&&((poolHeadPtr->next)->available != 0)) { } else {
printf(\
/*其他情况用系统的内存分配函数malloc分配*/
blockHeadPtr = (poolHeadPtr->next)->firstavailable;
(poolHeadPtr->next)->firstavailable = blockHeadPtr->frontBlock; (poolHeadPtr->next)->available --; semGive(semMalloc);
return (void*)((char*)blockHeadPtr + sizeof(blockHead)); /*长度大于16小于256时,分配长度为256的内存空间*/
exhausted \\n\
} }
/*memFree() 释放内存空间*/ void memFree(void* dataPtr) {
char* mem= (char*) dataPtr; poolHead* poolHeadPtr; blockHead* blockHeadPtr;
semTake(semFree,WAIT_FOREVER);
poolHeadPtr = initialPtr->pool; /*恢复内存池首址*/
blockHeadPtr = (blockHead*)((char*)mem - sizeof(blockHead)); /*恢复内存块首址*/
if(blockHeadPtr->poolId == 1) /*释放16B的内存块*/ { */
}
else if(blockHeadPtr->poolId == 2)/*释放256B的内存块*/ { }
else /*释放由系统分配的内存块*/
blockHeadPtr->frontBlock = (poolHeadPtr->next)->firstavailable; (poolHeadPtr->next)->firstavailable = blockHeadPtr; (poolHeadPtr->next)->available ++; poolHeadPtr->available++; /*恢复可用块数*/
blockHeadPtr->frontBlock = poolHeadPtr->firstavailable; /*恢复poolHeadPtr->firstavailable = blockHeadPtr; /*恢复第一可用块地址
frontBlock地址*/
mem = malloc(Size); /*采用系统函数malloc()分配内存*/ blockHeadPtr = (blockHead*)mem;
blockHeadPtr->poolId = (initialPtr->poolNum +1); blockHeadPtr->frontBlock = mallocPtr; mallocPtr = blockHeadPtr; semGive(semMalloc);
return (void*)((char*)blockHeadPtr + sizeof(blockHead));