쓰레드(Thread)
- 프로세스 내에서 실제로 실행중인 주체. 프로세스 내에 여러개가 있을 수 있다.
쓰레드는 프로세스로부터 독립적인 스택 공간과 레지스터(ex. Stack Point Register, Program Counter Register, Frame Pointer Register)를 갖고 있으면서, 동시에 Code, Heap, Data 영역은 쓰레드끼리 공유한다.
-> 왜 쓰레드는 스택과 PC, SP, FP Register를 공유하지 않는지 생각해보면 당연하다. 쓰레드는 독립적인 실행 흐름을 갖고 있다고 했다. 독립적인 실행 흐름을 갖는다는 말은 쓰레드마다 실행중인 라인이 다를 수 있다는 것이고, 독립적으로 함수 호출이 가능하다는 것이므로 호출 스택과 관련된 SP, FP를 따로 갖는게 당연하다 .
프로세스(Process)
- 메모리에 올라와서 실행중인 프로그램. 프로세스는 OS로 부터 시스템 자원을 할당받는다.
할당 받는 시스템 자원
1. CPU 시간
2. Code영역, Stack영역, Heap영역, Data 영역으로 이루어진 독립된 메모리 영역
3. 주소 공간
멀티 쓰레딩이 멀티 프로세스에 비해 좋은 점
프로세스끼리의 Context Switching은 쓰레드끼리의 Context Switching보다 무겁고 느리다
-> 프로세스끼리는 공유하는 메모리가 없기 때문에 Context Switching이 발생하면 발생하는 오버헤드가 크다. 프로세스끼리는 독립된 메모리 영역을 갖는다. 프로세스가 같은 logical address를 쓴다 해도, 그 메모리는 실제 매핑된 physical address는 다를 것이므로, 프로세스가 Context Switching되면 Cache도 reset해줘야 한다. 그래서 프로세스간 Context Switching할 때 오버헤드가 Thread간 Context Switching할때 발생하는 오버헤드보다 크다.
멀티 쓰레드를 사용할 때 주의할 점
쓰레드끼리는 Code, Heap, Data 영역을 공유한다. 그 말은 이 영역에 여러 쓰레드들이 전역 변수나 동적 할당된 메모리에 동시 접근이 가능하다는 의미이므로 data race condition이 생길 수도 있다.
PCB에도 PC(Program Counter)가 있고, 쓰레드도 개별적으로 PC를 가지는데 다른건가?
우선 나와 비슷한 의문을 가진 분이 있고, 쉽게 설명해주신 링크가 있었다(https://www.inflearn.com/questions/489172)
정리를 하면 멀티 쓰레드 & 멀티 프로세스 환경에서 A 쓰레드 -> B 쓰레드로 Context Switching이 일어난다고 가정을 해보자. 이때 A 쓰레드가 실행하던 명령어의 다음 명령어를 가리키는 Program Counter는 PCB가 아닌 자신의 TCB(Thread Control Block)에 저장한다. 또한 B 쓰레드의 TCB의 PC 레지스터를 CPU에 있는 PC Register에 저장한다. 즉 CPU안에 있는 PC Register도 존재하며 TCB에 쓰레드 별 PC를 저장하는 공간도 따로 있는 것
'공부 > 운영체제' 카테고리의 다른 글
시스템 콜(System Call) (0) | 2022.09.06 |
---|---|
데드락(Deadlock) (0) | 2022.09.02 |
Spin Lock, Semaphore, Mutex (0) | 2022.09.02 |
Windows에서의 동기화 기법 (0) | 2022.01.22 |