Computer Science/OS

[OS] 멀티 스레드(Multi Thread) vs 멀티 프로세스(Multi Process)

꽁치_로그 2022. 8. 14. 16:25
멀티 스레딩 (Multi Threading)

보통 우리가 작성하는 코드를 실행하면 하나의 프로세스로 동작합니다. 또, 하나의 프로세스는 보통 하나의 스레드만 사용하여 동작합니다. 아래의 파이썬 코드를 통해 알아보도록 하겠습니다.

1
2
3
4
5
6
7
8
9
import os
import threading
 
def run() -> None:
    print(f"process_id : {os.getpid()}")
    print(f"thread_id : {threading.get_ident()}")
 
if __name__ == "__main__":
    run()
cs

실행 결과는 다음과 같습니다.

process_id : 25939
thread_id : 4539137536

이렇게 하나의 프로세스에서 하나의 스레드만 사용하는 것 "싱글 스레딩"이라고 합니다. 우리가 작성하는 대부분의 코드들은 이렇게 싱글 스레딩입니다.

반면, 하나의 프로세스에서 여러 개의 스레드를 사용할 수도 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import os
import threading
from concurrent.futures import ThreadPoolExecutor
 
def run() -> None:
    print(f"process_id : {os.getpid()}")
    time.sleep(5# 5초 대기
    print(f"thread_id : {threading.get_ident()}")
 
# run 함수를 실행하는 2개의 스레드를 띄움
if __name__ == "__main__":
    with ThreadPoolExecutor() as executor:
        n_threads = 2
        for _ in range(n_threads):
            executor.submit(run)
cs

실행 결과는 다음과 같습니다.

# 같은 프로세스
process_id : 27180
process_id : 27180

# 5초 뒤

# 서로 다른 스레드
thread_id : 123145394302876
thread_id : 123145411092480

이렇게 하나의 프로세스에서 여러 개의 스레드를 사용하는 것"멀티 스레딩"이라고 합니다.

그렇다면 멀티 스레딩은 어떤 경우에 사용하면 좋을까요?

멀티 스레딩을 사용하는 대표적인 경우는 독립적인 I/O Bounded 작업이 많은 경우이고 크롤링 작업이 이에 해당됩니다.


멀티 프로세싱 (Multi Processing)

멀티 프로세싱은 프로그램 실행 시 2개 이상의 프로세스를 사용했을 경우에 해당됩니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import os
import threading
from concurrent.futures import ProcessPoolExecutor
 
def run() -> None:
    print(f"process_id : {os.getpid()}")
    time.sleep(5# 5초 대기
    print(f"thread_id : {threading.get_ident()}")
 
# run 함수를 실행하는 2개의 스레드를 띄움
if __name__ == "__main__":
    with ProcessPoolExecutor() as executor:
        n_threads = 2
        for _ in range(n_threads):
            executor.submit(run)
cs

실행 결과는 다음과 같습니다.

# 다른 프로세스
process_id : 28394
process_id : 28393

# 5초 뒤

# 서로 다른 스레드
thread_id : 4612054528
thread_id : 4766633472

그렇다면 멀티 프로세싱은 어떤 경우에 사용하면 좋을까요?

멀티 프로세싱을 사용하는 대표적인 경우는 독립적인 CPU Bounded 작업이 많은 경우이고 머신러닝 작업이 이에 해당됩니다.


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

멀티 스레드와 멀티 프로세스의 가장 큰 차이 점은 "메모리를 공유하는가?" 입니다. 멀티 스레드의 경우 여러 스레드가 하나의 프로세스 내에서 같은 메모리를 사용합니다. 반면 멀티 프로세스는 각 프로세스가 별도의 메모리 공간을 가집니다.

멀티 스레드는 멀티 프로세스보다 적은 메모리 공간을 사용하며 스레드간 Context Switching도 빠릅니다.

하지만 같은 메모리 자원을 사용하기 때문에, 각 스레드에서 자원 관리에 주의해야 합니다.(동기화 문제) 또한 하나의 스레드가 장애 시 전체 프로세스에 영향을 줍니다. 

 

반면에 멀티 프로세스는 멀티 스레드보다 더 많은 메모리 공간을 사용하며 프로세스간 Context Switching도 비교적 느립니다.

하지만 각각의 독립적인 메모리 공간을 가지기에 자원 관리를 더 쉽게 할 수 있습니다. 따라서 멀티 스레드에 비하면 시스템이 전체적으로 안정적입니다.

 

결론

메모리 공유가 필요하고 간단한 작업일 경우,  I/O Bound 작업 - 멀티 스레딩

독립적 메모리와 안정적 운영이 필요한 경우, CPU Bound 작업- 멀티 프로세싱

반응형

'Computer Science > OS' 카테고리의 다른 글

[OS] CPU Bound vs I/O Bound  (0) 2022.08.14
[OS] 병렬성과 동시성  (0) 2022.08.14
[OS] 프로세스(Process)와 스레드(Thread)  (0) 2022.08.13