[c] 멀티스레딩과 멀티프로세싱

컴퓨터 프로그램이 동시에 여러 작업을 수행할 수 있는 능력은 현대 컴퓨터 시스템에서 매우 중요하다. 멀티스레딩과 멀티프로세싱은 이러한 작업을 처리하는 데 사용되는 두 가지 기본적인 접근 방식이다. 이번 포스트에서는 멀티스레딩과 멀티프로세싱의 개념과 주요 차이점을 살펴보겠다.

멀티스레딩 (Multithreading)

멀티스레딩은 단일 프로세스 내에서 여러 스레드가 동시에 작동하는 것을 말한다. 각각의 스레드는 별도의 작업을 수행하고, 이들은 공유된 자원에 접근하여 데이터를 공유한다. 멀티스레딩은 프로세스의 자원을 효율적으로 활용할 수 있으며, 동시에 여러 작업을 수행함으로써 성능을 향상시킬 수 있다.

멀티스레딩은 주로 병렬성(Parallelism)을 향상시키고, 대화형 응용 프로그램이나 네트워크 서버 등에서 유용하게 사용된다. 때로는 공유 자원에 대한 동기화 문제가 발생할 수 있으므로 주의가 필요하다.

// Java에서의 멀티스레딩 예제
class MyRunnable implements Runnable {
    public void run() {
        System.out.println("This is a thread running");
    }
}

public class Main {
    public static void main(String[] args) {
        Thread t1 = new Thread(new MyRunnable());
        t1.start();
        
        Thread t2 = new Thread(new MyRunnable());
        t2.start();
    }
}

멀티프로세싱 (Multiprocessing)

멀티프로세싱은 여러 개의 프로세스가 병렬로 동시에 실행되는 것을 말한다. 각각의 프로세스는 독립적으로 실행되며, 각 프로세스는 자체 메모리 공간을 가진다. 멀티프로세싱은 여러 CPU 코어를 활용하여 동시에 여러 작업을 처리할 수 있도록 한다.

멀티프로세싱은 주로 병렬 처리를 통해 더 많은 작업을 처리하고, 안정성이나 신뢰성을 높일 수 있다. 하지만 프로세스 간 통신과 프로세스 생성 등의 오버헤드가 발생할 수 있으며, 이로 인해 멀티스레딩보다 더 많은 자원을 소비할 수 있다.

# Python에서의 멀티프로세싱 예제
from multiprocessing import Process

def f(name):
    print('Hello,', name)

if __name__ == '__main__':
    p1 = Process(target=f, args=('Alice',))
    p2 = Process(target=f, args=('Bob',))
    p1.start()
    p2.start()
    p1.join()
    p2.join()

멀티스레딩과 멀티프로세싱의 비교

구분 멀티스레딩 멀티프로세싱
자원 공유 스레드 간 공유 메모리 공간 프로세스 간 분리된 메모리 공간
통신 오버헤드 적음 (공유 메모리를 통한 통신) 많음 (IPC, Inter-Process Communication)
성능 경량화, 빠른 컨텍스트 전환 무겁고 느린 프로세스 생성 및 컨텍스트 전환
안정성 및 신뢰성 문제가 발생할 경우 전체 프로세스 영향 프로세스 간 영향을 줄일 수 있음

두 기술 모두 병렬 처리를 통해 성능을 향상시킬 수 있지만, 각각의 장단점을 고려하여 적절한 상황에서 사용해야 한다.

결론

멀티스레딩과 멀티프로세싱은 동시에 여러 작업을 수행하는 데 있어 각자의 특징과 장단점을 가지고 있다. 프로그램의 목적과 환경에 따라 적절한 기술을 선택하여 사용해야 하며, 자원 활용 및 성능 향상을 위해 적절한 방법을 선택하는 것이 중요하다.

이상으로 멀티스레딩과 멀티프로세싱의 개념과 차이점에 대해 알아보았다.