今天一口氣把監控模塊框架寫了.
監控模塊設計步驟如下:
建立一個定時器:(用於定時監控每模塊是否活着)
建立一個隊列:(用於接收各模塊的迴應消息)
while(recv(queue))
{
switch(msg)
timer:
if(is_all_alive)
發送監控消息給所有模塊
else
發送消息給主控
other module:
此模塊活着
.....:
此模塊活着
}
timer
{
發送定時消息給自己模塊
}
再接着把內存管理的代碼也寫了:
設計要求:
可查詢當前內存的申請情況(長度,種類和種類的大小,及申請的文件名,行數)
限制申請長度超過內存最大長度
#define NUM_BLOCKS 128//申請次數
#define NUM_SIZES 64//申請的種類
#define MAX_MEM_SIZES 1024*1024 // 1M 內存
static BlockEntry blocks[NUM_BLOCKS];
static Counter counters[NUM_SIZES];
static void incrementCountForSize(size_t size);
static void decrementCountForSize(size_t size);
static long FS_totalAllocated = 0;
void *mMallocLineFile(size_t size, int line, char *file)
{
int i;
if((FS_totalAllocated+size)>MAX_MEM_SIZES)
return;
void *newAllocation = malloc(size);
for (i = 0; i < NUM_BLOCKS; i++)
{
if (blocks[i].addr == 0)
{
// found empty entry; use it
blocks[i].addr = newAllocation;
blocks[i].size = size;
blocks[i].line = line;
blocks[i].file = file;
incrementCountForSize(size);
break;
}
}
assert(i < NUM_BLOCKS);
FS_totalAllocated += size;
return newAllocation;
}
void mFree(void *blockToFree)
{
int i;
for (i = 0; i < NUM_BLOCKS; i++)
{
if (blocks[i].addr = = blockToFree)
{
// found block being released
decrementCountForSize(blocks[i].size);
FS_totalAllocated -= blocks[i].size;
blocks[i].addr = 0;
blocks[i].size = 0;
break;
}
}
assert(i < NUM_BLOCKS);
free(blockToFree);
}
void mDisplayTable(void)
{
printf("%s", "/nSize/tFreq.");
for (int i = 0; i < NUM_SIZES; i++)
{
if (counters[i].size = = 0) break;
printf("/n%d/t/t%d", counters[i].size, counters[i].count);
}
}
void mClearTable(void)
{
for (int i = 0; i < NUM_SIZES; i++)
{
counters[i].size = 0;
counters[i].count = 0;
}
}