[OS] 멀티쓰레드와 멀티프로세스, 멀티코어

개요

다들 알고 있을 기본적인 OS 내용이지만, 오랜만에 생각해보니 헷갈리는 부분도 있어서 기억을 되살릴 겸 정리해보고자 한다.

 

프로그램과 프로세스, 스레드

 

프로그램은 정적인 실행 파일을 말한다. 이러한 프로그램이 CPU에 올라와서 실행되면 그것을 프로세스라고 한다. 프로그램은 Long-Term Scheduler에 의해서 CPU에 올라오고(Ready), 메모리를 할당받아 프로세스가 된다. 스레드는 프로세스가 할당받은 자원을 이용하는 작업의 단위를 의미한다. 

 

멀티프로세스와 멀티스레드

CPU는 한번에 하나의 프로세스만 실행할 수 있다. 따라서 CPU를 점유(Run)하고 대기(Wait)하는 과정, 즉 Context Switching을 통해서 여러개의 프로세스를 번갈아서 실행시켜 사용자에게는 동시에 실행중인 것처럼 보이게 하는데(동시성), 이 Context Switching 과정에는 부하가 발생할 수 밖에 없다.

 

따라서 스레드를 사용하여 Context Switching 비용을 절약할 수 있는데, 스레드는 각각 별도의 메모리를 갖는 프로세스와 다르게 Stack영역을 제외한 나머지 메모리 영역들을 공유하는 실행 단위이다.

 

이러한 Context switching 비용의 차이는 메모리의 재사용에 따라서 가상 메모리의 재사용 여부에서도 차이를 보인다. 멀티스레딩은 매핑 테이블 캐시인 TLB의 재사용이 가능하다. 물론 스레드간 공유하지 않는 메모리(스택)의 경우 TLB fault가 발생할 수 있지만, 나머지 공유가 이루어지는 메모리는 그대로 TLB hit이 이루어질 것이기 때문이다. 하지만 멀티프로세싱은 독립된 주소 공간을 가지므로, 동일한 가상 메모리 주소라고 해도 전혀 다른 물리 메모리 주소를 가리킬 것이며, 이는 매핑 테이블까지 모두 교체해야 함을 의미한다.

(추가 - 매핑 테이블을 교체한다기보다는, 각 프로세스가 참조하는 고유한 페이지 테이블이 있는데, 이것이 바뀌는 것)

 

이렇게 스레드는 공유 자원을 통해서 Context Switching 비용을 절약할 수 있지만, 공유 자원으로 인한 동기화 문제가 일어날 수 있을 뿐 아니라 하나의 스레드에 문제가 발생할 경우 전체 쓰레드에 문제가 발생할 수 있다. 대신 프로세스는 독립적이기 때문에 IPC를 통해서 통신해야 한다. 따라서 자원 공유를 위한 비용이 크지만, 동기화 작업이 필요하지 않다.

 

이렇게 멀티쓰레드와 멀티프로세스는 하나의 어플리케이션을 실행시키기 위해서 처리하는 방법에 대한 차이라고 이해하면 된다. 

멀티 프로세스 멀티 쓰레드
프로세스간 독립적인 메모리 구조를 가짐 쓰레드간 일부 메모리 자원을 공유
Context Switching 비용이 크다 Context Switching 비용 절약 가능
IPC를 사용하여 통신 (high cost) 공유 메모리를 사용하여 통신 (low cost)
동기화 작업 필요 X 동기화 문제 발생 가능, 문제시 전체 쓰레드에 영향

 

 

멀티코어

멀티 코어란 하드웨어적인 차이를 이용하여 병렬성을 제공하는 것을 말한다. 다시 말해 물리적으로 다수의 코어를 사용하여 동시에 하나 이상의 프로세스 또는 쓰레드가 동시에 실행되는 것을 의미하는 것이다. 

'[ CS기초 ] > 운영체제' 카테고리의 다른 글

[OS] 쉘과 init.c, fork-exec  (0) 2022.09.08
[OS] xv6 사용법 정리  (0) 2022.09.07