들어가며
이 글을 읽고 있는 지금 기기에서 어떤 작업을 하고 있나요? 이 글을 읽으며 음악을 듣거나 파일을 다운로드 하고 있을 수도 있고 또는 글을 적기 위한 참고자료로 활용하며 문서 작업을 하고 있을 수도 있습니다.
일반적으로 컴퓨터의 cpu는 1개입니다. 그럼에도 컴퓨터는 위 같은 병렬 작업을 당연하다는 듯 수행하고 있습니다. 6코어, 10코어와 같이 코어가 여러 개라 가능하다 생각할 수도 있지만 생각해보면 코어 수보다 더 많은 작업들을 수행 할 때가 있습니다.
운영체제를 공부하다보면 멀티 프로그래밍, 멀티 태스킹, 멀티 프로세싱, 멀티 코어, 멀티 스레딩이란 단어들을 마주할 수 있습니다. 이런 기술들로 인해 하나의 기기에서 여러 작업들을 동시에 할 수 있습니다. 하지만 대략적인 것만 알고 정확한 개념이나 차이를 모를때가 많아서 정리해보려고 합니다.
멀티 프로그래밍
멀티 프로그래밍은 여러 프로그래밍이 동시에 실행되는 것을 의미합니다. 다만 여기서 동시라는 단어가 가지는 의미를 살펴보면 좋을 것 같습니다.
동시성과 병렬성
우리가 흔히 아는 동시는 2개 이상의 것이 같이 동작하는 것으로 이해할 때가 많습니다. 하지만 여기서 동시는 병렬이라는 개념과 구별해야 합니다. 병렬성이 실제로 여러 작업을 실제로 같이 처리하는 것을 의미합니다. 동시성은 여러 개의 작업을 같이 처리하게 끔 보이는 것을 의미합니다. 시스템이 A작업을 처리하다가 B작업을 처리하고 다시 C작업을 처리하고 다시 A작업을 처리하고 ... 이런 식으로 시스템은 한번에 하나의 작업만 처리하지만 그 전환속도가 빨라서 사람이 인식하기엔 한번에 같이 처리한다고 여겨집니다.

사실 이 동시라는 내용은 멀티 태스킹에 더 어울린다고 생각되지만 초반에 설명하는 게 좋을 것 같아 미리 설명했습니다.
멀티 프로그래밍 아이디어
멀티 프로그래밍의 아이디어는 하나의 프로그램에서 입출력(I/O 작업)을 기다리는 동안 다른 프로그램을 실행시키자 입니다. 왜냐하면 일반적으로 하나의 프로그램이 동작하는 시간에서 CPU 사용시간보다 I/O 작업의 시간이 대부분을 차지하기 때문입니다. 심지어 사용자가 깜빡하고 입력을 안 하고 잠깐 나가면 프로그램은 입력이 들어올 때까지 기다려야 합니다. 만약 하나의 프로그램이 완전히 끝나고 나서 다른 프로그램을 동작시킬 수 있다면 저런 I/O 작업으로 대기하는 프로그램 때문에 다음 프로그램들이 계속 대기하게 될 겁니다.
그렇기에 이렇게 I/O 대기가 일어나는 동안 다른 프로그램을 실행시켜 CPU의 사용량을 늘리는 것이 멀티 프로그래밍의 아이디어 입니다.

이렇게 CPU의 사용량은 늘어났지만 여전히 단점은 존재했습니다. 결국 한번에 하나의 프로그램만 동작하고 I/O 대기가 있거나 프로그램이 종료되야 다음 프로그램을 실행하기 때문에 하나의 프로그램이 긴 CPU 작업이 이뤄지게 되면 다른 프로그램들은 실행하지 못 했습니다.
멀티 태스킹
멀티 태스킹은 운영체제가 여러 개의 작업(태스크)을 아주 짧은 시간 동안 실행하고, 이 시간이 끝나면 다른 프로그램을 실행하는 것을 의미합니다. 다만 이렇게 전환하는 속도가 아주 빨라서 사용자가 보기에 여러 프로그램들이 동시에 실행되는 것처럼 보여집니다. 위에서 설명한 동시성과 가장 잘 들어맞습니다. 여기서 효율적으로 멀티 태스킹이 이뤄지기 위해 프로그램의 실행을 적절히 분배하는 스케줄링이라는 개념이 나오는데 스케줄링을 여기서 설명하면 너무 길어질 것 같아 다음에 적어보도록 하겠습니다.

