2010-02-26 4 views
15

Linux에서 프로세스의 스택 크기에 대한 질문이 있습니다. 이 스택 크기는 링크 시간에 결정되며 ELF 파일에 코딩되어 있습니까?리눅스에서 pthread, fork, exec와 관련된 프로세스 스택의 크기는 어떻게 되나요?

스택 크기를 pthread_attr_getstacksize(&attr, &stacksize);으로 인쇄하는 프로그램을 작성했습니다. 그리고이 프로그램을 쉘에서 직접 실행하면 약 10MB의 값을 제공합니다. 하지만 exec은 멀티 스레드 프로그램에 속하는 스레드에서 약 2MB의 값을 제공합니다.

그래서 어떤 요소가 어떤 부모 프로세스에서 fork and exec -ed 프로세스의 스택 크기에 영향을 미치는지 알고 싶습니다. 그리고 실행 시간에 상위에있는 프로세스의 스택 크기를 fork and exec 전에 설정하는 것이 가능합니까?
미리 감사드립니다.

답변

20

pthread_create(3)에 대한 맨 페이지가 말한대로 다음 RLIMIT_STACK 자원 제한 (ulimit -s)를 설정하지 않는 한

, "리눅스/x86-32에 , 새 스레드의 기본 스택 크기는 2메가바이트입니다"에 그 경우 "새 스레드"의 기본 스택 크기를 결정합니다.

다음과 같은 프로그램으로, getrlimit(2)와 RLIMIT_STACK의 현재 값을 검색하여이 사실을 확인할 수 있습니다

: 그것을 실행하려고 명령 줄에서 (a.out로 컴파일)시

#include <pthread.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <sys/resource.h> 

int main() 
{ 
    /* Warning: error checking removed to keep the example small */ 
    pthread_attr_t attr; 
    size_t stacksize; 
    struct rlimit rlim; 

    pthread_attr_init(&attr); 
    pthread_attr_getstacksize(&attr, &stacksize); 
    getrlimit(RLIMIT_STACK, &rlim); 
    /* Don't know the exact type of rlim_t, but surely it will 
     fit into a size_t variable. */ 
    printf("%zd\n", (size_t) rlim.rlim_cur); 
    printf("%zd\n", stacksize); 
    pthread_attr_destroy(&attr); 

    return 0; 
} 

이러한 결과는 :

$ ulimit -s 
8192 
$ ./a.out 
8388608 
8388608 
$ ulimit -s unlimited 
$ ./a.out 
-1 
2097152 
$ ulimit -s 4096 
$ ./a.out 
4194304 
4194304 
+3

이 외에도 linux는 필요에 따라 스택을 자동으로 늘립니다.하지만 이러한 한계에 국한되지 않고 성장할 수있는 영역에서 사용 가능한 주소 공간의 한계도 있습니다. – nos

+1

nos, 메인 스레드 전용, 그렇지 않습니까? – osgx

1

man page for fork()에 따르면, "자식 프로세스를 포크()를 호출 한 스레드 하나에 생성된다."

따라서 하위 프로세스의 주 스레드 스택 크기는 fork()를 호출하는 스레드의 스택 크기가됩니다.

하지만 one of the exec() functions이 호출되면 (실제 작업을 수행하려면 궁극적으로 execve()이 호출 됨) 프로세스 이미지가 새 프로그램으로 바뀝니다. 이 때 스택은 스택 크기 소프트 제한 (커널 2.6.23 이상)에 따라 다시 생성되며 이는 getrlimit(RLIMIT_STACK, &rlimitStruct)을 호출하여 볼 수 있습니다.

당신은 (하드 제한을 증가 시키거나 하드 제한보다 소프트 제한 높게 설정하려고하지 않는 한) setrlimit(RLIMIT_STACK, &rlimitStruct)를 사용하여 소프트 제한을 설정하여 간부를 호출하기 전에이 작업을 제어 할 수 있습니다.

관련 문제