본문 바로가기
2021-1/Expert

python에서도 multiprocessing을 사용해야 하는 이유

by 이망고_ 2021. 12. 14.

https://frhyme.github.io/python-libs/multiprocessing_cpu_background/ 

 

python에서도 multiprocessing을 사용해야 하는 이유

Intro - multiprocessing.cpu_count 값이 이상한데?

frhyme.github.io

전 포스팅 중 컴퓨터 구조 이해하기에서 cpu, process, thread 를 짤막하게 설명했다.

프로젝트에서 사용하는 데 병렬처리로 효율적으로 데이터를 처리하기 위해서 멀티프로세싱을 하고 있었기 때문이어서

(사실 multiprocessing에 문제가 있어 우리는 core로 병렬처리해주었읍니다..)

더 공부해보니

여 포스팅에서 자세하게 재밌게 설명되어 있어 링크를 첨부합니다. 

import multiprocessing
multiprocessing.cpu_count() # 8

필자는 i5 *Quad-Core를 사용하고 있는데 multiprocessing 임포트해서 찍어보니 2배인 8개가 나왔다고 합니다.

*Quad = 4를 의미

이를 알기 위해서는 하이퍼스레딩, 프로세스, 스레드 등의 개념을 알아야 합니다. 

 

Core 와 Processor 는 다르다

  • 쿼드코어 CPU를 가지고 있다 : 일반적인 개념으로 4개의 *프로세서(Core)를 가지고 있다고 봐야지만, 찍어보면 프로세서의 수는 8개가 나옵니다. 
    • *프로세서 : Core / 프로세스 : Process
  • 코어 : 물리적인 프로세서
  • 쓰레드 혹은 프로세스 : 논리적인 개념
  • 이를 더 설명하기 위해 '하이퍼스레드'라는 개념이 필요하다.

Hyper-Threading(하이퍼스레딩)

하이퍼스레딩 : 하나의 코어(물리적 실행장치)에 두 개의 프로세서(논리적 실행장치)를 달아서 성능을 높이려는 전략

  • 쿼드코어지만 마치 옥타코어인 것처럼 돌아가는 것

Process 와 Thread (프로세스와 스레드)

  • 컴퓨터에서 어떤 프로그램을 실행하게 되면, 스토리지(하드 디스크)에 저장된 프로그램이 RAM으로 이동하게 됩니다. 이렇게 RAM에서 돌아가고 있는 프로그램을 보통 프로세스라고 부르고, 각 프로세스에는 좀 더 작은 단위인 쓰레드가 존재합니다
  • 과거에는 프로세스를 곧 하나의 작업 단위로 동작시켰습니다. 하지만 멀티태스킹 환경이 강화되면서 유저들은 다양한 프로세스를 메모리에 올리기 위해서는 꽤 큰 오버헤드가 필요하게 됩니다. 전문용어로는 '컨텍스트 스위치의 오버헤드가 커져서' 라고 말합니다.
  • 이처럼, 하나의 프로세스가 거대해짐에 따라서 발생하는 컨텍스트 스위칭 오버헤드를 감소하기 위해 프로세스를 여러개의 작은 단위인 스레드로 분할해서 동작하게 만들었습니다. 이로 인해, 컨텍스트 스위칭 코스트가 감소하고 효율성이 개선되었습니다.
  • 결과적으로 스레드는 '메모리에 적재되는 최소 작업 단위' 정도로 해석하면 됩니다.

멀티 스레드, 멀티 스레딩

  • 스레드가 여러 개인 경우 '멀티스레드'라고 부르며, 이를 처리하기 위한 과정을 '멀티스레딩'이라고 부릅니다.
  • 100kg을 운반할 수 있는 사람 a 와 50kg을 운반할 수 있는 사라 b, c가 있다고 하겠습니다. 100kg에 가까운 일을 시켜야 한다면, 무조건 a가 더 효과적이겠지만, 50kg의 일들을 처리해야 한다면, 당연히 b, c와 일하는 것이 2배로 효율적입니다.
  • 다만, 앞서 말한 바와 같이, b, c간에 호흡에서 문제가 발생하지 않도록 Thread 스케쥴링을 진행해야하기 때문에, 추가적인 업무 분담이 들어갑니다. 그리고 이는 프로그래머 입장에서 좀 까다로운 일입니다.

Processor의 수가 많을 수록 좋은가?

  • Processor, 즉 '프로세스를 담당하고, 이 프로세스 내에 존재하는 여러 스레드를 처리해 주는 아이'가 많다고 합시다. 추가로, 만약 하나의 프로세스를 두 개 이상의 프로세서로 수행한다면, 해당 프로세스 내에 존재하는 여러 스레드들이 이 프로세서들로 분리되어 실행됩니다.
  • 병렬 프로그래밍을 알지 못했을 때에는, 이렇게 서로 다른 두 스레드를 컴퓨터가 알아서 인지하고 각 프로세서에게 분배해준다고 생각했었습니다. 하지만, 절대로 그렇지 않습니다.
  • Processor의 수가 많다고 했을 때, 이 Processror들을 효과적으로 사용하기 위해서는 프로그램 개발 시에 항상 '병렬 프로그래밍'을 인지하고 개발해야 합니다.

'2021-1 > Expert' 카테고리의 다른 글

Expert | No module named Error 해결하기  (0) 2021.12.27
Expert | 2021.12.13(월) Task  (0) 2021.12.23
Expert | rawdata 코드 수정  (0) 2021.12.13
Expert | Analyzer code 이해부터 먼저하기  (0) 2021.12.13
20211206(월) 지수팀 Task  (0) 2021.12.07