공부/Operating system

OS : Thread - API

상연 2022. 4. 28. 02:25

목차

    학부 수업 내용을 필기한 내용입니다.
    필자가 이해를 제대로 못하고 정리한 경우 틀린 내용이 있을 수 있습니다.
    그러한 부분이 있다면 댓글로 이야기하여 수정하게 해 주시면 감사하겠습니다.

     

    pthread_create 함수에 대해 아까 알아봤었다.

    다만 아까와는 조금 다른 점이, 실행할 함수에 넘겨주는 인자인데

    하나밖에 못 넘겨주므로 구조체를 생성해서 넘겨주었다.

    main함수에서 구조체 args를 만들고 그 안에는 int a, b의 값이 저장되어있다.

    이후 pthread_create로 쓰레드가 생성되고

    T1의 Stack에는 args의 주소가 넘겨왔으므로

    T1은 main함수의 Stack을 참조해서 값을 받아온다.

    그렇다면 T1이 사용하는 것은 자신의 것이 아닌 타인의 스택

    이 프로세스는 외부와는 격리되어있지만,

    각 쓰레드는 각자의 Stack을 갖고 있고, 공유할 데이터는 공유하고 있다는 것이다.

    이번에는 생성되는 쓰레드가 Malloc을 사용해서 메모리 공간을 할당하는것이다.

    이 코드에 대해 설명을 해 보자면

     

    • Main 함수가 실행되면서 쓰레드를 생성한다
    • 쓰레드는 생성되면서 Main 함수에 있던 구조체 args를 인자로 받는다
    • 쓰레드는 생성하면서 프로세스내의 쓰레드가 공유하는 자원공간인 힙에 메모리를 할당한다
      • 할당한 공간의 주소는 쓰레드 T1의 rvals에 저장된다
      • 메인함수에도 같은 이름의 rvals가 있으나 그것과는 별개
    • T1은 할당한 공간에 지정한 값을 입력해준다
    • 그 후. T1 쓰레드는 rvals 할당한 메모리 주소를 반환하면서 종료된다
    • Main 함수는 Join을 사용했었기 때문에 T1이 끝나기를 기다리고 있었고 T1이 반환한 값을 자신의 rvals에 저장하게 된다. 이제 메인과 쓰레드 T1의 rvals은 같은 곳을 가리킨다.
    • 같은곳을 가리켰는지 확인하기 위해 출력을하고 메인은 종료된다.

     

    이러한 경우도있다

    쓰레드를 생성하고 그 인자로 간단하게 정수값만 전달.

    다만 값을 전달할때 (void *) 이렇게 포인터 형식으로 값은 전달되었고

    그렇게 받은 값들을 다시 (long long int)로 변환해서 사용하였다는것

     

     

    mythread 함수의 이런 경우를 살펴보자

    Line 4를 보면

    myret_t oops;

    구조체를 T1의 Stack에 생성했다.

    그리고 그것의 주소를 Return 하게 되는데

    이것을 참조할 수 있을까?

    Life Time에 따라 많은 가능성이 있지만 대체적으로는 참조가 된다 하더라도 불안정하고(그 위치에 언제 다른 것이 덧 씌워질지 모름), 이미 쓰레드가 끝나서 사라졌을수도있다.

    결론적으로는 좋지 않다!

    상기 위의 다른 경우들의 경우에는 공유되는 자원에 할당되었기에 문제가 없었는데

    이 경우에는 아니기에 문제가 발생한다.