TIL

[Python] Multi Processing과 [Java] Multi Processing 차이

친환경사과 2023. 4. 24. 20:12

🍎 Python Crawling Application을 개발하면서 I/O Bound 작업 처리는 Thread를 사용해 처리하는 것이 유리하고 CPU Bound 작업 처리 시엔 자식 프로세스를 여럿 생성해 작업을 처리하는 것이 유리하다고 배웠습니다. 그런데 Java 진영에선 Multi Processing을 어떻게 처리할까요?

 

❓ 어디서부터 비롯된 궁금증인가요?

• Python 진영에선 Multi Processing을 자식 프로세스를 생성해 CPU Bound 작업을 맡아하는 반면 Java 진영에선 여러개의 JVM Instance를 추가적으로 생성해 처리하지 않습니다. 어떤 방식으로 Java 진영에서 Multi Processing을 처리할까요? 

 

🍎 Java는 Thread를 통해서 Multi Processing 문제를 해결합니다.

 정확히 이야기하자면 Thread를 통해 CPU Bound 처리를 수행합니다.

 JVM Instance를 두 개 생성해 처리하진 않지만 "ProcessBuilder"를 통해 JVM위에 새로운 프로세스를 만들어 사용할 수 있지만 이 방법은 지양합니다.

 

❓ 왜 Java ProcessBuilder 사용을 지양하나요?

• 새로운 프로세스를 생성하는 것이 시스템 자원을 많이 소모하기 때문입니다. 즉, 새로운 프로세스를 생성하는 것이 메모리와 CPU 자원을 많이 소모하고 자주 사용하게 되면 성능 이슈가 발생할 수 있기 때문입니다.

• Multi Processing 시 Process 사이 통신과 동기화 작업이 필요할 수 있는데 이는 많은 오버헤드를 발생시킵니다. 이는 성능에 좋지 않습니다.

 ProcessBuilder를 통해 외부 프로세스를 여럿 실행시켜 요구사항을 해결할 수 있지만 Tool 사용의 복잡성과 성능 측면을 봤을 때 요구사항 해결이라는 득 보다 성능 저하, 복잡성 증가의 실이 더 큽니다. 더 나은 대안을 찾아야합니다.

 

🍎 어떤 구조로 되어 있길래 Java는 Thread를 통해 CPU Bound 작업을 처리하나요?

• JVM도 프로그램이기 때문에 실행하게 되면 디스크에 저장되어 있는 실행 파일을 운영체제가 읽어 들인 다음 메모리에 적재합니다. 이때 적재된 메모리 영역은 해당 실행 프로그램이 실행되는 동안 사용됩니다.

 실행된 JVM은 Thread를 생성해 사용할 때 OS의 Thread를 사용합니다.

 

• OS는 해당 Thread를 관리하기 위해 Scheduling 알고리즘을 사용합니다. Scheduling 알고리즘은 CPU 자원을 어떻게 할당할지 결정하며, Process와 Thread를 처리하는 데 사용됩니다.

 즉, OS가 Thread들을 관리해 Multi Core 자원을 할당해 사용하기 때문에 JVM에서 Multi Core를 통해 CPU Bound 작업을 처리할 수 있습니다.

위와 같은 모습으로 Thread를 통해 Multi Core 자원을 사용할 수 있습니다.!

• 결과적으로 Java는 Multi Thread를 통해 Multi Process를 해결합니다. 자세히 이야기하자면 CPU Bound 작업이죠.!

 

➕ Python의 Multi Processing 처리 방식은 이 곳을 통해 확인하실 수 있습니다.

🍎 표현 방식은 다르지만 문제를 해결하기 위해 각 진영에서 다른 전략으로 병렬처리를 지원하는 모습이 재미있었습니다. 


📚 참고 자료

https://www.quora.com/Does-JVM-use-multiple-cores

https://stackoverflow.com/questions/34689709/java-threads-and-number-of-cores

https://www.guru99.com/difference-between-multiprocessing-and-multithreading.html

https://insanelysimple.tistory.com/226

https://www.logicbig.com/tutorials/core-java-tutorial/java-multi-threading/java-memory-model.html