• Home
  • About
    • Jang photo

      Jang

      Jang's blog

    • Learn More
    • Email
    • Facebook
    • Github
  • Posts
    • All Posts
    • All Tags
  • Projects

(python) multithreading과 multiprocessing 요약

16 Jan 2018

Reading time ~1 minute

프로세스(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


python Share Tweet +1