Study/OS

[OS]멀티 프로세스와 멀티 스레드의 차이는 무엇일까?

검프 2021. 8. 20. 08:49

멀티 프로세스와 멀티 스레드는 둘 다 시스템의 컴퓨팅 성능을 높이는 데 사용되는 처리방식의 일종이에요.

혼용되는 키워드

실행단위

cpu core에서 실행하는 하나의 단위로 프로세스와 스레드를 포괄하는 개념이에요.
실행단위는 프로세스 일수도, 스레드일 수도 있어요.

프로세스

하나의 스레드만 가지고 있는 단일 스레드 프로세스에요.

동시성

한순간에 여러 가지 일이 아니라, 짧은 전환으로 여러 가지 일을 동시에 처리하는 것처럼 보이는 것이에요.
먼저 프로세스와 스레드에 대해 알아보도록 하죠.

프로세스

프로세스는 코드로 작성된 프로그램이 메모리에 적재되어 사용할 수 있는 상태가 된 것이에요.
프로그램 자체는 생명이 없어요. 프로그램은 보조 기억장치에 존재하며, 실행되기를 기다리는 명령어(코드)와 정적인 데이터의 묶음이에요.
즉, 프로세스는 실행 중인 프로그램이라 말할 수 있어요.

스레드

스레드(thread)란 프로세스(process) 내에서 실제로 작업을 수행하는 주체를 의미해요.
모든 프로세스에는 한 개 이상의 스레드가 존재하여 작업을 수행하고, 두 개 이상의 스레드를 가지는 프로세스를 멀티스레드 프로세스(multi-threaded process)라고 불러요.

멀티 프로세스(Multi process)

두 개 이상 다수의 프로세서(CPU)가 협력적으로 하나 이상의 작업(Task)을 동시에 처리하는 것이에요. (병렬처리)
각 프로세스 간 메모리 구분이 필요하거나 독립된 주소 공간을 가져야 할 경우 사용해요.

장점

  • 독립된 구조로 안전성이 높은 장점이 있어요.
  • 프로세스 중 하나에 문제가 생겨도 다른 프로세스에 영향을 주지 않아, 작업속도가 느려지는 손해 정도는 생기지만 정지되거나 하는 문제는 발생하지 않아요.
  • 여러 개의 프로세스가 처리되어야 할 때 동일한 데이터를 사용하고, 이러한 데이터를 하나의 디스크에 두고 모든 프로세서(CPU)가 이를 공유하면 비용적으로 저렴해요.

문제점

  • 독립된 메모리 영역이기 때문에 작업량이 많을수록( Context Switching이 자주 일어나서 주소 공간의 공유가 잦을 경우) 오버헤드가 발생하여 성능 저하가 발생 할 수 있어요.
  • Context Switching 과정에서 캐시 메모리 초기화 등 무거운 작업이 진행되고 시간이 소모되는 등 오버헤드가 발생해요.

Context Switching

  • CPU는 한 번에 하나의 프로세스만 실행 가능해요.
  • CPU에서 여러 프로세스를 돌아가면서 작업을 처리하는 데 이 과정을 Context Switching이라 불러요.
  • 구체적으로, 동작 중인 프로세스가 대기하면서 해당 프로세스의 상태(Context)를 보관하고, 대기하고 있던 다음 순서의 프로세스가 동작하면서 이전에 보관했던 프로세스의 상태를 복구하는 작업을 말해요.

멀티 스레드(Multi Thread)

개념

  • 하나의 프로세스에 여러 스레드로 자원을 공유하며 작업을 나누어 수행하는 것이에요.

https://user-images.githubusercontent.com/48986787/126673676-992e01be-01a1-41cc-9a07-f5d6c2f2bba4.png

장점

  • 시스템 자원 소모 감소 (자원의 효율성 증대)
  • 프로세스를 생성하여 자원을 할당하는 시스템 콜이 줄어 자원을 효율적으로 관리할 수 있어요.
  • 시스템 처리율 향상 (처리 비용 감소)
  • 스레드 간 데이터를 주고받는 것이 간단해지고 시스템 자원 소모가 줄어들어요.
  • 스레드 사이 작업량이 적어 Context Switching이 빨라요. (캐시 메모리를 비울 필요가 없음)
  • 간단한 통신 방법으로 프로그램 응답시간 단축
  • 스레드는 프로세스 내 스택 영역을 제외한 메모리 영역을 공유하기에 통신 비용이 적어요.
  • 힙 영역을 공유하므로 데이터를 주고받을 수 있어요.

