프로세스와 쓰레드
프로세스(Process)
- 운영체제에서 할당 받는 지원 단위(실행 중인 프로그램)
- CPU 동작 시간, 주소공간이 독립적이다.
- 프로세스 영역인 Code, Data, Stack, Heap 영역이 독립적이다.
- 프로세스는 최소 1개의 메인 쓰레드를 보유한다. (구글 크롬 안에서 유튜브, 네이버, 넷플릭스 동작 중)
- 파이프, 파일, 소켓 등을 사용해서 프로세스간 통신이 가능하다. (Context Switching)
쓰레드(Thread)
- 프로세스 내의 실행 흐름 단위 (게임 안에서의 채팅, 음악, 아이템, 캐릭터 등)
- 프로세스의 자원을 사용 한다.
- Stack만 별도 사용하고 나머지는 공유한다. (Code, Data, Heap)
- 메모리를 공유한다. (변수 공유)
- 한 쓰레드의 결과가 다른 쓰레드의 영향을 미친다.
- 그래서 동기화 문제는 정말 주의해야 한다. (디버깅이 어렵기 때문, 로그가 안나올 수 있음)
멀티 프로세스(Multi-Process)
- 한 개의 단일 어플리케이션 : 여러 프로세스로 구성 후 작업을 처리함
- 한 개의 프로세스 문제 발생은 확산이 없다. 그냥 작업 종료하면 끝남 (kill -9)
- 캐시 체인지, Cost 비용이 매우 높다(오버헤드), 복잡한 통신 방식
멀티 쓰레드(Multi-Thread)
- 한 개의 단일 어플리케이션 : 여러 쓰레드로 구성 후 작업을 처리함
- 시스템 자원 소모가 감소(효율성), 처리량 증가(Cost 감소)
- 통신 부담이 감소, 디버깅이 어려움, 단일 프로세스에는 효과가 미약함(좋은 CPU가 많이 나옴), 자원 공유 문제(Deadlock)
Python Gil 이란?
Gil(Global interpreter lock)
- 파이썬의 실행 원리는 Cpython이라는 애가 해석을 해서 bytecode로 바뀌어서 실행된다. 단일 쓰레드만이 Python object에 접근하게 제한하는 mutex
- CPython 메모리 관리가 취약하기 때문이다. (Thread-safe 하지 않기 때문)
- 단일 쓰레드로도 충분히 빠르다.
- 프로세스 사용 가능(Numpy/Scipy)등 Gil 외부 영역에서 효율적으로 사용이 가능하다.
- 병렬 처리는 Multi-Processing 하면 된다.
- Thread 동시성을 완벽하게 처리하기 위해서는 Jython, IronPython 등이 있다.
Python은 실행 시 여러 쓰레드를 사용할 경우, 한 순간 하나 밖에 실행이 안된다. 멀티 쓰레드로 코드를 짰어도 하나 밖에 실행이 되지 않는다. 그렇게 제한해 놓은 것을 Gil 이라고 한다. 왜냐면 파이썬 언어를 만들때, 싱글 쓰레드일 때가 성능이 가장 빨랐기 때문에 파이썬 언어는 Gil이라는 것을 만든 것이다.
그래서 파이썬 만든 사람이 과거에는 Gil을 없애보고 여러가지 시도를 해봤는데 싱글 쓰레드가 가장 빨랐고, Gil을 없애지 않을 것이라고 선언했다. 그래서 Gil이 남아있게 된다. 그런다고 해서 다른 언어에 비해서 멀티 쓰레드가 느리진 않다.
.
'📌 Python' 카테고리의 다른 글
Python - 메모리 구조 및 메모리 할당 과정 (0) | 2022.01.24 |
---|---|
Mac - Conda가 안될 때, anaconda 터미널이 안켜질 때 (1) | 2021.06.16 |
Python - 시각화 기초2 (0) | 2021.01.31 |
Python - 시각화 기초 (0) | 2021.01.27 |
Python - Numpy 기초 (0) | 2021.01.27 |