- parallel
- concurrent
- 서로 격리되고 leverage가 큰 유형의 작업들을 처리할 때
- 격리: 프로그램의 다른 부분과 상태를 공유할 필요가 없는 함수를 실행한다는 뜻
- 레버리지: 부모와 자식 사이에 주고받아야 하는 데이터 크기는 작지만, 이 데이터로 인해 자식 프로세스가 계산해야 하는 연산의 양이 상당할 때
- 여러 CPU/GPU로 연산 가능
- 여러 개의 자식 프로세스 중 하나에 문제가 발생하면, 그 자식 프로세스만 죽는 것으로 해결할 수 있다.
- 메모리 공유가 불가능
- context switching 에서의 overhead
- 무거운 작업이 진행되어 많은 시간이 소요된다.
- CPU 레지스터 교체, RAM-CPU 사이의 캐쉬 메모리에 대한 데이터 초기화 필요
- 참고: context switching?
- 동작 중인 프로세스가 대기를 하면서 해당 프로세스의 context를 보관하고,
- 대기하고 있던 다음 순서의 프로세스가 동작하면서, 이전에 보관했던 프로세스의 상태를 복구하는 작업을 말한다.
- blocking I/O 를 parallel 하게 처리할 수 있다.
- 파일 여러 개 읽고/쓰는데 적합하다.
- 리펙토링이 쉽다.
- 메모리 공유 가능: 통신이 빠르다.
- 자원의 효율적 관리
- 단일 CPU/GPU로 연산 가능
- 공유 리소스에 동시에 접근하는 경우를 잘 고려햐여 Lock을 걸어야 한다.
- Lock을 자주 쓰면, 코드가 읽기 어려워져 복잡해지고, 시간이 지남에 따라 스레드를 사용한 코드를 확장하고 유지 보수하기도 더 어렵다.
- 단일 CPU/GPU 연산만 가능
- GIL(Global Interpreter Lock, 여러 thread가 있어도 CPU 자원을 사용할 수 있는 스레드는 1개) 때문에 parallel 연산 불가
- I/O는 데이터 Input Ouput
- 어떤 디바이스를 통해 입력과 출력이 이뤄지는 작업을 전부 I/O라고 합니다.
- I/O 에서 발생하는 시간은, CPU 대기 시간에 속합니다.
- 예시: 파일 읽거나 쓰기, 네트워크와 데이터 주고 받기(소켓 통신 등), 디스플레이 장치와 통신하기 등
- I/O 작업이 진행되는 동안, user process가 자신의 작업을 중단한 채, I/O가 끝날 때까지 대기하는 방식을 의미한다.
- 호출되는 I/O 함수가 제어권을 가져가서 block 하는 경우
- blocking I/O는 파이썬이 특정 시스템 콜을 사용할 떄 일어남
- 시스템 콜을 이용하여, OS가 자기 대신 외부 환경과 상호 작용하도록 의뢰한다.
- 파이썬 thread가 시스템 콜을 하기 전에 GIL을 해체하고, 시스템 콜에서 반환되자 마자 GIL을 다시 획득하기 때문