2 분 소요

멀티 프로세싱 (Multi-processing)

멀티 프로세싱은 다수의 프로세서가 서로 협력적으로 일을 처리하는 것을 의미한다. 컴퓨터는 1대인데 프로세서(CPU)는 2개 이상이다. 보통, 멀티코어시스템(multi-core system)을 포함한다.

img

많은 양의 작업을 빠른 시간에 처리하기 위해 단일 프로세서보다 멀티 프로세서로 처리하는 것이 빠르다. 여러 개의 프로세서가 작업을 병렬처리 하는 것이라 정의할 수 있다.

멀티 프로세싱의 장점

  • 비용 절약 가능

    프로세서가 주변장치, 대용량 저장 장치, 정원 공급 장치를 서로 공유하고 있기 때문이다.

  • 높은 신뢰성

    여러 개의 프로세서에 분산한다면, 한 프로세서가 고장나더라도 시스템이 정지하는 것이 아니라 속도만 느려지게 된다.

멀티 프로세싱의 단점

  • context switching에서의 오버헤드

    프로세스는 각각의 독룁된 메모리 영역을 할당 받았기 때문에 프로세스 사이에서 공유하는 메모리가 없어, context switching이 발생하면 캐슁에 있는 모든 데이터를 모두 리셋하고 다시 캐쉬 정보를 불러와야 한다.

  • 프로세스 사이의 통신이 복잡함

    프로세스는 각각의 독립된 메모리 영역을 할당 받았기 때문에 하나의 프로그램에 속하는 프로세스들 사이의 변수를 공유할 수 없다. 자원 공유를 위해 별도의 IPC (Inter-Process Communication)을 구현해야 하여, 멀테 스레딩에 비해 운영체제에게 부담을 줄 수 있다.

멀티 프로그래밍 (Multi-programming)

초기의 컴퓨터에서는 하나의 프로그램이 메모리에 올라가면 하나의 프로그램만 CPU가 처리를 진행할 수 있었다. 이 과정에서 프로세서의 처리 속도와 입출력 속도 간의 차이로 인해, 입출력이 완료될 때까지 프로세서는 idle한 상태가 된다. 따라서 이는 프로세서의 자원 낭비로 이루어진다.

프로세서가 입출력 작업의 종료를 대기할 동안 하나의 프로세서에서 다른 프로그램을 수행할 수 있도록 하는 것이 멀티프로그래밍이다.

멀티 태스킹 (Multi-tasking)

Task란 운영체제에서 처리하는 작업의 단위 또는 정해진 일을 수행하기 위한 명령어 집합을 뜻하는데 (process 보다 확장된 개념), 멀티 태스킹은 task를 OS의 스케쥴링에 의해 task를 번갈아가며 수행하는 것을 의미한다. 여러개의 task를 자주 번갈아가며 수행하다보니 사용자는 동시에 여러 task가 수행되고 있다고 느끼게 된다.

멀티프로그래밍 vs 멀티태스킹

멀티 프로그래밍은 프로세서의 자원낭비를 막기 위함이고, 멀티태스킹은 정해진 시간동안 각각의 task를 번갈아가며 수행하는 것을 의미한다.

멀티 스레딩 (Multi-threading)

멀티 스레딩은 하나의 프로세스 내의 여러 개의 실행 단위이며, 여러 개의 스레드끼리 자원을 공유하는 것을 뜻한다.

멀티 스레딩의 장점

  • 시스템 자원 소모 감소 (자원의 효율성 증대)

    프로세스를 생성하여 자원을 할당하는 시스템 콜이 줄어들어 자원을 효율적으로 관리할 수 있다.

  • 시스템 처리량 증가 (처리 비용 감소)

    스레드 간 데이터를 주고 받는 것이 간단해지고 시스템 자원 소모가 줄어들게 된고, 스레드 사이의 작업량이 많아 context switching이 빠르다.

  • 간단한 통신 방법으로 인한 프로그램 응답 시간 단축

    스레드는 프로세스 내의 stack 영역을 제외한 모든 메모리를 공유하기 때문에 통신의 부담이 적다.

멀티 프로세싱 vs 멀티 스레딩

  • 멀티프로세싱은 fork를 통해 프로세스를 다수개로 늘려 여러 개의 프로그램들을 병렬로 처리하며, 멀티스레딩은 하나의 프로그램 안에서 병렬 처리를 한다.

  • 멀티 스레딩은 스레드들끼리의 자원 공유가 가능하며, 프로그래밍을 통해 구현 가능하나, 멀티 프로세싱은 OS에서 지원하는 것으로 독립된 메모리를 가지며, 서로 간의 자원 공유가 이루어지지 않는다.

  • 멀티 스레드는 멀티 프로세스보다 적은 메모리 공간을 차지하고 Context Switching이 빠른 장점이 있지만, 동기화 문제와 하나의 스레드 장애로 전체 스레드가 종료 될 위험을 갖고 있어 안정성이 떨어진다.

  • 멀티 프로세스는 하나의 프로세스가 죽더라도 다른 프로세스에 영향을 주지 않아 안정성이 높지만, 멀티 스레드보다 많은 메모리공간과 CPU 시간을 차지하는 단점이 있다.

왜 멀티 프로세스로 할 수 있는 작업들을 굳이 하나의 프로세스에서 스레드로 나눠가며 할까?

운영체제가 시스템 자원을 효율적으로 관리하기 위해 스레드를 사용한다. 멀티 프로세스로 실행되는 작업을 멀티 스레드로 실행할 경우, 프로세스를 생성하여 자원을 할당하는 시스템 콜이 줄어들어 자원을 효율적으로 관리할 수 있다. 또한, 프로세스 간의 통신보다 스레드 간의 통신 비용이 적으므로 작업들 간 통신의 부담이 줄어든다. (처리비용 감소. 프로세스는 독립구조이기 때문)

그렇다면 무조건 멀티 스레드가 좋을까?

스레드를 활용하면 자원의 효율성이 증가하기도 하지만, 스레드 간의 자원 공유는 전역 변수를 이용하므로 동기화 문제가 발생 할 수 있으므로 프로그래머의 주의가 필요하다.

댓글남기기