최근에 프로그램 성능 향상을 위해 병렬 처리를 하고자 했으며,
이 포스팅은 스레딩을 사용할 것이냐 멀티 프로세스를 사용할 것이냐, 무엇이 더 적합한가에 대해 알아보고 고민을 하며 정리한 글이다.
1. 프로세스
프로세스는 프로그램이 실행되는 하나의 instance로 컴퓨터에서 연속적으로 실행 중인 프로그램을 의미한다.
각 프로세스는 각각 메모리 공간을 가지며 데이터를 저장하기 때문에 여러개의 프로세스를 사용할 때 하나의 프로세스가 죽어도 다른 프로세스에 영향을 끼치지 않아 작업이 중단되지 않는다.
2. 스레드
스레드는 하나의 프로세스 내에서 실행되는 흐름의 단위로 프로세스의 component이다.
하나의 프로세스에 여러 쓰레드가 생성될 수 있으며 부모 프로세스의 메로리 공간을 공유하기 때문에 하나의 프로그램이 실행될 때 모든 코드와 선언된 변수들이 생성된 모든 스레드들과 공유를 하게 된다. 이는 프로세스와 큰 차이점이라고 할 수 있는데 프로세스 간 오브젝트를 공유하기 위해서는 IPC모델을 사용해야만 한다.
3. 프로세스 vs 스레드
프로세스는 운영체제로 부터 자원을 할당받는 작업 단위이며 스레드는 프로세스가 할당받은 자원을 사용하는 실행 단위이다. 때문에 스레드를 사용하여 자원을 메모리에 할당하는 동작이 줄어 효율적인 자원 관리를 할 수 있다.
프로세스는 각각의 메모리 영역을 가지기 때문에 많은 양의 메모리가 필요하지만 각 프로세스에서 병렬로 cpu 작업을 할 수 있다. 또, 스레드는 많은 양의 메모리가 필요하진 않아 cpu 작업이 적고 I/O 작업이 많은 병렬 처리 프로그램에서 유용하게 사용할 수 있다.
4. 멀티 프로세싱 vs 멀티 스레딩
파이썬에서 병렬 처리를 구현하는 방법으로는 멀티 프로세싱과 멀티 스레딩이 있다.
멀티 프로세싱은 두개 이상의 프로세서가 작업을 동시에 처리하는 것으로 하나의 작업이 다수의 프로세서에 의해 처리된다. (프로세서는 cpu로 생각하면 편함.)
하지만 cpu는 하나의 프로세스만 관리하기 때문에 멀티 프로세싱은 다수의 프로세스를 실행한다긴 보단 cpu가 빠르게 각 프로세스를 순차적으로 실행하면서 동시에 실행되는 것 처럼 보이게 된다.
멀티 프로세싱의 대표적인 장점으로는 비용적으로 저렴하다는 것이 있다. 다시 말해 여러 프로세스가 처리될 때 동일한 데이터를 사용하면 이 데이터를 하나의 디스크에 두고 모든 프로세스가 공유하게 되면 비용적으로 저렴하다는 장점이 있다.
또 멀티 프로세싱을 사용한다면 하나의 프로세서가 죽어도 작업이 정지되지 않는다는 장점이 있지만 속도가 느려진다는 손해는 감수해야 한다.
멀티 스레딩은 여러 코어에서 한 번에 여러 스레드를 처리하는 것이다. 즉 하나의 프로세스를 다수의 실행 단위로 구분해 자원을 공유하고 자원 생성 및 관리 중복을 줄이고 수행 능력을 향상시킨다.
멀티 스레딩을 사용하는 이유는 프로세스를 통해 동시에 처리하던 일을 스레드로 구현하게 되면 메모리 공간과 시스템 자원 소모를 줄일 수 있기 때문이다. 또, 스레드 간의 데이터 공유와 같은 통신이 필요한 경우, 별도의 자원을 사용하지 않고 전역 변수 공간, 힙 영역을 이용해 데이터를 주고 받을 수 있어 캐시 메모리를 비울 필요가 없어 시스템 처리량이 향상되고 프로그램 응답 시간이 단축되는 장점이 있다.
하지만 멀티 스레딩은 각각의 스레드가 데이터와 힙 영역을 공유하기 때문에 변수 및 자료 구조에 신경을 써야 한다는 단점이 있다. 따라서 동기화 작업을 통해 작업 처리 순서와 공유 자원의 접근을 컨트롤 해야만 한다.
이때문에 과도한 락(lock)으로 인한 병목 현상이 발생할 가능성이 높다.
또, 스레드는 하나의 프로세스 안에서 작동하기 때문에 하나의 스레드가 죽으면 전체 프로세스에 영향을 끼치게 된다.
각각의 장단점을 고려해서 프로그램에 적합한 병렬 처리 방식을 사용하는 것이 좋다!
참고 링크 :
https://dgkim5360.tistory.com/entry/understanding-the-global-interpreter-lock-of-cpython