전역으로 선언한 메모리의 해제..
글쓴이: leolo / 작성시간: 월, 2003/05/26 - 4:41오후
다음은 헤더파일에 전역으로 구조체를 선언하고
cgi로 데이터를 받아 선언된 구조체에 각각 넣고.
이를 화면에 출력하는 것입니다.
1초 간격으로 계속해서 cgi를 실행하고요..
그런데.. 이렇게 사용하면. free명령을 통해 리눅스에서 보면..
계속해서 사용가능한 메모리가 줄어듭니다.
기본적으로 전역으로 선언한 메모리는 메인프로그램(여기서는 cgi)이
죽으면 free되지 않나요?
다른 처리를 가해야 하나요..
어떻게 해야하는지 알려주세요..
참고로. ps하면 이전에 수행한 cgi는 죽어 있습니다.
X.h struct bec_conn_info { uint8_t line; uint8_t dev_id; uint8_t ba[6]; uint16_t port; uint32_t tx; uint32_t rx; uint8_t name[248]; } __attribute__ ((packed)); #define BEC_CONN_INFO_SIZE 266 extern bec_conn_info peerlist[]; X.c -> X.cgi struct bec_conn_info peerlist[BT_NBT_DATAPORTS]; int bt_peer_connected = 0; void init_peerlist() { int i = 0; for(i = 0; i < BT_NBT_DATAPORTS; i++){ memset(&peerlist[i], 0, sizeof(struct bec_conn_info)); peerlist[i].line = -1; peerlist[i].dev_id = -1; } } void op_conn_info(int id, int opcode, int disc) { .... 생략... if(opcode == OP_BEC_GET_CONN_INFO){ ipc_send_req(id, opcode, NULL, 0, rsp, &slen, to); if(rsp[0] == ERR_SUCCESS){ bt_peer_connected = rsp[1]; ptr = rsp+2; for(i = 0; i < bt_peer_connected; i++){ ci = (struct bec_conn_info*)ptr; peerlist[i].line = i; peerlist[i].dev_id = ci->dev_id; memcpy(peerlist[i].ba, ci->ba, 6); memcpy(peerlist[i].name, ci->name, strlen(ci->name)); peerlist[i].port = ntohs(ci->port); peerlist[i].tx = ntohl(ci->tx); peerlist[i].rx = ntohl(ci->rx); ptr += BEC_CONN_INFO_SIZE; } } else{ err("OP_BEC_GET_CONN_INFO failed : %02x\n", rsp[0]); /* ERR HTML FORM */ } } else { err("Unkwon code :%02x\n", opcode); /* ERR HTML FORM */ } } void state_form() { int i; op_conn_info(PID_BEC, OP_BEC_GET_CONN_INFO, PARA_GET); printf("Content-type: text/html\n\n"); printf("<html>\n"); printf("<head>\n"); printf("<title>status FORM</title>\n"); printf("</head>\n"); printf("<form name = state_info method = get action = ./status_load.cgi>\n"); printf("<body onLoad = window.setTimeout(\"location.href='./status_load.cgi'\",1000)>\n"); printf("<table border = 1 width = 500 height = 500>\n"); for(i = 0; i < bt_peer_connected; i++){ printf("<tr valign = top>\n"); printf("<td width = 500 height = 10>\n"); printf("<table border = 1 width = 100%%\n"); printf("<tr valign = top>\n"); printf("<td width = 30>\n"); printf("<font size = 2 face = arial>\n"); printf("<input readonly size = 3 maxLength = 3 name = line style = \"border:0px\" value = %d>\n", peerlist[i].line); printf("</font>\n"); printf("</td>\n"); printf("<td width = 30>\n"); printf("<font size = 2 face = arial>\n"); printf("<input readonly size = 3 maxLength = 3 name = dev_id style = \"border:0px\" value = %d>\n", peerlist[i].dev_id ); printf("</font>\n"); printf("</td>\n"); ...... } printf("<tr valign = bottom>\n"); printf("<td width = 500>\n"); printf("<table border = 1 width = 500>\n"); printf("<tr>\n"); printf("<td>\n"); printf("<input type = submit value = Reload onClick = \"history.go()\">\n"); printf("</td>\n"); printf("</tr>\n"); printf("</table>\n"); printf("</td>\n"); printf("</tr>\n"); printf("</table>\n"); printf("</form>\n"); printf("</body>\n"); printf("</html>\n"); } int main() { init_peerlist(); state_form(); return 0; }
Forums:
신경 안쓰셔도 됩니다.
221 processes: 219 sleeping, 2 running, 0 zombie, 0 stopped
CPU states: 0.1% user, 0.1% system, 0.0% nice, 0.1% idle
Mem: 2059900K av, 2039428K used, 20472K free, 0K shrd, 4032K buff
Swap: 2048248K av, 303700K used, 1744548K free 1824308K cached
위를 보시면 이 시스템은 2기가의 메모리를 가지고 있습니다.
하지만 free영역은 20메가 정도 입니다.
이것은 os가 남는 메모리를 버퍼캐쉬등으로 사용하기 때문에 그렇습니다.
그래서 처음엔 free가 많더라도 점점 줄어 들게되죠..
임의대로 free를 좀 많이 확보 하시고 싶으시면
while () {
calloc(1, 1024*1024)
}
이소스를 죽을때 까지 돌리면 버퍼로 잡힌것들이
사용자에게 할당해주느라고 다 비우게 되고
프로그램이 죽으면서 그 공간이 free 로 잡히게 됩니다.
울랄라~ 호기심 천국~!!
http://www.ezdoum.com
댓글 달기