c언어 중 system함수를 사용한 프로그램 질문입니다.
글쓴이: maestrosmj / 작성시간: 목, 2014/11/06 - 12:00오전
리눅스에서 c 언어로 코드를 짜고 있습니다.
내용은 malloc을 무한루프 돌려서 시스템 free 중 used 가 과부하 걸리면 종료 하는 코드 입니다.
# vi mem.c
#include <stdio.h> #include <stdlib.h> int main () { FILE *f; char *c; int total=0; int used=0; system("free | grep Mem: | awk '{print $2}' > totaltxt"); f = fopen("totaltxt", "r"); fscanf(f, "%d", &total); fclose(f); while(1) { system("free | grep Mem: | awk '{print $3}' > usedtxt"); f = fopen("usedtxt", "r"); fscanf(f, "%d", &used); fclose(f); if( mem_used > 1000000 ) // free 로 확인 결과 기존 total 이 1030000 정도. 기존 used 는 700000 정도. { free(c); break; } c = malloc(1); printf("%d\n", used); // used 가 변하고 있는지 확인하는 코드 } return 0; }
돌려보면 malloc 때문에 used 가 계속 쌓여서 결국 과부하에 걸려야 하는데 malloc이 계속 할당되지 않는 것인지
중간에 할당이 해제되는 것인지 used 가 비슷한 수준을 맴돌고 있습니다.
free 명령어를 써서 직접 모니터링 해봐도 역시나 똑같이 과부하에 걸리지 않습니다. 초기값과 거의 변화가 없습니다.
malloc이 이상한가 싶어서 while 문 안에 다 지우고 c = malloc(1) 만 두고 돌리면서
free 로 부하량 확인해보니 역시나 과부하가 잘 걸립니다.
system 함수와 malloc 함수를 같이 써서 문제가 있는 걸까요?
몇 시간째 씨름하고 있습니다 ㅠ_ㅠ
아시는분의 도움을 부탁드립니다.
Forums:
이상한거 없어 보이는데요...
malloc 값을 좀 크게해서 한번 돌려보시죠
그래도 똑같네요. 왜 이러는지 이해를 못하겠네요 ㅠ_ㅠ
메모리 올려서 total 늘리고 malloc 값을 1000 줘봤지만 같은 결과네요.
잃어버린 malloc을 찾아서...
흠..
while loop 에 malloc 만 있다면야 cpu 클럭의 몇 분의 1 수준으로 빠르게 메모리가 증가하겠지만..
system 은 fork + exec 으로 shell 을 실행해서 명령 세 개를 실행한 다음에 (여기서도 shell 이 fork + exec + pipe)..
file I/O 까지 챙긴 후에 리턴할 테니.. 시간이 많이 걸릴겁니다.
그 다음에 파일을 한 번 더 읽는거는.. 뭐 얼마 안 걸린다 쳐도..
부하를 주는 녀석과 모니터링을 하는 녀석을 서로 다른 thread 로 돌려보세요.
부하를 줄 때 delay 없이 while 돌리면 프로세스나 cpu 부하가 많이 늘어날 테니..
메모리를 충분히 더 크게(64k ~ 1024k) 잡고, usleep 적당히 걸어주면 좋을 것 같네요.
thread 가 익숙지 않으면 그냥 /proc/meminfo 를 읽어서 total - free + buffers + cached 하면 used 가 나올겁니다 (아마도).
어차피 free 명령이 이 파일을 읽으니.. 모니터링 하는거라면 직접 읽는게 빠르고 부하도 적게 걸리겠죠.
되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』
malloc의 리턴값이 NULL인지 확인해보세요.
malloc의 리턴값이 NULL인지 확인해보세요.
malloc() 한 후 메모리에 값을 넣어 보세요.
memset() 같은 걸로요...
페이지 폴트, 가상메모리 등으로 검색해
페이지 폴트, 가상메모리 등으로 검색해 보세요.
https://kldp.org/node/23607
정상입니다. 메모리가 과부하안되는 것이 아닙니다.
정상입니다. 메모리가 과부하안되는 것이 아닙니다. 메모리는 착실히(?) 누수되고 있습니다.
하지만, 왜 실제로는 정상작동하는 것처럼 보이는지는.. 다음의 이유 때문입니다.
1. system io, File io 의 속도가 너무 느립니다.
2. malloc 의 크기가 너무 작습니다.
free 명령어에서 나타나는 결과의 단위는 1k 입니다. 즉, 루프를 1000 천 돌아야 1씩 올라가는데.. system io, file io 의 속도가 너무 느린 관계로 표면적으로 나타나는게 없는 것 처럼 보이는 겁니다.
malloc 의 크기를 10M(10000000) 혹은 1M(1000000) 로 지정해서 해보세요. 바로 결과가 나타납니다. :)
---------------------------------
제일 왼쪽이 저입니다 :)
메모리 할당이 이렇게 되고 있습니다.
system()을 제외한.
윈도우 DevC++ 32비트 테스트 결과입니다.
- malloc() 은 하나마다 새로운 주소를 생성합니다.
- free() 는 생성한 주소 하나마다 모두 해제하는것이 맞습니다.
- fscanf() 에서 파일이 없으면. 멈춥니다.
윈도우에서는 _msize()로 할당된 메모리 크기 확인이 가능합니다.
----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.
매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.
각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com
댓글 달기