전역으로 선언한 메모리의 해제..

leolo의 이미지

다음은 헤더파일에 전역으로 구조체를 선언하고
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;
}
choissi의 이미지

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

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.