카테고리 없음

[OS] 멀티 프로세스 & 멀티 스레드 with Python

eunsour 2023. 1. 18.
반응형

프로세스 · 스레드 

프로세스가 디스크로부터 메모리에 적재되어 실행 중인 프로그램이라면 스레드는 프로그램을 실행하는 주체이다.

 

프로세스Code, Data, Stack, Heap의 구조로 된 독립된 메모리 영역을 할당받는다. 이들은 서로 격리되어 있으며, 별도의 고유한 주소 공간을 가진다. 운영 체제는 각 프로세스에 대한 완전한 정보를 유지관리하기 위해 데이터 구조를 사용하는데, 이를 PCB(Process Control Block)이라고 한다.

 

  • 프로세스가 서로 독립적이기 때문에 IPC를 사용한 통신을 한다.
  • 컨텍스트 스위치 비용이 비싸다.
  • 동기화 작업이 필요 없다.

 

스레드는 경량화된 프로세스이다. 한 프로세스 내에서 Stack만 할당받고, Code, Data, Heap 영역을 서로 공유한다.

 

  • 공유된 자원으로 통신 비용 절감 및 메모리 효율성이 높다.
  • 컨텍스트 스위치 비용이 적다.
  • 메모리를 공유하기 때문에 동기화, 데드락 등의 문제가 발생할 수 있다.

 

파이썬에서는 GIL(Global Interpreter Lock)이라는 것을 사용하여, 한 번에 한 스레드의 바이트 코드만 실행 가능하게 한다. 인터프리터는 모든 자원을 하나의 스레드에게 허용하고, 해당 스레드가 동작 중일 경우 다른 스레드는 동작하지 못하도록 제한한다. 이로 인해, 여러 스레드가 동시에 동일한 메모리 주소에 접근하거나 하는 레이스 컨디션 문제를 방지하며, 스레드 안정성을 보장한다.

 

따라서 파이썬은 싱글 스레드를 사용하는 언어이다. (우리가 일반적으로 사용하는 CPython의 경우)

그렇다면 멀티 스레드는 사용할 수 없을까?

 

멀티 스레드 

일반적인 멀티스레드는 하나의 프로세스를 여러 개의 스레드로 처리하는 작업을 의미한다. 이러한 작업은 엄청나게 빠른 컨텍스트 스위칭을 통해서 이뤄지는데 사용자에게는 이 작업이 동시에 이뤄지는 것처럼 보이게 된다(동시성).

 

멀티 스레드를 사용하면 응답 속도 및 시스템의 자원 소모 감축, 시스템 처리량 증가 등의 장점이 있지만 다음과 같은 문제점을 갖는다.

 

  • 컨텍스트 스위칭, 동기화 등의 과정에서 오버 헤드 발생으로 단일 스레드보다 속도가 느리다.
  • 하나의 스레드에 문제가 발생하면 다수의 스레드에 영향을 끼칠 수 있다.
  • 단일 프로세스 시스템의 경우 효과를 기대하기 어렵다.

 

파이썬에서의 멀티 스레드

파이썬에서의 멀티 스레드는 위처럼 메인 스레드 외의 추가적인 스레드를 이용하여 A 수행 B 수행 A 수행 과정으로 동작한다.

 

멀티 스레드로 프로세스를 실행하면 각 스레드 간에 GIL을 넘겨주는 작업이 발생하며 이는 병렬 실행이 아닌 컨텍스트 스위칭을 통해 동시성(Consequency)만을 제공한다. 병렬 처리를 위해서는 외부 라이브러리 혹은 multiprocessing 라이브러리를 사용해야 한다.

 

하지만 I/O 작업의 경우 GIL을 해제해서 다른 스레드가 실행할 수 있도록 해준다.

 

 

멀티 프로세스

멀티 프로세스는 멀티 스레드와 달리 병렬성(Parallelism)을 가지며, 각 프로세스에 대해 하나의 메모리 공간 즉, GIL을 갖는다. 각 프로세스가 개별적으로 실행되기 때문에, 하나의 프로세스에 문제가 발생해도 다른 프로세스에 영향을 끼지치 않지만 많은 리소스를 소모한다.

 

멀티 프로세싱은 CPU의 코어 성능을 최대화할 수 있는 방법이다. 각 프로세스를 코어마다 분할하여 동시에 진행하는 방식으로, 싱글 코어를 사용하는 것보다 압도적으로 빠른 연산 속도를 갖는다. 따라서 대규모의 연산 등의 업무를 수행하기에 적합한 방식이다.

 

문제는 연산 이전 프로세스 자체를 분할하는 과정 등이 복잡해 단순한 연산의 경우 싱글 스레드로 처리하는 것보다 속도가 늦을 수 있다.

 

 

결론 

  • 파이썬 인터프리터는 한 번에 하나의 스레드만 실행 가능하다.
  • 멀티 프로세스는 병렬성, 멀티 스레드는 동시성을 가진다.
  • 멀티 프로세스는 연산에 가장 적합하며, 멀티 스레드는 I/O에 가장 적합하다.

 

 

 

Reference

https://medium.com/@ksarthak4ever/python-threading-vs-multiprocessing-338724634bb6

https://binaryterms.com/process-in-operating-system.html

https://velog.io/@gil0127/%EC%8B%B1%EA%B8%80%EC%8A%A4%EB%A0%88%EB%93%9CSingle-thread-vs-%EB%A9%80%ED%8B%B0%EC%8A%A4%EB%A0%88%EB%93%9C-Multi-thread-t5gv4udj

반응형

댓글