문제점

  • 자원을 공유하기에 동기화 문제가 발생할 수 있어요. (병목현상, 데드락 등)
  • 주의 깊은 설계가 필요하고 디버깅이 어려워요. (불필요 부분까지 동기화하면, 대기시간으로 인해 성능 저하 발생)
  • 하나의 스레드에 문제가 생기면 전체 프로세스가 영향을 받아요.
  • 단일 프로세스 시스템의 경우 효과를 기대하기 어려워요.

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

  • 멀티 스레드는 멀티 프로세스보다 작은 메모리 공간을 차지하고 Context Switching이 빠른 장점이 있지만, 동기화 문제와 하나의 스레드 장애로 전체 스레드가 종료될 위험을 갖고 있어요.
  • 멀티 프로세스는 하나의 프로세스가 죽더라도 다른 프로세스에 영향을 주지 않아 안정성이 높지만, 멀티 스레드보다 많은 메모리 공간과 CPU 시간을 차지하는 단점이 있어요.
  • 두 방법은 동시에 여러 작업을 수행하는 점에서 동일하지만, 각각의 장단이 있음으로 적용하는 시스템에 따라 적합한 동작 방식을 선택하고 적용해야 해요.

Refer

https://www.geeksforgeeks.org/difference-between-multiprocessing-and-multithreading/

https://bowbowbow.tistory.com/16

https://wooody92.github.io/os/멀티-프로세스와-멀티-스레드/#개념

PCB 블럭이란?

답변

프로세스에 대한 정보를 담는 자료구조예요. 아래와 같은 구조를 가져요.

  • PID

운영체제가 각 프로세스를 식별하기 위해 부여된 프로세스 식별번호(PID, Process IDentification)

  • 프로세스 상태

CPU는 프로세스를 빠르게 교체하면서 실행하기 때문에 실행 중인 프로세스도 있고 대기 중인 프로세스도 있음. 그런 프로세스의 상태를 저장

  • 프로그램 카운터

CPU가 다음으로 실행할 명령어를 가리키는 값. CPU는 기계어를 한 단위씩 읽어서 처리하는데 프로세스를 실행하기 위해 다음으로 실행할 기계어가 저장된 메모리 주소를 가리키는 값.

  • 스케줄링 우선순위

운영체제는 여러 개의 프로세스를 동시에 실행하는 환상을 제공. 운영체제가 여러 개의 프로세스가 CPU에서 실행되는 순서를 결정하는 것을 스케줄링. 이 스케줄링에서 우선순위가 높으면 먼저 실행될 수 있는데 이를 스케줄링 우선순위라고 부름

  • 권한

프로세스가 접근할 수 있는 자원을 결정하는 정보. 안드로이드 앱을 예로 들면 아무 앱이나 휴대전화 통화내역을 볼 수 있는 권한을 가지면 이를 악의적으로 이용하는 앱이 등장할 것이다. 그래서 프로세스마다 어디까지 접근할 수 있는지에 대한 권한이 필요함.

  • 프로세스의 부모와 자식 프로세스

최초로 생성되는 init 프로세스를 제외하고 모든 프로세스는 부모 프로세스를 복제해서 생성되고 이 계층 관계는 트리를 형성. 그래서 각 프로세스는 자식 프로세스와 부모 프로세스에 대한 정보를 가짐

  • 프로세스의 데이터와 명령어가 있는 메모리 위치를 가리키는 포인터

프로세스는 실행 중인 프로그램. 따라서 프로그램에 대한 정보를 가지고 있어야 함. 프로그램에 대한 정보는 프로세스가 메모리에 가지는 자신만의 주소 공간에 저장됨. 이 공간에 대한 포인터 값을 가짐

  • 프로세스에 할당된 자원들을 가리키는 포인터
  • 실행 문맥

프로세스가 실행상태에서 마지막으로 실행한 프로세서의 레지스터 내용을 담고 있음. CPU에 의해 실행되는 프로세스는 운영체제에 의해 계속 교체되는데 교체되었다가 다시 자신의 차례가 되어서 실행될 때 중단된 적 없고 마치 연속적으로 실행된 것처럼 하기 위해 이 레지스터 정보를 가지고 있음.