배열의 크기 선언에 대해서...

HiHi의 이미지

안녕하세요~

항상, 도움을 많이 받고갑니다~
흐, 이번에도 궁금한점이 생겨서..

C에서 보통 배열 선언을 하면,

char a[10];

이렇게 하잖아요?
이 말은, char 사이즈의 10개의 공간을 사용한다는 뜻이 되겠구요.

그래서 제가..

int main()
{
    char a[1024*1024*500];
    getchar();
}

위 처럼 하고 실행을 해봤더니, 실행전과 메모리 사용량이 거의 달라진게 없네요.
제 생각엔 메모리 500메가를 먹어야 하는거 같은데..~

그래서, 이번엔,

int main()
{
    char a[1024*1024*500];
    memset( a, '$', sizeof(a) );
    getchar();
}

이렇게 했더니, 그제서야 500메가를 먹는군요.

음~ 왜 처음 코드에서 500메가를 먹는게 아닌지요?
조언 부탁드립니다.
아~ 실험 OS는 Linux 2.4.18 입니당~

덧붙임. 제가 여기서 말하는 메모리는 물리적인 메모리의 사용량을
얘기합니다.

alsong의 이미지

답은 아니고요. 메모리를 차지해야 될것 같은데 신기하네요. ^^;
무옵션으로 컴파일했습니다.... 음 스택을 확보하는군요.
기본옵션에서는 삭제를 하지 않는군요.

 .file   "mem.c"
    .text
.globl main
    .type   main,@function
main:
    pushl   %ebp
    movl    %esp, %ebp
    subl    $1048584, %esp <-------
    andl    $-16, %esp
    movl    $0, %eax
    subl    %eax, %esp
    call    getchar
    leave
    ret
.Lfe1:
    .size   main,.Lfe1-main
    .ident  "GCC: (GNU) 3.2.2 20030222 (Red Hat Linux 3.2.2-5)"

그나저나 백수 언제 탈출하냐... ㅡㅡ; 배고파라.

girneter의 이미지

-S 로 컴파일해서 assembly 언어로 보면 확실하겠지만

첨 소스에서 변수 a 를 쓰질 않으니까
컴파일러가 최적화하면서 날려버린거 아닐까요?

개념없는 초딩들은 좋은 말로 할때 DC나 웃대가서 놀아라. 응?

choissi의 이미지

운영체제에서 가상메모리 잡는것과도 상관이 있습니다.
일딴 주소공간을 할당은 하고 실제 사용될때
실제 물리메모리가 할당 되니까요..

http://bbs.kldp.org/viewtopic.php?t=3599&highlight=malloc+memset

울랄라~ 호기심 천국~!!
http://www.ezdoum.com

tifler의 이미지

//#define	PAGE_SIZE	4096
#define	PAGE_SIZE	1024

int main()
{
	int i;
	char fmt[256];
	char buf[1024*1024*2];
	for(i = 0; i < sizeof(buf) / PAGE_SIZE; i++)
	{
		printf("%d th page\n", i);
		memset(&buf[i * PAGE_SIZE], 0, PAGE_SIZE);
		sprintf(fmt, "/bin/cat /proc/%d/status", getpid());
		system(fmt);
		sleep(5);
	}
	while(1) sleep(1);
}

실행해 보시면 VmRSS의 크기가 4KB(4096)단위로 증가 하는 것이 보일것입니다.
이는 초기화 시에 모든 물리 메모리를 할당하는것이 아니고, 가상 메모리를 할당 후, page fault가 일어날 경우(메모리 엑세스), 실제적인 물리 메모리가 할당되는 것입니다.
PAGE_SIZE가 4096으로 되어 있으므로 1페이지 단위로 증가가 되면서 실제 물리메모리를 가져가는 것이라고 보시면 될것입니다.

/***********************
* while(1) sleep(INFINITE);
***********************/

HiHi의 이미지

답변 감사드립니다~

아~ 주소공간만 할당하고, 실제로 쓰기 전까지는
메모리에 손을 안 대는군요.

음.. 그래서, 제가 테스트를 해봤는데...
stack이랑 heap 주소공간 할당이 다른것 같습니다.

stack 같은 경우는 정확히 남은 메모리 까지만 주소 공간 할당이 되는데,
heap 같은 경우는 거의 무한대로 주소 공간 할당이 되는군요.

실험 전에, 'swapoff -a' 디스크 스왑도 끄고, 프로세스당 스택사이즈 제한도
풀었습니다.

현재 제 컴터는 384 이구요. 남은 물리메모리는

             total       used       free     shared    buffers     cached
Mem:        385164      76436     308728          0       2172       7888
-/+ buffers/cache:      66376     318788
Swap:            0          0          0

318 메가 정도 됩니다.

stack 주소공간 할당

int main() {
    char a[1024*1024*310];
    getchar();
}
- 정상 실행 -

int main() {
    char a[1024*1024*320];
    getchar();
}
-Segmentation fault 발생-

아주 정확히는 아니지만, 남은 메모리 공간까지만 할당이 됩니다.

다음은 heap의 경우...

#define ALLOC_SIZE  1024*1024

int main() {
    char *ptr[10240];
    int i;

    i = 0;
    while( 1 ) {
        ptr[i] = malloc(ALLOC_SIZE);
        if( ptr[i] == NULL ) {
            break;
        }

        printf("tot_mem %d MB\n", i );

        i++;

        if( i == 10240 ) {
            break;
        }
    }

    return 1;
}
- 2930메가 까지 메모리(주소공간) 할당. -

이렇게 되는군요.

음... heap 에서는 남은 메모리 만큼만 메모리(주소공간)할당하는게 아니라,
남은 메모리에 관계없이 그냥 주소공간을 할당하는군요.
생각해보면, stack이야 바로 당장 써야 하니까, 메모리의 남은 만큼만
된다고 치는데...

heap은 남은 메모리에 관계없이, 특정 영역까지 할당이 되는거 같습니다.
왜 이런거죠?
조언 부탁드립니다.

^^

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.