Computer Sturcture : Multiprocess vs Multithread
Multiprocess vs Multithread
- 공통점
멀티프로세스와 멀티스레드는 양쪽 모두 여러 흐름이 동시에 진행된다는 공통점을 가지고 있다.
- 차이점
멀티프로세스에서 각 프로세스는 독립적으로 실행되며 각각 별개의 메모리를 차지하고 있는 것
멀티스레드는 프로세스 내의 메모리를 공유해 사용할 수 있다. 또한 프로세스 간의 전환 속도보다 스레드 간의 전환 속도가 빠르다.
- 장점
멀티스레드의 다른 장점은 CPU가 여러 개일 경우에 각각의 CPU가 스레드 하나씩을 담당하는 방법으로 속도를 높일 수 있다는 것이다. 이러한 시스템에서는 여러 스레드가 실제 시간상으로 동시에 수행될 수 있기 때문이다.
- 단점
멀티스레드의 단점에는 각각의 스레드 중 어떤 것이 먼저 실행될지 그 순서를 알 수 없다는 것이 있다. 예를 들어, 두 스레드가 특정 공유 변수 i의 값을 1 증가시키는 명령을 실행할 때, 다음과 같은 방식으로 수행될 수 있다.
다른 프로세스에서 제어를 할 수가 없다.
process vs thread
멀티프로세싱은 말 그대로 독립적인 공간에서 독립적인 job이 돌아가는 것
멀티쓰레드는 한 process 안에서 메모리를 공유하면서 여러가지 job이 돌아가는 것이다. 예를들면 내가 Visual Studio Code안에서 여러가지 code을 돌릴 때, 이는 한 process 안에서 code가 돌아가는 것이기 때문에 이에 성능을 높이기 위해서는 multithreading을 해야한다.
또한 서버의 data, code, Heap을 공유하는 웹서버도 대표적인 멀티쓰레딩이다.
Python에서의 Multithread? or Multiprocess?
우리는 멀티쓰레딩을 왼쪽 그림처럼 하기를 바란다.
하지만 python은 GIL (Global Interpreter Lock)을 지향한다. CPython에서의 GIL은 Python 코드(bytecode)를 실행할 때에 여러 thread를 사용할 경우, 단 하나의 thread만이 Python object에 접근할 수 있도록 제한하는 mutex 이다.
따라서 GIL은 여러 인터프리터가 진행하는 것을 막기 떄문에, 쓰레드를 늘려봤자 성능은 쓰레드 하나를 쓰는 것 과 같은 현상이 나온다. 그렇기 때문에 파이썬에서는 멀티쓰레딩을 지원하지 않는다. 그리고 멀티쓰레딩은 잘 써야하는게 멀티쓰레딩은 메모리를 건드리기 때문에 메모리 explode가 일어날 수 도 있다.
따라서 파이썬에서는 멀티쓰레딩 보다는 멀티프로세싱을 선호한다.
from multiprocessing import Process
import paper_pnas_Ag
import paper_pnas_Au
if __name__ == "__main__":
pnas_Au_object = Process(target=paper_pnas_Ag.pnas_Ag, args=(74,))
pnas_Ag_object = Process(target=paper_pnas_Au.pnas_Au, args=(34,))
pnas_Au_object.start()
pnas_Ag_object.start()
참 쉽다. 그냥 multiprocessing을 입력하고 내가 만든 code를 입력한다.
내가 만든 code는 메인 함수로 정의를 해두고, Process 안에 target = func, args = parameter를 입력하면
두 개의 process가 동시에 돌아가는 것을 알 수 있다.
GIL에 대한 내용
https://blog.seulgi.kim/2015/01/global-interpreter-lock.html
https://wangin9.tistory.com/entry/pythonthreadGIL
https://gmlwjd9405.github.io/2018/09/14/process-vs-thread.html