# 멀티 프로세스와 멀티 스레드 ![image](https://hackmd.io/_uploads/Ski08ttap.png) - 멀티 프로세스 : 하나의 프로그램을 여러 개의 프로세스로 나누어 실행하는 것 - 멀티 스레드 : 하나의 프로세스 내에서 여러 개의 스레드를 가지는 것 ### 멀티 프로세스 ![image](https://hackmd.io/_uploads/BkMUDKF6p.png) - 멀티 프로세스는 운영체제 내에서 하나의 응용 프로그램에 대해서 동시에 여러 개의 프로세스를 실행할 수 있게 하는 기술을 말한다. - 하나의 부모 프로세스로부터 여러 개의 자식 프로세스가 생성되는 형태로, 각 프로세스는 독립적으로 실행되며, 프로세스 간 통신(IPC)을 통해 데이터를 주고 받을 수 있다. - 통신이 가능할 뿐이지 엄연히 서로 다른 프로세스다. 따라서 각 프로세스는 독립적인 메모리 공간을 가지며, 서로 다른 프로세스 간에는 메모리 공간을 공유하지 않는다. - 멀티 프로세스의 예시로는 브라우저의 탭이 있다. 브라우저는 각 탭마다 별도의 프로세스를 생성하여 실행한다. ![image](https://hackmd.io/_uploads/SyAJ_Ytaa.png) #### 멀티 프로세스의 장점 - 안정성: 하나의 프로세스가 비정상적으로 종료되더라도, 다른 프로세스에는 영향을 미치지 않는다. - 보안: 각 프로세스는 독립적인 메모리 공간을 가지므로, 다른 프로세스의 메모리에 직접 접근할 수 없다. - 병렬성: 여러 개의 프로세스가 동시에 실행되므로, 병렬성을 활용하여 시스템의 성능을 향상시킬 수 있다. - 멀티 스레드의 장점이기도 하다. - 시스템 확장성 : 멀티 프로세스는 다른 프로세스에 영향을 주지 않으므로 모듈의 추가나 변경이 용이하고 시스템의 규모를 쉽게 확장할 수 있다. - 예를 들어 서버의 경우, 여러 개의 프로세스를 생성하여 클라이언트의 요청을 처리할 수 있다. #### 멀티 프로세스의 단점 - 컨텍스트 스위칭 오버헤드 : 프로세스 간 전환 시, CPU가 다른 프로세스로 전환하는 과정에서 오버헤드가 발생한다. - 자원 공유의 비효율성 : 서로 다른 프로세스는 독립적인 메모리 공간을 가지므로 메모리의 낭비가 발생하고 프로세스 간 데이터 공유가 어렵다. 따라서 프로세스 간 통신(IPC)을 통해 데이터를 주고 받아야 하며, 이는 오버헤드를 발생시킨다. ### 멀티 스레드 ![image](https://hackmd.io/_uploads/S1IMucFTT.png) - 멀티 스레드는 하나의 프로세스 내에서 여러 개의 스레드를 가지는 것을 말한다. - 스레드는 프로세스 내의 메모리 공간을 공유하므로, 프로세스 간 통신(IPC)을 통해 데이터를 주고 받을 필요가 없다. - 멀티 스레드의 예시로는 웹 서버가 있다. 웹 서버는 클라이언트의 요청을 받아들일 때마다 새로운 스레드를 생성하여 처리한다. #### 멀티 스레드의 장점 - 스레드는 프로세스보다 가볍다 : 프로세스는 독립적인 메모리 공간을 가지지만, 스레드는 프로세스 내의 메모리 공간을 공유하므로, 프로세스보다 가볍다. 또한 스레드 간의 전환은 프로세스 간의 전환보다 빠르다. - 자원의 효율성 : 스레드는 프로세스 내의 메모리 공간을 공유하므로, 메모리 공간 효율성이 좋고 프로세스 간 데이터 공유가 용이하다. - 컨텍스트 스위칭 오버헤드 감소 : 스레드 간 전환은 프로세스 간 전환보다 빠르다. - 응답 시간 감소 : 스레드는 통신과 자원공유가 빠르고 컨텍스트 스위칭의 오버헤드가 적어 멀티 프로세스보다 빠르게 응답할 수 있다. ### 멀티 스레드의 단점 - 안정성 : 멀티 스레드는 프로세스 내의 메모리 공간을 공유하므로, 하나의 스레드가 비정상적으로 종료되면, 다른 스레드에도 영향을 미칠 수 있다. - 디버깅의 어려움 : 멀티 스레드는 프로세스 내의 메모리 공간을 공유하므로, 디버깅이 어려울 수 있다. - 동기화로 인한 성능 저하 : 여러 스레드가 동시에 공유 자원에 접근할 때, 동기화 문제가 발생할 수 있으며, 이로 인해 성능이 저하될 수 있다. ### 멀티 스레드의 사용 예 ```java class MyThread extends Thread { private int threadNumber; public MyThread(int threadNumber) { this.threadNumber = threadNumber; } public void run() { System.out.println("Thread " + threadNumber + " is running."); } } public class MultiThreadExample { public static void main(String[] args) { for (int i = 0; i < 5; i++) { MyThread thread = new MyThread(i); thread.start(); } } } ```