?? memory_management.cpp
字號:
printf("\n");
}
/* 剩下的部分在256內存池中申請 */
printf("\n256_buffer address:\n");
for(int j = 0; j < b256_num; ++j)
{
/* 從消息隊列中接收內存塊地址 */
if(msgQReceive(msgQId_pool256,(char*)&pBuff256_rc,sizeof(PBUFFER),WAIT_FOREVER)==ERROR)
{
return(ERROR);
}
/* 將已分配地址保存并輸出 */
pbuf256_store[buf_256_num] = pBuff256_rc.buffer;
printf("0x%07x\t",pbuf256_store[buf_256_num]);
++buf_256_num;
if((j + 1) % 5 == 0)
printf("\n");
}
/* 內存不足告警提示信息 */
if(msgQNumMsgs(msgQId_pool256) <= 3)
{
printf("\nCAUTION:You got %d 256_buffer left.\n",msgQNumMsgs(msgQId_pool256));
}
/* 如果需要分配的內存塊個數大于當前16內存池和256內存池中未分配 */
/* 內存總數之和,則在靜態內存池外的系統內存池中申請 */
} else if(alloc_num > msgQNumMsgs(msgQId_pool16) + msgQNumMsgs(msgQId_pool256) && alloc_num < MAX_ALLOC_NUM) {
printf("CAUTION:Too many buffers to alloc in Buffer Pool.\nAlloc in System Memory Pool\n");
for(int i = 0; i < alloc_num; ++i)
{
semTake(semId, WAIT_FOREVER); /* 互斥信號量 */
pbufsys_store[buf_sys_num] = (char*)malloc(alloc_buf_size);
semGive(semId);
/* 將已分配地址保存并輸出 */
printf("0x%07x\t",pbufsys_store[buf_sys_num]);
++buf_sys_num;
if((i + 1) % 5 == 0)
printf("\n");
}
} else {
printf("ERROR: Please Input a valid number.\n");
}
/* 2.如果申請內存塊大小大于16小于256 */
} else if(alloc_buf_size > 16 && alloc_buf_size <= 256) {
/* 如果需要分配的內存塊個數小于當前256內存池未分配內存塊的個數, */
/* 直接在256內存池中申請 */
if(alloc_num > 0 && alloc_num <= msgQNumMsgs(msgQId_pool256))
{
for(int i = 0; i < alloc_num; ++i)
{
/* 從消息隊列中接收內存塊地址 */
if(msgQReceive(msgQId_pool256,(char*)&pBuff256_rc,sizeof(PBUFFER),WAIT_FOREVER)==ERROR)
{
return(ERROR);
}
/* 將已分配地址保存并輸出 */
pbuf256_store[buf_256_num] = pBuff256_rc.buffer;
printf("0x%07x\t",pbuf256_store[buf_256_num]);
++buf_256_num;
if((i + 1) % 5 == 0)
printf("\n");
}
if(msgQNumMsgs(msgQId_pool256) <= 3)
{
printf("\nCAUTION:You got %d 256_buffer left.\n",msgQNumMsgs(msgQId_pool256));
}
/* 如果需要分配的內存塊個數大于當前256內存池未分配內存塊的個數, */
/* 則直接在系統內存池中申請 */
} else if(alloc_num > msgQNumMsgs(msgQId_pool256) && alloc_num < MAX_ALLOC_NUM) {
printf("CAUTION:Too many buffers to alloc in Buffer Pool.\nAlloc in System Memory Pool.\n");
for(int i = 0; i < alloc_num; ++i)
{
semTake(semId, WAIT_FOREVER); /* 互斥信號量 */
pbufsys_store[buf_sys_num] = (char*)malloc(alloc_buf_size);
semGive(semId);
/* 將已分配地址保存并輸出 */
printf("0x%07x\t",pbufsys_store[buf_sys_num]);
++buf_sys_num;
if((i + 1) % 5 == 0)
printf("\n");
}
} else {
printf("ERROR: Please Input a valid number.\n");
}
/* 3.如果申請內存塊大小大于256 */
/* 直接在系統內存池中申請 */
} else if(alloc_buf_size > 256 && alloc_buf_size < 10000) {
if(alloc_num > 0 && alloc_num < MAX_ALLOC_NUM)
{
for(int i = 0; i < alloc_num; ++i)
{
pbufsys_store[buf_sys_num] = (char*)malloc(alloc_buf_size);
printf("0x%07x\t",pbufsys_store[buf_sys_num]);
++buf_sys_num;
if((i + 1) % 5 == 0)
printf("\n");
}
} else {
printf("ERROR: Please Input a valid Number.\n");
}
} else {
printf("ERROR: Please Input a valid Size.\n");
}
return (OK);
}
/****************************************************************************/
/************************* 功能函數 bufReturn() *****************************/
/****************************************************************************/
/* 實現功能: 按照用戶需求釋放若干個自定義類型的內存塊, */
/* 并輸出釋放的內存塊的地址.可以釋放的內存塊類型為三種: */
/* 1. 16_buffer -- 大小為16的內存塊 */
/* 2. 256_buffer -- 大小為256的內存塊 */
/* 3. sys_buffer -- 已申請的系統內存塊 */
STATUS bufReturn(unsigned int &buffer_type,unsigned int &free_num)
{
/* 初始化發送消息對象 */
PBUFFER pBuff16_sd;
PBUFFER pBuff256_sd;
/* 判斷用戶選擇 */
switch (buffer_type) {
/* 如果選擇的是1. 16_buffer */
case 1:
/* 如果用戶需要釋放的內存塊個數小于已分配的內存塊個數 */
/* 則直接釋放 */
if(free_num > 0 && free_num <= buf_16_num)
{
printf("Freed 16_buffer address:\n");
for(int i = 0; i < free_num; ++i)
{
/* 查詢已分配的內存塊地址 */
pBuff16_sd.buffer = pbuf16_store[--buf_16_num];
printf("0x%07x\t",pBuff16_sd.buffer);
if((i + 1) % 5 == 0)
printf("\n");
/* 通過發送到消息隊列中實現內存釋放 */
if(msgQSend(msgQId_pool16,(char*)&pBuff16_sd, sizeof(PBUFFER), WAIT_FOREVER, MSG_PRI_NORMAL) == ERROR)
{
printf("16_Buffer free failed.\n");
return (ERROR);
}
}
/* 如果用戶需要釋放的內存塊個數大于已分配的內存塊個數 */
/* 則釋放全部已分配的內存塊 */
} else if(free_num > buf_16_num) {
printf("There are only %u 16_buffers can be freed.\nFreed 16_buffer address:\n", buf_16_num);
free_num = buf_16_num;
for(int i = 0; i < free_num; ++i)
{
pBuff16_sd.buffer = pbuf16_store[--buf_16_num];
printf("0x%07x\t",pBuff16_sd.buffer);
if((i + 1) % 5 == 0)
printf("\n");
/* 通過發送到消息隊列中實現內存釋放 */
if(msgQSend(msgQId_pool16,(char*)&pBuff16_sd, sizeof(PBUFFER), WAIT_FOREVER, MSG_PRI_NORMAL) == ERROR)
{
printf("16_Buffer free failed.\n");
return (ERROR);
}
}
} else {
printf("Please input a valid Number.\n");
}
break;
/* 如果選擇的是2. 256_buffer */
/* 方法同16_buffer相同,故不再注釋*/
case 2:
if(free_num > 0 && free_num <= buf_256_num)
{
printf("Freed 256_buffer address:\n");
for(int i = 0; i < free_num; ++i)
{
pBuff256_sd.buffer = pbuf256_store[--buf_256_num];
printf("0x%07x\t",pBuff256_sd.buffer);
if((i + 1) % 5 == 0)
printf("\n");
if(msgQSend(msgQId_pool256,(char*)&pBuff256_sd, sizeof(PBUFFER), WAIT_FOREVER, MSG_PRI_NORMAL) == ERROR)
{
printf("256_Buffer free failed.\n");
return (ERROR);
}
}
} else if(free_num > buf_256_num) {
printf("There are only %u 256_buffers can be freed.\nFreed 256_buffer address:\n", buf_256_num);
free_num = buf_256_num;
for(int i = 0; i < free_num; ++i)
{
pBuff256_sd.buffer = pbuf256_store[--buf_256_num];
printf("0x%07x\t",pBuff256_sd.buffer);
if((i + 1) % 5 == 0)
printf("\n");
if(msgQSend(msgQId_pool256,(char*)&pBuff16_sd, sizeof(PBUFFER), WAIT_FOREVER, MSG_PRI_NORMAL) == ERROR)
{
printf("256_Buffer free failed.\n");
return (ERROR);
}
}
} else {
printf("Please input a valid Number.\n");
}
break;
/* 如果選擇的是3. sys_buffer */
case 3:
printf("%u System buffers will be all freed.\n Freed system buffer address:\n", buf_sys_num);
free_num = buf_sys_num;
for(int i = 0; i < free_num; ++i)
{
printf("0x%07x\t",pbufsys_store[--buf_sys_num]);
free(pbufsys_store[buf_sys_num]);
if((i + 1) % 5 == 0)
printf("\n");
}
break;
default:
printf("Please input a valid Type.\n");
break;
}
return (OK);
}
/****************************************************************************/
/************************* 功能函數 bufStatus() *****************************/
/****************************************************************************/
/* 實現功能: 查詢當前內存分配的信息,輸出已分配的各種類 */
/* 型的內存塊地址,并顯示當前剩余未分配的內存塊個數. */
STATUS bufStatus()
{
/* 顯示已分配的內存塊地址 */
printf("\n***Allocated buffers:***\n");
/* 若有已分配的16內存塊 */
if(buf_16_num > 0)
{
/* 讀取并輸出已分配內存地址記錄 */
printf("16_buffer address:\n");
for(int i = 0; i < buf_16_num; ++i)
{
printf("0x%07x\t", pbuf16_store[i]);
if((i + 1) % 5 == 0)
printf("\n");
}
}
/* 若有已分配的256內存塊 */
if(buf_256_num > 0)
{
/* 讀取并輸出已分配內存地址記錄 */
printf("\n256 buffer address:\n");
for(int i = 0; i < buf_256_num; ++i)
{
printf("0x%07x\t", pbuf256_store[i]);
if((i + 1) % 5 == 0)
printf("\n");
}
}
/* 若有已分配的系統內存塊 */
if(buf_sys_num > 0)
{
/* 讀取并輸出已分配內存地址記錄 */
printf("\nSystem memory address:\n");
for(int i = 0; i < buf_sys_num; ++i)
{
printf("0x%07x\t", pbufsys_store[i]);
if((i + 1) % 5 == 0)
printf("\n");
}
}
/* 顯示當前靜態內存池未分配的內存個數 */
printf("\nThere are %u 16_buffers left.\n", msgQNumMsgs(msgQId_pool16));
printf("There are %u 256_buffers left.\n", msgQNumMsgs(msgQId_pool256));
return (OK);
}
/****************************************************************************/
/****************************** 功能函數 exit() *****************************/
/****************************************************************************/
/* 實現功能: 實現系統退出,釋放內存池和系統內存,刪除消息隊列, */
/* 信號量,和進程. */
STATUS exit()
{
printf("\nSystem is goint to exit...\n");
semTake(semId, WAIT_FOREVER); /* 互斥信號量 */
free(pTotalPool); /* 刪除總內存池 */
for(int i = 0; i < buf_sys_num; ++i)
{
free(pbufsys_store[i++]); /* 依次刪除已分配的系統內存 */
}
logMsg("Free All Allocated buffers...Complete.\n",0,0,0,0,0,0);
semGive(semId);
semDelete(semId); /* 刪除信號量 */
/* 刪除消息隊列 */
msgQDelete(msgQId_pool16);
msgQDelete(msgQId_pool256);
logMsg("Delete All Message queues...Complete.\n",0,0,0,0,0,0);
logMsg("Delete All tasks...\n",0,0,0,0,0,0);
/* 刪除進程 */
taskDelete(tidTask1);
return (OK);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -