64bit 리눅스 에서 한번에 malloc 가능한 최대 크기?

jacojang의 이미지

메모리 할당에 대한 몇가지 질문 있습니다.

AMD 에슬론 64 CPU 가 달려 있는 컴퓨터에 Ubuntu 6.10 Server Amd64 를 깔았습니다.
그리고 나서

size_t 를 sizeof(size_t) 해보니 8 이 나오더군요...
그런데 malloc 을 2G 이상의 크기로 하면 에러가 납니다. ( 64bit 에선 하나의 프로세스가 사용가능한 Virtual Memory 는 엄청 크더군요..... )
32bit O/S 에서 2G까지인것은 이해가 가는데 64bit 에서도 2G인것은 이해가 잘 안가네요..
따로 해줘야 하는 설정이라던가? 그런것이 있나요?

그리고 한가지더
32bit OS 에서 하나의 프로세스가 쓸수 있는 Virtual Memory 크기가 4G 인걸로 알고 있었는데..
while(1)
malloc(1024);
이런식으로 테스트 해보니 3G 까지 밖에 할당이 안되던데... 이유가 뭔가요??

고수님들의 가르침 부탁 드립니다.^^;

수고하세요..

chadr의 이미지

운영체제가 들어있는 컴퓨터는 특정 프로그램 하나만 돌아가는게 아닙니다.
바로 운영체제와 디바이스 드라이버들 또한 메모리를 사용하고 고유한 메모리 주소를 가지고 있는것입니다..
그들을 위한 메모리 주소공간이 예약이 되어있으며 그부분은 일반 어플리케이션이 사용할수는 없게 됩니다.

그렇기 때문에 모든 메모리 주소를 일반어플리케이션에서 사용할수 없으므로 32비트 시스템에서 4기가 만큼의 메모리를 할당 할 수 없습니다.

그리고 64비트에서 2기가까지밖에 안되는 이유는... 그건 잘 모르겠군요.. 제가 알기로는 2기가 이상이 할당이 가능한 걸로 알고 있는데..
-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.

-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.

bootmeta의 이미지

얼핏 기억나기로 커널 컴파일시 option내용에 따라 달라질 수 있는 것으로 알고 있습니다.
/boot내에 현재 설치된 커널의 menuconfig내용이 있는 것으로 알고 있는데 한번 살펴보시는 것도 도움이 될지 모르겠습니다.

Necromancer의 이미지

ulimit -a 로 프로세스 제한 확인해보심이

Written By the Black Knight of Destruction

Written By the Black Knight of Destruction

익명사용자의 이미지

초창기 64-bit 버젼 glibc가 2GB 이상은 할당하지 못하는 문제가 있었었습니다. Ubuntu 6 glibc가 그 버그가 있는지는 잘 모르겠네요.
32bit에서 4GB를 다 사용하지 못하는 이유는 간단합니다 - 프로그램이 실행될때에는 프로그램 자체(.text section in the executable file)와 프로그램에 있는 데이타 (.bss/.data/etc section)등이 주소공간에 할당되어야 하고, 스택도 필요하며 (보통 리눅스 시스템에서 8MB 정도), 동적링크된 경우에는 shared library들을 올려놓을 주소공간도 필요합니다. 4GB 주소공간에서 이런저런 것들로 쓰고 나서 남는 것이 사용할 수 있는 공간이 되겠지요. 그 외에도 이런 저런 이유로 프로세서/커널 구현에 따라서 4GB전체를 사용자가 사용할 수 없는 경우도 있습니다.

dg의 이미지

32bit 에서 3기가까지만 할당되는것은
4기가의 주소공간중에 상위 1기가는 항상 커널이 점유하기 때문입니다.

jacojang의 이미지

댓글 달아 주신 분들 감사합니다..

문제는 swap 사이즈 였습니다.
swap 사이즈를 늘려주니 malloc 할 수 있는 크기도 같이 늘어나네요... -.-;;

그리고 한가지 더 실수 했던거...
void *ptr = malloc(1024*1024*1024*3);
처음에 이런식으로 테스트 했었는데. 1024*1024*1024*3 이부분 숫자 계산 식에서 나온 결과 값은 4byte 숫자 값으로 인식 되더군요 ( 그것도 signed )
처음엔 이것 때문에도 문제가 있었습니다.
다들 저같은 실수 안하시길...^^;

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