스택의 시작점은 .. 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
유저모드스택은 가상메모리를 사용하기 때문에 약4G까지 사용가능합니다.
스택이라는것이 대단한것이 아니라 그냥 메모리공간일뿐입니다.
프로세스는 생성시에 자신에게 필요한 스택공간을 알아봅니다.
괜히 쓸데없이 가상메모리공간을 할당하는건 비효율적이니까요.
그래서 만약 가상메모리공간을 4G할당한다면 모두 스택으로 사용가능한거죠.
스택이 코드공간을 침범하더라도 CPU는 알수가 없습니다. -_-
위에 분의 말씀이 맞네요.
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;
}
Re: 스택의 크기는?
실제로 read/write를 하기 전에는 그게 할당된 건지 아닌지 알 수가 없습니다.. -_-;;
즉,
뭐 이런식의 것을 하지 않으면 그게 실제로 쓰는건지 안 쓰는건지 알 길이 없다 하더군요.. -_-;;
그게... 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
Re: 스택의 크기는?
위의분께서 잘 말씀해주셨습니다.조금 첨언합니다.
이런식으로 코드를 작성하시면...컴파일단계에서 무시됩니다.
유저모드스택과 커널모드스택이있는데...
유저모드스택은 가상메모리를 사용하기 때문에 약4G까지 사용가능합니다.
스택이라는것이 대단한것이 아니라 그냥 메모리공간일뿐입니다.
프로세스는 생성시에 자신에게 필요한 스택공간을 알아봅니다.
괜히 쓸데없이 가상메모리공간을 할당하는건 비효율적이니까요.
그래서 만약 가상메모리공간을 4G할당한다면 모두 스택으로 사용가능한거죠.
스택이 코드공간을 침범하더라도 CPU는 알수가 없습니다. -_-
커널모드스택은 하나의 태스크(프로세스)당 8k byte입니다. (ULK참고)
ulimit -a
하시면 가능한 스택limit을 알수있는데요.
만약, 8메가로 잡혀있을때 그것보다 더 크게
배열크기로 잡아주어도
컴파일시에는 에러가 나지 않습니다.
그러나, 그럴경우, 실행시에 배열액세스하는부분에서 segment fault가
난 적이 있습니다.
스택의 크기는 ?
위에 분의 말씀이 맞네요.
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)보다 훨씬 더 큰 숫자를
사용한 경우에는 컴파일 단계에서 배열의 첨자가 너무 크다라고 에러를 내는군요.
어찌나 졸린지..~~
댓글 달기