multithread의 메모리 변화

dandb3·2023년 5월 24일
0

이것저것 TMI

목록 보기
13/17
  • 원래는 master_canary 문제를 풀면서 알게된 점을 올리려고 하였으나, 궁금한 것을 찾는 과정에서 방향이 이상해져버림..
    일단 설명 드가자
  • 스레드 2의 스택 주소
  • vmmap한 결과
  • 스레드 3의 스택 주소
  • vmmap한 결과

보면 스택 주소의 차이는 0x801000인 것을 알 수 있고,
vmmap을 비교해 보았을 때 각 스레드별로 새로운 스택이 할당되는 것을 확인할 수 있다.

  • 뭔가 pthread_join을 하면 이 영역이 없어져버릴 것만 같은 기분..
    그래서 이번에는 테스트 코드를 짜서 다시 확인해 보았다.

  • 테스트 코드

    #include <pthread.h>
    #include <stdio.h>
    #include <unistd.h>
    
    void *thread_routine()
    {
        int elearn;
        printf("stack_address: %p\n", &elearn);
    }
    
    int main()
    {
        pthread_t thread_arr[5];
    
        for (int i = 0; i < 5; i++) {
            pthread_create(&thread_arr[i], NULL, thread_routine, NULL);
            usleep(100);
        }
        for (int i = 0; i < 5; i++) {
            pthread_join(thread_arr[i], NULL);
        }
        for (int i = 0; i < 5; i++) {
            pthread_create(&thread_arr[i], NULL, thread_routine, NULL);
            usleep(100);
        }
        for (int i = 0; i < 5; i++) {
            pthread_join(thread_arr[i], NULL);
        }
        return 0;
    }
  • 결과

    • 이 사진이 많은 정보를 말해준다.
    • 일단 예상과는 다르게 join했다고 해서 할당했던 메모리 영역이 할당 해제되지는 않는다.
    • 하지만 join한 이후로는 추가로 할당했을 때 이전에 스레드가 사용하던 영역을 그대로 사용한다는 것을 알 수 있다.
    • 심지어 순서도 보면, 딱 봐도 LIFO 형식의 리스트를 통해 관리한다는 것도 알 수 있다.(아닐수도)
    • 스레드마다 크기가 무려 0x800000인 메모리 영역이 할당됨. -> 멀티스레드 프로그래밍 할 때에 join을 적절하게 안 해주면 메모리 손해 음청나다. (물론 virtual memory기법때문에 크게 영향을 받지는 않긴 할 듯.)
  • Q: 왜 이렇게까지 함?

  • A: 그야 재밌으니까..

profile
공부 내용 저장소

0개의 댓글