Computer Science

[TIL][OS] 멀티 프로세스와 멀티 스레드의 차이, 컨텍스트 스위칭

쉬지마 이굥진 2024. 3. 26. 20:21

같이 항해하는 친구들끼리 진행해보기로 한 CS 스터디! aka 심포지엄 (ㅋㅋ)

이번에는 매번 읽고만 넘기고 자세히 짚어보지는 않았던 멀티 프로세스와 멀티 스레드의 차이에 대해 공부해보기로 했다.

이 둘의 차이에 대해 알아보기 전에 먼저 프로세스와 스레드란 뭔지 알아보자.

 

🔎 프로세스 (Process)란?

프로세스는 컴퓨터에서 실행 중인 프로그램을 의미한다.

실행 중인 프로그램은 메모리에 올라가서 CPU에 의해 실행되며, 이렇게 실행 중인 프로그램을 프로세스라고 부르는것이다.

프로세스는 운영체제(OS)에 의해 관리되고, 프로세스마다 자신의 주소 공간, 메모리, 입출력, 파일 등의 자원을 갖고 있다. 또한 하나의 프로그램이 여러 개의 프로세스로 분리되어 실행될 수도 있다!

즉, 프로세스란 '프로그램이 실행되서 메모리에 적재된 상태' 라고 보면 된다.

 

🔎 멀티 프로세스 (Multi-process)란?

'멀티'라는 말 그대로, 여러 개의 독립적인 프로세스가 동시에 실행되는 것을 의미한다. 

각 프로세스는 독립된 메모리 공간을 가지며, 자원 접근이 복잡하고 상대적으로 느리다.

멀티 프로세스 환경과 프로세스의 구조

✏️ 스레드 (Thread)란?

스레드는 프로세스 내에서 실행되는 작업의 단위다.

스레드는 프로세스 내에서 자원을 공유하면서 동시에 실행될 수 있다. 

하나의 프로세스에서 여러 개의 쓰레드를 생성하고 관리할 수 있으며, 각각의 스레드는 독립적으로 실행될 수 있다. 

스레드는 하나의 프로세스 내에서 작업을 분리하여 병렬적으로 실행함으로써 시스템의 성능을 향상시킬 수 있다.

 

✏️ 멀티 스레드 (Multi-Thread)란?

스레드는 프로세스 내에서 실행되는 작업의 단위라고 명시했었다.

멀티 스레드는, 하나의 프로세스 내에서 여러 스레드가 동시에 실행되는 것을 의미한다. 스레드는 프로세스 내에서 메모리 공간을 공유하며, 자원 접근이 간단하고 빠르다.

프로세스 내에 위치한 스레드. 각각 스택만 따로 있고 Code, Data, Heap 영역은 공유한다.


🤔 멀티 프로세스와 멀티 스레드의 차이가 뭘까 ?

멀티 프로세스와 멀티 스레드는 둘 다 동시에 여러 작업을 수행하기 위한 방법이지만, 그 구현과 동작 방식에서 차이가 있다.

 

  • 자원 공유
  • 멀티 스레드 : '프로세스 내'의 자원(ex. 메모리, 파일 등)을 공유하기 때문에 스레드 간의 데이터 공유가 쉽고 빠르다. 하지만 이로 인해서 동기화와 관련된 문제가 발생할 수 있다.
  • 멀티 프로세스 : 프로세스는 독립된 메모리 공간을 가지고 있기 때문에, 각 프로세스는 자원을 공유하기 위해 별도의 통신 매커니즘이 필요하다. 자원 공유가 더욱 안전하지만, 프로세스 간의 통신 비용이 발생할 수 있다. 

 

  • 성능
  • 멀티 스레드 : 스레드는 프로세스 내에서 메모리를 공유하고 *컨텍스트 스위칭 비용이 낮기 때문에, 작업 간의 전환 및 데이터 공유가 빠르다. 하지만 동기화 문제로 인해 예기치 않은 결과가 발생할 수 있다. 
  • 멀티 프로세스 : 프로세스는 독립된 메모리 공간을 가지고 있으며, 각각의 프로세스는 안전하게 독립적으로 실행될 수 있다. 하지만 프로세스 간의 통신 및 컨텍스트 스위칭 비용이 높아서, 성능상의 오버헤드가 발생할 수 있다.  

 

  • 안정성
  • 멀티 스레드 : 스레드는 같은 프로세스 내에서 실행되므로, 메모리 공간을 공유해서 데이터의 일관성을 유지하기 어렵게 만들 수 있다. 동기화와 관련된 문제를 제대로 처리하지 않으면 예기치 못한 버그가 발생할 수 있으니 주의해야한다.
  • 멀티 프로세스 : 프로세스는 독립된 메모리 공간을 가지고 있으므로, 각각의 프로세스는 안전하게 독립적으로 실행될 수 있다. 하지만 프로세스 간의 통신 및 동기화 문제를 고려해야 한다. 

 

