‘동시’ 라는 말 때문에 한 순간에 여러가지 작업이 함께 진행되고 있다고 이해하기 쉽다. 그러나 실제로 CPU는 한 순간에 하나의 프로세스만을 실행할 수 있음.
실제로 프로세서는 아주 짧은 시간동안 수십~수천번씩 실행할 프로세스를 계속 교체해가며 작업하고 있기 때문에 우리는 동시에 여러개의 작업이 실행되고 있다고 느끼게 된다.
❓ 한 번에 여러가지 요리를 만들 때 보통 동시에 n가지 요리를 만든다고 말하지만, 실제로는 이 요리 살폈다가, 저 요리에 소금 넣고, 또 이 요리 간 보고… 이렇게 번갈아가면서 작업을 하고 있는 것과 비슷하다.
프로세스를 제어하기 위한 정보 모음
프로세서가 프로세스를 스위칭하면서 작업을 하기 위해선 어느 작업을 어디까지 진행했는지를 매번 불러와야 함. 이 불러올 정보들을 저장해놓는 공간.
💡 Context Switching ?
프로세서가 작업(task)을 교체하는 시점마다 어느 작업을 어디까지 진행했는지 저장도 하고, 어디서부터 시작해야 하는지 새로 로딩해오는 시간이 필요한데, 이 순간을 컨텍스트 스위칭이라고 한다.
작업 흐름에 여러 갈래가 생기는 경우 여러개의 프로세스로 하나의 작업을 구성할 수 있다.
그러나 이렇게 여러개의 프로세스로 나누어 한 작업을 진행할 경우, 비슷한 작업임에도 불구하고
이런 비효율을 개선하기 위해 스레드
라는 개념이 탄생하게 됨.
멀티 스레드의 경우 하나의 프로세스 내에서 다수의 실행 단위로 구분하여 작업을 수행하는 방식으로, Code, Data, Heap을 공유하기 때문에 캐시 메모리에 적재된 것들을 스위칭하는 과정이 필요치 않으며, PCB의 레지스터 블록들만 교체하면 되어 멀티 프로세스에 비해 컨텍스트 스위칭 시간이 훨씬 절약된다.
❓ 왜 Stack은 공유하지 않는가?
스택은 함수 호출 시 전달되는 인자, 되돌아갈 주소값, 함수 내에 선언하는 변수 등을 저장하기 위한 메모리 공간이다. 스택 메모리 공간이 독립적으로 존재해야 독립적인 함수 호출이 가능하고, 독립적인 실행 흐름이 추가되게 된다. 즉 독립적인 실행 흐름을 추가하기 위한 최소 조건으로 각 스레드마다 스택이 할당 되는 것.
❓ 왜 PCB의 레지스터 블록은 공유하지 않는가?
같은 프로세스 내에서 작업이 이루어지더라도 각 스레드별 CPU 스케줄링이 필요하며, 어느 부분까지 작업을 수행하였는지 기억할 필요가 있기 때문.
멀티 스레딩의 경우 자원 소모, 속도 측면에서는 절약적이나, 하나의 스레드가 종료될 경우 연계된 모든 스레드가 종료될 수 있다는 위험성이 있고, 멀티 프로세스의 경우 한 프로세스가 종료되어도 다른 프로세스에 영향을 미치지 않지만 자원 소모, 속도 측면에서 뒤떨어진다. 적용해야 하는 시스템에 따라 적합/부적합이 구분되므로, 대상 시스템의 특징에 따라 선택과 적용이 필요하다.
[10분 테코톡] 👩💻👨💻 쪼밀리와 오구의 Process vs Thread
https://youtu.be/DmZnOg5Ced8