[Python] Multi Processing과 [Java] Multi Processing 차이
🍎 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 작업을 처리할 수 있습니다.
• 결과적으로 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