이전 포스팅에 프로세스와 스레드에 대한 개념 정리를 했었다. 프로세스와 스레드에 대한 개념을 잡았으나 그 외에 멀티 로 시작하는 개념들에 대해서 정확히 이해를 하지 못해 정리해보고자 한다.
멀티 프로그래밍은 하나의 프로세서(CPU)가 하나의 프로세스를 수행하는 동안 다른 프로세스에 접근할 수 있도록 하는 방법을 의미한다.
과거에는 하나의 프로세서가 하나의 프로세스만 처리할 수 있도록 설계가 되어있어 프로세서의 처리 속도와 입출력 속도 간의 차이로 인해 입출력 처리가 완료될 때까지 기다리는 비효율적인 상황이 발생했었다.
멀티 프로그래밍은 입출력이 완료될 때까지 기다리는 시간을 버리지 않고 다른 프로세스를 처리할 수 있도록 해주는 것이다.
출처: https://donghoson.tistory.com/17
카카오톡을 이용하면서 게임을 할 수 있는 것 처럼 다양한 작업을 동시에 사용할 수 있도록 해주는 개념이다. 프로세서는 특정 순간에 하나의 작업만을 수행할 수 있지만, 다수의 작업을 운영체제의 스케줄링에 의해 우리가 느끼지 못하는 시간마다 작업을 번갈아가며 수행하여 우리 눈에는 동시에 수행되는 것처럼 보이게 해주는 것이 바로 멀티 태스킹이다.
멀티 태스킹의 스케줄링 방식에는 멀티 프로그래밍 방식, 시분할 방식, 실시간 시스템 방식 이 있다.
멀티 프로그래밍은 위에서 언급하였고, 시분할 방식은 CPU의 전체 사용 시간을 작은 작업 시간량으로 분할하여 그 시간량 동안 작업에게 번갈아가며 CPU를 할당해 주는 방식을 의미한다. 실시간 시스템 방식은 말 그대로 실시간으로 처리해 주는 것을 의미한다.
즉, 멀티 태스킹은 다수의 작업을 운영체제의 스케줄링에 의해 번갈아 가며 수행되도록 해주는 것을 의미한다.
앞서 말한 멀티 태스킹 동작은 Context-Switching 이라고 한다. Context-Switching은 하나의 프로세스가 CPU를 사용 중인 상태에서 다른 프로세스가 CPU를 사용하도록 하기 위해 이전의 프로세스의 상태를 보관하고 새로운 프로세스의 상태를 적재하는 작업을 말한다. Context-Switching은 운영체제의 CPU 자원을 할당하는 스케줄러에 의해 발생한다.
CPU 스케줄러 는 레디 큐에 존재하는 프로세스들을 특정한 우선 순위를 기반으로 CPU를 할당받게 해주는 역할을 한다. CPU를 최대한 활용하고 대기 시간을 최소화하고 처리량을 최대화하는 목적을 가지고 있으며, 다양한 스케줄링 알고리즘이 존재한다.
멀티 프로그래밍은 프로세서가 작업을 처리할 때 낭비되는 시간동안 다른 프로세스를 처리하도록 해주는 스케줄링의 한 방식이라면, 멀티 태스킹은 다수의 작업을 정해진 시간동안 각각의 작업을 번갈아가며 수행하는 것을 의미한다.
멀티 프로그래밍은 멀티 태스킹을 구현하는 스케줄링의 한 방식이라고 생각하면된다. 멀티 프로그래밍 용어보다는 멀티 태스킹이라는 용어를 쓰는 것이 일반적이라고 한다.
개인적으로 멀티 프로그래밍은 방법이라면 멀티 태스킹은 동작이라는 관점에서 볼 수 있을 것 같다. 헷갈리기에 멀티 태스킹을 수행하기 위한 방법에는 멀티 프로그래밍이 있다! 는 정도로만 이해하고 넘어가면 될 것 같다. 😅
멀티 프로세싱은 다수의 프로세서가 일을 처리하는 것을 의미한다. 보통 하나의 프로세서가 하나의 작업을 맡지만 멀티 프로세싱은 다수의 프로세서가 다수의 작업을 함께 협력해서 처리하는 것을 의미한다.
멀티 프로세싱은 하나의 프로세서가 고장이 나도 해당 프로세서가 진행 중인 작업은 다른 프로세서에서 수행하고 있기 때문에 작업이 정지되지 않는다. 또한 여러 개의 프로세스가 처리되어야 할 때 동일한 데이터를 사용한다면, 각 데이터를 각 프로세서에게 할당할 필요 없이 하나의 공간에 데이터를 저장한 후 이를 공유하여 사용하도록 한다면 비용을 절약할 수 있다. 단, 속도가 느려지는 정도의 손해는 발생한다.
즉, 여러 개의 프로세서가 작업을 병렬처리하는 것으로 정의하는 것이 정확한 표현이다.
출처: https://donghoson.tistory.com/17
멀티 스레딩은 하나의 프로세스를 다수의 스레드로 구분하여 자원을 공유하고 자원의 생성과 관리의 중복성을 최소화하여 수행 능력을 향상시키는 것을 의미한다.
즉, 하나의 프로세스가 동시에 여러 개의 스레드를 수행할 수 있도록 해주는 것이다.
하나의 프로세스에는 하나 이상의 스레드가 존재할 수 있다. 프로세스를 생성하는 비용보다 스레드를 생성하는 비용이 더 저렴하기 때문에 프로세스에 다수의 스레드를 생성하여 병렬처리하는 것이다. 또한 프로세스는 데이터, 힙, 스택 영역을 서로 공유하지 않지만 스레드는 스택 영역을 제외한 데이터, 힙 영역을 서로 공유하기 때문에 메모리 부분에서도 훨씬 효율적이다.
멀티 태스킹은 운영체제에서 지원해주는 것이기에 서로 간의 자원을 공유하지 못하지만 멀티 스레딩은 서로 간의 자원 공유가 가능하다는 점에서 차이가 있다. 멀티 태스킹에서 자원을 공유하기 위해서는 IPC를 구현해야하며 멀티 스레딩에 비해 운영체제에 부담을 줄 수 있다.
프로세스를 생성하는 것보다 스레드를 생성하는 것이 더 효울적이라고 앞에서 언급했다. 그렇다면 멀티 프로세스보다는 멀티 스레드가 더 좋은것을까? 답은 아니다. 😯
멀티 프로세스와 멀티 스레드 중에서 어느하나가 좋은가에 대한 부분은 상황에 따라서 다르다. 대표적으로 크롬 브라우저를 예를 들 수 있다.
크롬 브라우져는 멀티 프로세스를 하면서 멀티 스레드를 한다. 각각의 탭들은 프로세스로 구성되어있다. 실제로 작업 관리자를 열어보면 각 탭 별로 프로세스가 실행되고 있는 것을 알 수 있다. 따라서 하나의 프로세스가 죽더라도 다른 프로세스는 살아있는 구조된다. 또한 서로 메모리를 공유하지 않기 때문에 보안적으로 안전하다고 할 수 있다.
반대로 하나의 탭의 각 페이지 안에서는 멀티 스레드로 동작하여 각 페이지 안에서 한번에 여러 일을 처리한다. 하나의 다운로드가 끝나지 않았음에도 다른 다운로드를 시작할 수 있고, 이미지 로딩이 끝나지 않아도 그 다음 글들의 로딩이 되어있는 것처럼 멀티 스레드 방식으로 동작하는 것을 알 수 있다.
결론적으로 멀티 프로세스가 좋은가 멀티 스레드가 좋은가에 대한 질문에는 각각 장단점이 존재하기에 무엇하나 특별히 좋다고 할 수 없다.