스택의 크기는?

버려진의 이미지

스택의 시작점은 .. os마다 다른가요?
그리고 스택의 크기는 어떤가요?
윈도보다 리눅스가 훨씬 큰거 같던데

이런식으로 해봤거든요

int main()
{
int[큰숫자];
return 0;
}

윈도가 25000정도 나오면 리눅스는 50억 정도까지 되던데 이게 뭔일인지 +_+

ihavnoid의 이미지

pyj200 wrote:
스택의 시작점은 .. os마다 다른가요?
그리고 스택의 크기는 어떤가요?
윈도보다 리눅스가 훨씬 큰거 같던데

이런식으로 해봤거든요

int main()
{
int[큰숫자];
return 0;
}

윈도가 25000정도 나오면 리눅스는 50억 정도까지 되던데 이게 뭔일인지 +_+


실제로 read/write를 하기 전에는 그게 할당된 건지 아닌지 알 수가 없습니다.. -_-;;

즉,

int s[100000000];
int i;
for(i=0;i<100000000;i++) s[i]=i;

뭐 이런식의 것을 하지 않으면 그게 실제로 쓰는건지 안 쓰는건지 알 길이 없다 하더군요.. -_-;;
그게... OS에 따라 다르지만, 개중에는 최초로 access할때 메모리를 할당하는 경우도 많다 합니다....

게다가 스택이라면 malloc() 등과는 다르게 할당과정이 없으므로, 더더욱 그렇겠군요...

Consider the ravens: for they neither sow nor reap; which neither have storehouse nor barn; and God feedeth them: how much more are ye better than the fowls?
Luke 12:24

seed의 이미지

위의분께서 잘 말씀해주셨습니다.조금 첨언합니다.

pyj200 wrote:

int main()
{
int[큰숫자];
return 0;
}

이런식으로 코드를 작성하시면...컴파일단계에서 무시됩니다.

유저모드스택과 커널모드스택이있는데...

유저모드스택은 가상메모리를 사용하기 때문에 약4G까지 사용가능합니다.
스택이라는것이 대단한것이 아니라 그냥 메모리공간일뿐입니다.
프로세스는 생성시에 자신에게 필요한 스택공간을 알아봅니다.
괜히 쓸데없이 가상메모리공간을 할당하는건 비효율적이니까요.
그래서 만약 가상메모리공간을 4G할당한다면 모두 스택으로 사용가능한거죠.
스택이 코드공간을 침범하더라도 CPU는 알수가 없습니다. -_-

커널모드스택은 하나의 태스크(프로세스)당 8k byte입니다. (ULK참고)

seeker의 이미지

하시면 가능한 스택limit을 알수있는데요.

만약, 8메가로 잡혀있을때 그것보다 더 크게
배열크기로 잡아주어도
컴파일시에는 에러가 나지 않습니다.
그러나, 그럴경우, 실행시에 배열액세스하는부분에서 segment fault가
난 적이 있습니다.

partout의 이미지

위에 분의 말씀이 맞네요.
ulimit -a를 쳐서 확인해 보니까...
스택의 기본 크기가 8192 Kbytes로 설정되어 있더군요.

[partout@partout test]$ ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
file size (blocks, -f) unlimited
max locked memory (kbytes, -l) unlimited
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 1279
virtual memory (kbytes, -v) unlimited

아래와 같이 코드를 작성해서 컴파일 해보니깐...
컴파일은 무난히 되는데.. 실행하면 Segmentation fault를 냅니다.
그리고 아래 코드에서 배열의 크기를 8392704 (8196 * 1024)보다 훨씬 더 큰 숫자를
사용한 경우에는 컴파일 단계에서 배열의 첨자가 너무 크다라고 에러를 내는군요.

int main(void)
{

    char c[8392704  /* 8196 * 1024 */];
    unsigned int i;

    for (i = 0; i < 8392704 ; i++) {

        c[i] = i;
    }

    return 0;
}

어찌나 졸린지..~~

댓글 달기

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