pthread의 기본 스택 크기


24

내가 이해하는 것처럼 Linux에서 pthread의 기본 스택 크기는 16K입니다. 64 비트 Ubuntu 설치에서 이상한 결과가 나타납니다.

$ ulimit -s
8192

또한:

pthread_attr_init(&attr);
pthread_attr_getstacksize(&attr, &stacksize);
printf("Thread stack size = %d bytes \n", stacksize);

Prints
    Thread stack size = 8388608 bytes

스택 크기가 "8388608"이 아니라고 확신합니다. 무엇이 잘못 될 수 있습니까?


7
나는 생각한다 8388608 / 1024 = 8192.
cuonglm

6
스레드 커널 스택 당 16k를 생각하고 있습니다. 사용자 공간 스택 메모리에서 문제를 완전히 분리합니다. 커널 스택은 페이징되거나 지연 할당 될 수없고 물리적 메모리에서 연속적인 페이지 여야하므로 크기가 작습니다. elinux.org/Kernel_Small_Stacks . 주소 공간이 제한된 경우, 특히 32 비트에 대해 기본적으로 8k 스택을 사용하는 i386의 경우 총 스레드 수가 극히 많으면 문제가 될 수 있습니다.
Peter Cordes

답변:


21
int pthread_attr_setstacksize(pthread_attr_t *attr, size_t stacksize);

stacksize속성은 작성된 스레드 스택에 할당 된 최소 스택 크기 (바이트)를 정의해야합니다.

귀하의 예에서 스택 크기는 ulimit -s 일치하는 So 명령에 의해 반환되는 8MB에 해당하는 8388608 바이트로 설정됩니다 .

로부터 pthread_create()설명 :

리눅스 / x86-32 , 새 스레드의 기본 스택 크기는 2메가바이트 . NPTL 스레딩 구현 에서 프로그램 시작시 RLIMIT_STACK 소프트 자원 한계에 "무제한"이외의 값이 있으면 새 스레드의 기본 스택 크기를 판별합니다. 사용 은 pthread_attr_setstacksize를 (3), 스택 사이즈 속성을 명시 적으로 디폴트 이외 스택 크기를 얻기 위해서는, 스레드를 생성하는 데 사용 ATTR 인수에 설정 될 수있다.

따라서 스레드 스택 크기는 위의 set 함수 또는 ulimit시스템 속성을 통해 설정할 수 있습니다 . 16k의 경우, 어떤 플랫폼을 보았는지 또는 시스템 제한이 설정되어 있는지 확실하지 않습니다.

이에 대한 흥미로운 예 는 pthread_create 페이지여기참조 하십시오 .


47

실제로 가상 스택 크기 8388608 바이트 (8MB)입니다. 물론, 이것이 옳지 않다는 결론을 내리는 것은 당연합니다. 왜냐하면 그것은 모든 스레드가 스택에 소비하는 엄청나게 많은 양의 메모리이기 때문에 몇 KB 정도의 시간이 99 %이면 필요할 것입니다.

좋은 소식은 스레드 가 실제로 필요한 실제 메모리 양만 사용 한다는 것입니다. 이것은 프로세서에서 하드웨어 MMU (Memory Management Unit)를 사용하여 OS가 얻는 놀라운 힘 중 하나입니다. 다음과 같은 일이 발생합니다.

  1. OS는 스레드에 대한 MMU의 페이지 테이블을 설정하여 스택에 8MB의 가상 메모리를 할당합니다. 이것은 페이지 테이블 항목 만 보유하기 위해 RAM이 거의 필요하지 않습니다.

  2. 스레드가 실행되고 아직 물리적 페이지가 할당되지 않은 스택의 가상 주소에 액세스하려고하면 "페이지 결함"이라는 하드웨어 예외가 MMU에 의해 트리거됩니다.

  3. CPU 코어는 권한있는 실행 모드 (자체 스택이 있음)로 전환하고 커널 내에서 페이지 오류 예외 처리기 함수를 호출하여 페이지 오류 예외에 응답합니다.

  4. 커널은 실제 RAM 페이지를 해당 가상 메모리 페이지에 할당하고 사용자 공간 스레드로 돌아갑니다.

사용자 공간 스레드에는 해당 작업이 없습니다. 관점에서 볼 때 메모리가 모두 함께있는 것처럼 스택을 사용합니다. 한편, 스택은 스레드의 요구를 충족시키기 위해 자동으로 커지거나 커지지 않습니다.

MMU는 오늘날 컴퓨터 시스템 하드웨어의 핵심 부분입니다. 특히, 시스템의 많은 "마법"을 담당하므로 MMU의 기능과 가상 메모리에 대해 더 많이 배우는 것이 좋습니다. 또한 응용 프로그램이 성능에 민감하고 많은 양의 데이터를 처리하는 경우 TLB (MMU의 페이지 테이블 캐시)의 작동 방식과 TLB 적중률을 최대화하기 위해 데이터 또는 알고리즘을 재구성하는 방법을 이해해야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.