프로세스와 스레드의 차이(Process vs Thread)
예전에는 프로그램을 실행하는 흐름은 프로세스 뿐이었는데 소프트웨어가 진보하면서 하나의 프로세스에서 복잡한 동시 작업을 요구하기 시작하였다. 이를 위해 하나의 프로그램이 여러 개의 프로세스를 생성하여 서로 통신하는 식으로 구현을 하게 되었는데 프로세스 특성상 이러한 동시 작업을 수월하게 할 수 없었다.
그러다보니 프로세스보다 작은 실행 단위가 필요하였고 그게 바로 스레드다. 하나의 프로세스에서 여러 개의 스레드가 메모리를 공유하여 코드를 실행한다. 프로세스와 달리 생성과 제거가 빠르고 작은 메모리를 점유하고 있어 정보 교환이 쉽고 Context Swithing 부하가 적다는 장점을 가지고 있지만, 그 대가로 자원 선점과 동기화 문제를 가지게 되었다.
대다수의 운영체제의 스케줄러는 스레드를 최소 단위로 하여 동작한다. 즉, 스레드가 코드 실행을 담당한다.
프로세스와 스레드의 차이 프로세스는 운영체제로 부터 자원을 할당받는 작업의 단위이고, 쓰레드는 프로세스가 할당받은 자원을 이용하는 실행의 단위
프로세스는 실행 중인 프로그램으로 디스크로부터 메모리에 적재되어 CPU의 할당을 받을 수 있는 것을 말한다
하지만 프로세스 생성은 많은 시간과 자원을 소비한다.
쓰레드는 프로세스의 실행 단위라고 할 수 있다.
한 프로세스 내에서 동작되는 여러 실행 흐름으로 프로세스 내의 주소 공간이나 자원을 공유할 수 있다.
이 경우 각각의 쓰레드는 독립적인 작업을 수행해야 하기 때문에 각자의 스택과 PC 레지스터 값을 갖고 있다.
Stack이 독립적으로 할당 되는 이유:
독립적인 실행 흐름 즉, 독립적인 함수 호출을 가능하게 하기 위해
스택은 함수 호출 시 전달되는 인자, 되돌아갈 주소값 및 함수 내에서 선언하는 변수 등을 저장하기 위해 사용되는 메모리 공간이므로 스택 메모리 공간이 독립적이라는 것은 독립적인 함수 호출이 가능하다는 것이고 이는 독립적인 실행 흐름이 가능하게 한다.
따라서 독립적인 실행 흐름을 위한 최소 조건으로 독립된 스택을 할당한다.
PC 레지스터를 독립적으로 갖는 이유 :
독립적인 실행흐름이 있으므로 Context Switching이 발생 하기 때문에 필요하다.
PC 값은 쓰레드가 명령어의 어디까지 수행하였는지를 나타나게 된다.
쓰레드는 CPU를 할당 받았다가 스케줄러에 의해 다시 선점 당한다. 그렇기 때문에 명령어가 연속적으로 수행되지 못하고 어느 부분까지 수행했는지 기억할 필요가 있다.
따라서 PC 레지스터를 독립적으로 할당한다.
Mutex / Semaphore / Monitor
공통점은 세가지 모두 운영체제의 동기화 기법이라는 것
뮤텍스 (Mutual Exclustion)
세모포어(Semaphore)
모니터(Monitor)