프로세스(Process)와 스레드(Thread)
프로세스(Process)
실행되고 있는 프로그램의 인스턴스. CPU 시간이나 메모리 등의 시스템 자원이 할당되는 독립적인 개체이다.
프로세스 간 자원을 공유할 때, context switching
때문에 발생하는 오버헤드(overhead)가 상대적으로 더 크다.
context switching
: 문맥 교환(Context Switch)이란 하나의 프로세스가 CPU를 사용 중인 상태에서 다른 프로세스가 CPU를 사용하도록 하기 위해, 이전의 프로세스의 상태(문맥)를 보관하고 새로운 프로세스의 상태를 적재하는 작업을 말한다. 한 프로세스의 문맥은 그 프로세스의 프로세스 제어 블록에 기록되어 있다.
스레드(Thread)
스레드는 프로세스 내부에 존재하며, 프로세스의 자원(일부 메모리, heap 등)을 공유한다. 각 스레드는 별도의 레지스터와 스택을 가지고 있지만, 힙 메모리는 서로 읽고 쓸 수 있다.
다른 스레드에서 같은 자원을 동시에 변경하는 경우에 문제가 생길 수도 있으므로, 동기화나 Lock을 통해 자원을 보호해야한다.
Lock이란, 공유자원에 붙여서 해당 자원에 대한 접근을 동기화 하는 것이다. 스레드가 해당 자원을 접근하려면 우선 그 자원에 있는 락을 획득해야 한다.
GIL(Global Interpretor Lock)
인터프리터도 자원을 보호해야 한다.
GIL의 장점
- 인터프리터의 구현이 쉬워진다.
- 가비지 컬렉터를 만들기도 좋다.
- C/C++ 확장 모듈을 만들기에도 좋다.
GIL의 단점
- CPU를 동시에 단 하나밖에 사용하지 못한다.
python에서의 Multithreading
- 아무짝에도 쓸모없는 건 아니다! I/O가 많을 땐 유용.
- 결국엔 multiprocessing이 답.
- 근데 이게 야매는 아님. 왜냐하면 어차피 쓰레드는 한 컴퓨터에 갇히기 때문에, 머신을 넘어선 대량 분산에는 프로세스가 답이다.
- 프로세스를 여러 머신에 뿌리기 위한 라이브러리 -> parallel Python