위에서 제가 그린 그림들을 보면 하나의 프로그램에서 다음 프로그램으로 넘어갈 때 화살표가 약간 대각선으로 그려져있습니다. 이는 하나의 프로그램에서 다음 프로그램으로 넘어갈 때는 문맥 교환(컨텍스트 스위칭)이란 과정이 이뤄지게 됩니다. 이는 현재 진행 중인 작업을 저장해놓고 다음에 실행할 작업의 진행 상태를 불러오는 작업입니다. 그렇기에 다음 작업이 바로 실행되는 것이 아닌 약간의 텀을 두고 실행하게 됩니다.
멀티 프로세싱
멀티 프로세싱은 여러 개의 CPU를 사용하여 여러 작업을 처리하는 기술입니다. 위처럼 하나의 시스템이 여러 개의 작업을 번갈아가며 동시에 실행하는 것이 아닌 병렬적으로 실행하는 기술입니다.
여러 개의 CPU를 사용하여 여러 개의 작업을 각각의 CPU가 병렬적으로 실행시키거나 여러 개의 CPU가 하나의 작업을 분담하여 같이 실행할 수도 있습니다. 이렇게 하나의 작업을 여러 CPU가 분담하여 처리하게 되면 하나의 CPU가 고장나더라도 다른 CPU에서 작업이 진행중이라 작업이 중지되지 않습니다. 다만 CPU간 동기화 오버헤드나 메모리 경합으로 인해 CPU를 2배로 늘린다고 성능이 2배로 증가하는 건 아닙니다.

멀티 코어
멀티 코어는 하나의 CPU 칩 안에 여러개의 코어를 집적한 기술입니다. 여기서 코어는 독립적인 연산장치로 각 코어마다 서로 다른 명령어를 실행할 수 있어 병렬 처리가 가능합니다. 또한 코어끼리 캐시 메모리와 메모리 컨트롤러를 공유하기 때문에 공간과 전력을 절약하면서 성능을 향상시킬 수 있습니다.

멀티 스레딩
멀티 스레딩은 말 그대로 스레드 여러개를 동시에 실행하는 겁니다. 여기서 스레드란 하나의 프로세스내에서 실행되는 독립적인 실행 흐름입니다. 즉, 하나의 프로세스에서 여러 개의 스레드가 돌아가면서 작업을 수행하는 것 입니다.
예를 들어 카카오톡을 실행하면 UI가 생성되고, 네트워크를 연결하고, 채팅을 저장하고, ... 등등 여러 작업이 진행됩니다. 이 각각의 작업을 하나의 스레드가 맡아서 처리하는 겁니다.
이렇게 스레드는 하나의 프로세스 안에서 돌아가는 하나의 작업 단위로 프로세스보다 좀 더 가볍습니다. 또한 하나의 프로세스에서 돌아가는 여러 개의 스레드끼리 메모리 공간도 공유하기 때문에 통신 비용도 적습니다. 그렇기에 프로세스끼리 컨텍스트 스위칭하는 것보다 스레드끼리 컨텍스트 스위칭하는 것이 더 빠릅니다.
마지막으로 위의 멀티 코어와 연관지어 설명하면 하나의 코어에서는 하나의 스레드를 실행가능합니다. 그렇기에 하나의 프로세스를 여러 개의 스레드로 나눠서 관리하며 각각의 스레드는 하나의 코어에서 실행합니다. 이때 하나의 코어에서 여러 개의 스레드를 실행하게 되면 위의 멀티 태스킹으로 동작하게 됩니다. 즉 하나의 코어가 여러 개의 스레드를 일정 시간마다 조금씩 실행하며 동시에 실행하는 것처럼 보이게 합니다.

정리
지금까지 정리한 내용으로 첫 서론에서 언급한 여러 개의 프로그램들을 동시에 사용할 수 있는 이유를 이해할 수 있을 겁니다. 이 글에서는 여러 병렬 처리의 개념들을 간단하게 정리했습니다. 여기서 자세히 들어가면 컨텍스트 스위칭, 프로세스와 스레드의 메모리 구조, 스레드의 Race Condition ... 등등 더 많은 내용들이 있습니다. 이 내용들도 이후 시간이 나면 정리해보겠습니다.
'CS' 카테고리의 다른 글
| 동기/비동기, 블로킹/논블로킹은 무엇이고 각각의 차이점은 무엇인가요? (0) | 2025.10.08 |
|---|---|
| @Async는 어떻게 동작하나요? (0) | 2025.10.06 |
| [매일메일] 객체 지향 프로그래밍이란 무엇이고, 어떤 특징이 있나요? (0) | 2025.03.31 |
| [매일메일] PRG 패턴에 대해서 설명해 주세요. (0) | 2025.03.24 |