
프로세스는 컴퓨터에서 실행되고 있는 프로그램을 말하며 CPU 스케쥴링의 대상이 되는 작업(task)이라는 용어와 거의 같은 의미로 사용된다.그리고 스레드는 프로세스 내 작업의 흐름을 지칭한다.
프로그램이 메모리에 올라가게 되면 프로세스가 되는 인스턴스화가 일어나고, 이후 운영체제의 CPU 스케쥴러에 따라 CPU가 프로세스를 실행하게 된다.
스레드는 프로세스의 실행 가능한 가장 작은 단위이다. 위 그림처럼 프로세스는 여러 스레드를 가질 수 있다.
멀티 프로세싱와 멀티 스레딩는 한 어플리케이션에 대한 처리방식이다. 단순히 프로그램을 여러개 띄워놓는 것이 멀티 프로세스가 아니라 이 둘은 언제 어느때에 어떤 방식으로 처리하느냐에 따라 다른것으로 이해해야 한다.
멀티가 붙은 이름에서 유추할 수 있듯이 멀티 프로세스와 멀티 스레드는 여러개의 프로세스, 스레드가 동작하는 것을 말한다. 한개가 아닌 다중으로 돌아감으로써 성능이 향상된다거나 하는 효과를 얻을 수도 있고 동시에 이로 인해 발생되는 부가적인 문제점도 존재한다.

멀티프로세싱은 여러 개의 '프로세스', 즉 멀티프로레스를 통해 동시의 두가지 이상의 일을 처리할 수 있는 것을 의미한다. 이를 통해 하나 이상의 일을 병렬로 처리할 수 있으며 특정 프로세스 메모리에 문제가 생겼을 경우, 다른 프로세스를 이용해서 처리할 수 있어 신뢰성이 높다는 장점이 있다. 대표적으로 웹브라우저가 멀티 프로세싱 구조를 가지고 있다.
멀티스레딩은 프로세스 내 작업을 여러 개의 스레드, 멀티 스레드로 처리하는 기법이며 스레드끼리 서로 자원을 공유하기 때문에 효율성이 높다. 예로 웹 요청을 처리할 때 새 프로세스를 생성하는 것보다 스레드를 사용하게 되면 훨씬 적은 리소스를 소비하며, 한 스레드가 중단 되어도 다른 스레드는 실행상태일 수 있어 중단되지 않은 빠른 처리가 가능하다. 또한 동시성에도 큰 장점이 있다. 하지만 한 스레드에 문제가 생기면 다른 스레드에도 영향을 끼쳐 쓰레드로 이루어져 있는 프로세스에 영향을 줄 수 있다는 단점이 있다.
최근 프로젝트를 작업할때도 언리얼에서 소켓서버를 열어 서버에서 보내주는 heartbeat 값을 확인할 일이 있었는데 이 경우도 별도의 스레드로 소켓을 만들었다.
공유자원은 시스템 안에서 각 프로세스,스레드가 함께 접근할 수 있는 모니터, 프린터, 메로리, 파일 등의 자원이나 변수 등을 의미한다. 이 공유 자원을 두 개 이상의 프로세스가 동시에 읽거나 쓰는 상황을 경쟁 상태(race condition)라고 한다. 동시에 접근을 시도할 때 접근의 타이밍이나 순서 등의 값에 따라 영향을 줄 수 있다.
이때 임계 영역은 위에서 말한 공유 영역에 둘 이상의 프로세스나 스레드가 접근할때 순서 등의 이유로 결과가 달라지는 코드 영역을 말한다. 이를 해결하기 위한 방법은 뮤텍스, 세마포어, 모니터 세가지가 있으며, 이 방법 모두 상호 배제, 한정 대기, 융통성이란 조건을 만족한다. 이 방법의 토대가 되는 매커니즘은 잠금(lock)이다.( 이 방법은 svn locked 시스템과도 유사하다. svn도 수정하고 있는 리소스를 잠금(lock)하게 되면 나 이외의 다른 사용자가 해당 파일을 수정해서 svn 서버에 못 올리게 된다.)
뮤텍스(mutex)는 프로세스나 스레드가 공유 자원을 lock()을 통해 잠금 설정하고 사용한 후에는 unlock()을 통해 잠금 해제하는 객체이다. 잠금이 설정되면 다른 프로세스나 스레드는 해당 리소스에 접근할 수 없다. 뮤텍스는 오직 잠금 (🔒lock), 잠금 해제 (🔓unlock) 상태만 있다.
세마포어(semaphore)는 일반화된 뮤텍스이다. 간단한 정수 값과 두 가지 함수 wait(P 함수라고도 함) 및 signal(V 함수라고도 함)로 공유 자우너에 대한 접근을 처리한다.
wait()는 자신의 차례가 올 때까지 기다리는 함수이며, signal()은 다음 프로세스로 순서를 넘겨준다.
프로세스나 스레드가 공유 자원에 접근하면 세마포어에서 wait()작업을 수행하고 프로세스나 스레드가 공유자원을 해제하면 세마포어에서 signal()작업을 수행한다. 프로세스나 스레드가 값을 수정할 때 다른 프로세스나 스레드는 동시에 세마포어 값을 수정할 수 없다.
모니터는 둘 이상의 스레드나 프로세스가 공유 자원에 안전하게 접근할 수 있도록 공유자원을 숨기고 해당 접근에 대해 인터페이스만 제공한다. 아래의 이미지처럼 모니터는 모니터큐를 통해 공유 자원에 대한 작업들을 순차적으로 처리한다.

참고 자료
반성하는 의미로 정리하는 프로세스와 스레드 실무하면서
"스레드로 처리해야 겠네"
"프로세스가 두개가 도네, PID로 두번 죽여야겠다"
같이 두가지를 사용했지만 명확한 이론 지식이 없었던 것 같다. CS의 기본 이론 지식이 정말 부족했구나를 깨닫고 어제 오늘 공부한내용 업로드한 포스팅.
바쁘다고 핑계대지 말고 꾸준히 공부해야겠다.
다음 포스팅은 멀티 스레딩, 멀티 프로세싱에 대한 차이점과 차이점에 따른 사용 경우에 대해 더 자세히 공부한 뒤 포스팅 해봐야겠다.