쭉 읽다보니 컨텍스트 스위칭 비용이라는 단어가 나와서, 컨텍스트 스위칭이 뭐야? 라고 생각한 분도 있을 것 같다. 중요한 키워드이므로 꼭 기억하고 넘어가시면 좋겠다.

 

++ 🤔 컨텍스트 스위칭 이란 ?

컨텍스트 스위칭(Context Switching)은, switch([동사] 바꾸다, 변경하다)란 뜻 그대로 

CPU가 현재 실행 중인 프로세스/스레드와, 다음 실행할 프로세스/스레드 간에 실행 상태를 전환하는 작업을 말한다.

 

하나의 프로세스나 스레드가 실행 중인 동안 다른 프로레스나 스레드가 실행돼야 할 때, 현재 실행 중인 작업의 상태를 저장하고! 다음 작업의 상태를 로드하여 전환하는 과정이다.

 

컴퓨터를 하다보면 여러개의 프로그램을 띄워 놓고 작업을 해본적이 있을 것이다. 예를 들면, 메모장을 띄워놓고 타이핑을 하다가도 코드를 컴파일 하고, 구글에 검색을 하고 등등..

여러가지 프로그램을 실행중인 상태에서 하나씩 작업을 할 때, 우리는 각 프로그램에서 작업했던 부분들을 그대로 유지한채 이어서 작업을 진행해 나갈 수 있다.

 

초당 100번에서 1000번까지 일어나는 매우 빈번한 동작이기 때문에 성능에 매우 민감하다.

 

🤔 컨텍스트는 뭘까

 

컨텍스트 스위칭에서 '컨텍스트'는 뭘까. 조금 더 깊이 알아보자. 위의 설명에서 컨텍스트 스위칭을 할 때는, 프로세스들의 작업 위치를 유지한 채 실행할 수 있어야 한다. 어떻게 컴퓨터는 그 프로세스들의 작업 위치와 상태를 기억하고 유지할 수 있는 걸까 ?!!!?!!!

 

운영체제에는 프로세스들의 정보를 저장하는 별도의 메모리 공간이 존재한다. 그 공간을 PCB 라고 한다. 

PCB

명칭만 들으면 개념이 추상적으로 들릴 수 있는데, 우리가 흔히 볼 수 있는 [작업관리자] 창을 생각해보면 도움이 될 것이다. 작업관리자 창에선 현재 실행 중인 프로세스들을 모두 확인할 수 있다. 이때, 프로세스 고유 번호(PID), 프로세스들의 상태, 계정 정보, 사용 중인 메모리 할당 정보 등등 필요한 정보를 확인할 수 있는데, 이 정보들을 PCB에서 불러온다.

작업 관리자 창

 

다시 컨텍스트로 돌아가서, Context는 CPU가 해당 프로세스를 실행하기 위한 정보들이다. 이러한 정보들은 프로세스의 PCB (process control block)에 저장된다. 그래서 switching이 발생했을 때 이전에 하던 일을 이어서 할 수 있게 되는 것이다. 

 

