스택, 힙에서 메모리 할당시 간격(?)에 대해서 질문드립니다.

익명 사용자의 이미지

제가 테스한 시스템은
P-III 550
Redhat 7.1(2.4.x)이구요.. gcc는 깔려있는것 그데로 사용했습니다.

연속해서 스택에 버퍼를 잡거나
힙에 malloc()등으로 할당하여 8bytes(64bits)의 공간을
두면서 버퍼가 잡히더군요..

제 생각엔 리눅스는 32bits 시스템이니깐,

메모리 세그먼트들도 4bytes씩 떨어지면서 잡혀야 하는게 아닌가요?

궁금합니다.

시스템 고수님들.. ^^*

익명 사용자의 이미지

#include

int main ()
{
char* buff1, *buff2;

buff1 = (char *)malloc (1024);
buff2 = (char *)malloc (1024);
printf ("0x%08X 0x%08X\n", &buff1, &buff2);
free (buff2);
free (buff1);
return 0;
}

결과값

0xBFFFFA84 0xBFFFFA80

흠... P II, Kernel 2.4.2, gcc 2.96(RH)
위와같은 결과가 나오네요.

익명 사용자의 이미지

직접 메일로 보내시다니... ^^;
그냥 게시판에 쓰시면 더 많은 도움을 얻으실 수가 있답니다.
개인적으로 메일을 받다보면(저도 못하지만... --;) 좋은 정보들이
공유되지 않을 수가 있거든요. 다른 궁금한 분들을 위해서도 개인
적인 메일은 삼가해주셨으면 하네요. ^^;

아~ 그리고 Heap에 관련되어서 8Bytes가 떨어진건 더 찾아봐야겠네요.
gcc의 소스에서 그렇게 하는것이지 아니면 kernel 메모리 할당에서
그렇게 하는것인지...(제 생각에는 메모리 할당은 커널에서 담당을 하니
그쪽 소스를 뒤져봐야겠지만요. ^^;)

이 이야기에서 좀 벗어나는 이야기이지만 일반적으로 struct를 규정할때
#pragma pack(1)
struct ... {
};
#pragma pack()
을 하게 되면 구조체 내부의 각 요소들이 1바이트 정렬을 하게되죠.
gcc옵션에도 그러한 것이 있는것으로 알고 있는데...

찾아보고 다시 적어보죠. (아무래도 오~래 걸릴듯... ^^;)

익명 사용자의 이미지

조성호 님께는 메일로 보냈었던 내용이었구요...

저도 계속 알아보죠!!!
----------------------------------------------------------------------

메모리 할당에 대한 질문 답 감사합니다.

그런데 제 질문이 좀 부정확했던것 같네요... --;

요지는 malloc으로 그러니깐 힙에 할당된 버퍼들은 8bytes의 간격을

두고 할당되는디.. 아래 소스의 제 컴 실행결과

----------------------------------------------------------
In stack &buff1=0xbffff9d4
In heap buff1=0x8049850
from start to end &buff1[0]=0x8049850, &buff1[1023]=0x8049c4f

In stack &buff2 0xbffff9d0
In heap buff2 0x8049c58
from start to end &buff2[0]=0x8049c58, &buff2[1023]=0x804a057


----------------------------------------------------------
&buff2[0]=0x8049c58
&buff1[1023]=0x8049c2f
차이는 8bytes!!!




왜 그런지가 질문이었습니다.

아래 소스 참고해 주세요... 스택에서는 별 문제 없습니다.(첨부했습니다.)

#include

int main ()
{
char* buff1, *buff2;

int addr;

buff1 = (char *)malloc (1024);
buff2 = (char *)malloc (1024);
printf ("\nIn stack &buff1=%p\n", &buff1);
printf ("In heap buff1=%p\n", buff1);
printf (" from start to end &buff1[0]=%p, &buff1[1023]=%
p\n\n\n", &buff1[0], &buff1[1023]);

printf ("In stack &buff2 %p\n", &buff2);
printf ("In heap buff2 %p\n", buff2);
printf (" from start to end &buff2[0]=%p, &buff2[1023]=%p\n",
&buff2[0], &buff2[1023]);

free (buff2);
free (buff1);
return 0;
}

~

익명 사용자의 이미지

malloc에서 얻은 메모리는 free를 통해서 다시 시스템에
돌려주게되는데 이때 시스템은 얼마나 되는 메모리를 돌려주어야
하는지를 어떻게 알가요?
malloc을 부를때 요구하는 크기에따라 다를수 있지만
일반적인 크기의 경우 해당하는 메모리 영역에대한
descriptor를 돌려주는 메모리의 앞쪽에 두는 trick을 많이
씁니다.
따라서 실제 요구하는 사이즈보다 시스템에서 얻어야하는 크기는
그 descriptor의 크기만큼 더 커지게 됩니다.
stack에서 auto 변수의 공간 할당이나 alloca에 의해 확보되는
공간은 함수가 빠져나갈때 컴파일러에의해 생성된 소스에서
자동 해제가 되기때문에 별도의 추가 공간이 필요가 없습니다.

조성호 wrote..
직접 메일로 보내시다니... ^^;
그냥 게시판에 쓰시면 더 많은 도움을 얻으실 수가 있답니다.
개인적으로 메일을 받다보면(저도 못하지만... --;) 좋은 정보들이
공유되지 않을 수가 있거든요. 다른 궁금한 분들을 위해서도 개인
적인 메일은 삼가해주셨으면 하네요. ^^;

아~ 그리고 Heap에 관련되어서 8Bytes가 떨어진건 더 찾아봐야겠네요.
gcc의 소스에서 그렇게 하는것이지 아니면 kernel 메모리 할당에서
그렇게 하는것인지...(제 생각에는 메모리 할당은 커널에서 담당을 하니
그쪽 소스를 뒤져봐야겠지만요. ^^;)

libc에서 malloc루틴을 참조하셔야합니다.
kernel쪽에서 서비스 해주는 것은 brk/mmap정도이고 나머지 처리는
libc에서 합니다.


이 이야기에서 좀 벗어나는 이야기이지만 일반적으로 struct를 규정할때
#pragma pack(1)
struct ... {
};
#pragma pack()
을 하게 되면 구조체 내부의 각 요소들이 1바이트 정렬을 하게되죠.
gcc옵션에도 그러한 것이 있는것으로 알고 있는데...

찾아보고 다시 적어보죠. (아무래도 오~래 걸릴듯... ^^;)

익명 사용자의 이미지

넵.. 그런것 같습니다.

혹시나 해서 힙 영역에 할당된 버퍼 사이를 찍어보니 어떤 값들이 들어 있더군
요..

즉, buf1, buf2, buf3을 8bytes 씩 힙에 할당하면
buf1(8) 8bytes buf2(8) 8bytes buf3(8) 8bytes
이렇게 공간이 할당되는데 만약 할당된 각 buf에 어떤 데이터도 들어 있지

않은 경우에 각 버퍼 사이의 빈 공간(8bytes)에 공통된 값이 있었습니다.

즉, 각 buf의 할당 크기와 같은 정보가 담겨 있으리라 유추됩니다... --;

댓글 달기

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