먼저 프로세스와 쓰레드의 정의부터 알아보자.
프로세스: 운영체제로부터 자원을 할당받는 작업의 단위
쓰레드: '프로세스' 내 실행되는 여러 흐름 단위
강의에서는 관리자가 여러 식당을 운영하고 있는데, 식당엔 로봇 직원이 있고 로봇 직원은 관리자의 영혼 하나가 빠르게 로봇 직원들에게 빙의하여 작동하여서 동시에 작동되는 것처럼 보이게 한다고 설명하였다.(사실은 너무 빨라 그래보이는 거지 동시 작동은 아니지만..)
여기서
식당이 있는 곳-> 유저 모드
관리자가 있는 곳-> 커널 모드
로봇 직원: 쓰레드
식당: 프로세스
영혼: CPU 코어
그러니까, 커널 영역에 있는 CPU 코어가 스레드 스케줄러를 통해 어떤 프로세스 내에 있는 스레드를 이곳 저곳 왔다갔다하여 작업을 한다는 뜻이다. 다만, 우선 순위가 높은 프로세스에만 정신이 팔려 우선 순위가 낮은 프로세스는 할당받을 수 없는 현상도 발생한다.(이를 기아, Starvation이라고 한다.)
메모리 내 프로세스의 영역 사진을 가져와봤다.(운영체제 시간에 배웠던 이미지) 전에 정의에서 언급한 것처럼, 한 프로세스 내엔 여러 개의 쓰레드가 존재할 수 있다. 여기서 한 프로세스엔 heap, data, text를 가지고 있으며 이는 자기만의 stack을 가진 스레드 또한 해당 영역을 공유한다. 이 구역들이 주로 무엇이 저장되냐면..
Stack: 지역변수, 매개변수가 저장되는 영역. 함수 끝나면 자동으로 반환된다.
Heap: 프로그래머가 동적으로 할당한 malloc, free, new, delete 등으로 할당되고 반환되는 영역이다.
Data: 전역 변수와 static 변수들이 저장된다.
Text: 우리가 작성한 코드들이 여기 저장된다.
그러니까, 쓰레드들은 자기만의 Stack을 가지니 문제가 없지만, 쓰레드들이 공유하는 Data 영역의 전역 변수, static 변수를 마구마구 이상하게 이용한다면 분명히 문제가 발생할 것이다. (그렇기에 이를 막기 위해 한 쓰레드만 들어가게끔 해야하는 영역을 임계 영역(Critical Section)이라고 하고, 한 쓰레드가 쓰고 있으면 다른 쓰레드가 못들어가게 하는걸 상호 배제(Mutual Exclusion)라고 한다.)
이를 위한 해결 방법은 Lock에서 다루는 걸로...