🤔 컨텍스트 스위칭 세부 동작 과정

프로그램을 여러개 실행할 때 우리가 컴퓨터 화면으로 보기엔 프로그램 모두가 각각 동시에 실행되고 있는 것처럼 보인다. 하지만 실제 컴퓨터에선 동시에 실행되는 것이 아니라, 아주 미세한 시간 단위로 끊어서 프로세스를 돌아가며 실행시키고 있는 것이다.

엄청 미세한 시간 단위로 빠르게 프로세스를 교체로 돌리다 보니, 우리 눈에는 자연스럽게 동시에 실행되고 있는 것처럼 보이는 것이다. 

 

이 때 프로세스를 교체하면서 실행시킬 때는 각 프로세스의 상태를 그대로 유지하면서 실행시켜야 하기 때문에, 프로세스의 정보와 상태를 PCB에서 읽어온 뒤 이어서 실행 시킨 다음, 교체될 때 어디까지 실행됐는지 저장하는 과정이 필요하다.

 

이해하기 쉽게 예시를 들어 생각해보자.

 

1. 프로세스 1과 프로세스 2를 동시에 실행하려 한다. 👉 그러므로 프로세스1과 2가 서로 교체되는 컨텍스트 스위칭이 필요하다.

 

2. 프로세스1에서 프로세스2로 스위칭 될 때, 프로세스1의 PC와 SP 정보를 PCB에 저장한다.

* PC(Program Counter)는 다음 실행할 코드의 주소값을 가지고 있고, SP(Stack Pointer)는 코드의 함수가 어디까지 호출되어 있는지 위치값을 가지고 있다(PC와 SP 값을 잘 읽고 업데이트할 수 있다면, CPU는 프로세스가 어디까지 실행했는지 상태와 위치를 알 수 있다)

 

3. 기존에 저장되어 있던 프로세스2의 PC와 SP 값을 PCB에서 꺼내온 뒤 CPU의 레지스터에 PC와 SP 값을 업데이트 한다.

 

4. CPU는 업데이트 된 PC와 SP를 읽어 프로세스2를 실행한다.

 

5. 다시 2번으로 되돌아가 PC와 SP 값을 저장하고 업데이트하는 과정을 프로세스들이 종료될 때까지 반복한다.

2 ~ 4번 과정

 

 

위에서 언급한것처럼, 컨텍스트 스위칭은 운영체제의 핵심적인 기능이고, 굉장히 빈번하게 일어나는 현상이다. 그러나 컨텍스트 스위칭이 너무 많이 발생되면 오버헤드가 발생할 수 있다. 이 부분이 포스팅 상단에서 언급한 멀티 프로세스의 단점 중 하나이다.

 

오버헤드 현상을 막기위해선 컨텍스트 스위칭이 빠르게 수행되어야 한다. 따라서 컨텍스트 스위칭 시스템은 어셈블리어(기계어)로 작성되어 있다.

C 언어같은 고급언어보다 저급언어로 작성되면 컴퓨터가 읽는 속도가 빠르기 때문이다. 컴퓨터 입장에서는 어셈블리어를 읽어서 작업을 처리하는 것이 최적화 시간이 빠른 것이다.

 


📌 세 줄 정리 

멀티 프로세스와 멀티 스레드는 위에서 보았다시피 각각의 장단점을 가지고 있다. 따라서 두 개 중에 무조건 뭐가 좋아요! 보단, 사용하는 상황에 따라 적절한 방식을 선택해야 한다.

멀티 스레드작업 간의 소통이 많고 자원 공유가 필요한 경우에 유용하다.

멀티 프로세스독립성과 안정성이 중요한 경우에 적합하다. 

 

다음 포스팅에서는 멀티 스레드 환경에서의 주의점과 그것을 해결하기 위한 방안에 대해 포스팅해보겠다.