목차
학부 수업 내용을 필기한 내용입니다.
필자가 이해를 제대로 못하고 정리한 경우 틀린 내용이 있을 수 있습니다.
그러한 부분이 있다면 댓글로 이야기하여 수정하게 해 주시면 감사하겠습니다.
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에 따라 많은 가능성이 있지만 대체적으로는 참조가 된다 하더라도 불안정하고(그 위치에 언제 다른 것이 덧 씌워질지 모름), 이미 쓰레드가 끝나서 사라졌을수도있다.
결론적으로는 좋지 않다!
상기 위의 다른 경우들의 경우에는 공유되는 자원에 할당되었기에 문제가 없었는데
이 경우에는 아니기에 문제가 발생한다.
'공부 > Operating system' 카테고리의 다른 글
OS : Lock - Controlling Interrupts (0) | 2022.05.03 |
---|---|
OS : Locks - The Basic Idea (0) | 2022.05.03 |
OS : Concurrency - Race Condition (0) | 2022.04.28 |
OS : Concurrency : 병행성 - Intro(2) (0) | 2022.04.28 |
OS : Concurrency : 병행성 - Intro(1) + Thread (0) | 2022.04.28 |