CS 상식/소프트웨어 공학

[면접 단골 질문] 동시성과 병렬성 차이는 무엇인가요?

SparkIT 2025. 1. 8. 12:45

개발자 기술 면접에서 흔하게 나오는 질문 중 하나이죠. 동시성과 병렬성의 차이를 묻는 경우가 꽤 있습니다. 해당 질문은 컴퓨터가 2개 이상의 프로그램들을 모두 실행하려 할 때 각 프로그램이 동작하는 방식을 이해하고 있는지를 알기 위한 질문이라고 생각합니다.

 

"동시에 실행", "병렬로 실행" 똑같은거 아니야?

개인적으로 '동시에 실행하다' 혹은 '병렬로 실행하다'는 한글 그 자체로 해석했을 때 같다고 밖에 느껴지지 않았습니다. 많은 분들이 저와 공감하실 것이라고 생각합니다. 그래서 동시성과 병렬성 두 개념을 이해하는데 꽤 힘들죠.

 

동시성은 우리가 알고 있던 동시성이 아니야

소프트웨어에서의 동시성은 일상적인 단어로 사용되는 동시성과 다르기 때문에 이해하기 어렵습니다. 우리는 일반적으로 A 사건과 B 사건이 동시에 일어났다라고 하면 두 사건이 정말 개별적으로 같이 일어나는 상태라고 해석합니다. 예를 들어 특정 정책에 대한 찬성 시위와 반대 시위가 동시에 일어났다라고 한다면, 두 시위가 같은 시간의 흐름 속에서 동일하게 진행중인 상태를 상상하게 되죠. 같은 시간 속에서 한 쪽에서는 찬성 시위에 참여한 사람들이 시위하고 있고, 다른 한 쪽에서는 반대 시위에 참여한 사람들이 시위하는 모습이 떠오릅니다. 이것이 우리가 일반적으로 생각하는 동시성입니다.

하지만 소프트웨어 공학에서의 동시성(concurrent)는 이와는 개념이 다릅니다. 소프트웨어에서 동시성이란 '너 한번 나 한번'의 개념으로 이해할 수 있습니다. 만약 누나와 동생이 1개의 아이스크림을 나눠 먹는 상황을 가정합시다. 먼저 누나가 한 입 베어물고, 그 다음 동생이 한 입 베어뭅니다. 그렇게 1개의 아이스크림을 모두 먹을 때까지 누나와 동생은 번갈아가며 아이스크림을 한 입씩 베어뭅니다. 이런 상황이 바로 소프트웨어에서 의미하는 동시성입니다. 너 한번 나 한번을 빠르게 진행하면 마치 두 개체가 동시에 일을 진행하는 것과 비슷하게 보이게 되는데 이를 소프트웨어에서는 동시성이라고 표현합니다.

 

그럼 병렬성은?

병렬성이 오히려 우리가 일상 생활에서 흔히 사용하는 '동시'라는 개념과 더 잘 어울립니다. 위에서 누나와 동생이 아이스크림을 나눠 먹던 상황을 다시 가져와봅시다. 여기서 아이스크림이 알고 보니 1개 더 있다고 추가로 가정합시다. 그럼 더 이상 1개의 아이스크림을 나눠 먹을 필요가 없습니다. 누나와 동생이 각자 1개의 아이스크림을 동시에 먹으면 되죠. 이는 소프트웨어 공학에서의 병렬성 개념입니다. 하지만 이때 일반적으로 우리는 누나와 동생이 아이스크림을 동시에 먹고 있다고 표현하지, 누나와 동생이 아이스크림을 병렬적으로 먹고 있다고 표현하지는 않습니다.. 이것이 바로 소프트웨어 공학에서 사용되는 동시성, 병렬성이라는 단어를 한 번에 이해하기 어려운 이유입니다.

 

소프트웨어 공학의 동시성, 병렬성을 더 쉽게 이해하기 위해서는?

그래서 저는 두 개념을 더 쉽게 이해하기 위해서는 동시성이라는 단어 대신 직렬성이라는 단어를 사용하면 이해하기도 더 쉽고 더 명확한 명칭으로 사용할 수 있다고 생각합니다. 동시성이라는 것이 앞서 말씀드렸듯이 여러 작업을 번갈아 가며 진행하여 마치 여러 작업이 동시에 실행되는 것처럼 보이게 만드는 방법을 의미합니다. 그러므로 여러 작업이 직렬 형태로 번걸아가며 진행됩니다.

반면에 병렬성은 실제로 독립적인 코어들이 여러 작업을 나눠 가지며 동시에 각 코어가 담당한 작업을 진행시킵니다. 진짜 동시에 여러 작업들이 병렬적으로 진행되는 것이죠.

 

 

동시성과 병렬성 실행 원리

그럼 컴퓨터 시스템이 어떻게 여러 작업을 동시적으로 혹은 병렬적으로 실행하는지 알아봅시다.

 

컨텍스트 스위칭 : 동시성

동시성은 하나의 코어가 여러 작업을 번갈아가며 진행한다고 설명했습니다. 이렇게 여러 작업을 번갈아가는 작업을 컨텍스트 스위칭이라고 명칭합니다. 일상 생활로 비교를 하면 다음과 같습니다. 회사의 한 직원이 발표에 필요한 PPT를 제작하고 있다고 가정합시다. 이때 다른 업무 관련하여 문의 전화가 걸려옵니다. 해당 직원은 전화에 응답해 관련 문의를 해결해줍니다. 그리고 다시 제작하고 있던 PPT 작업에 몰입합니다. 이런 'PPT 제작과정 --> 문의 전화 응대', '문의 전화 응대 --> PPT 제작과정' 를 컨텍스트 스위칭이라고 하는 것입니다.

그리고 이런 과정에서는 약간의 어려움이 생깁니다. 많은 사람들이 위와 같은 상황에 처했을 때 공감할 만한 상황이 있다고 생각합니다. 내가 뭐하고 있었지? 내가 어디까지 작업하고 있었지? 이런 상황을 경험한 적 있을텐데요. 이런 것이 바로 컨텍스트 스위칭 상황에 발생하는 오버헤드입니다.

즉, 동시성은 하나의 코어에서 A 프로세스와 B 프로세스를 동시에 진행시킬 때 프로세스 전환 과정(컨텍스트 스위칭)이 발생하고 이때는 현재 진행 중인 프로세스의 진행 상태(레즈스터값, 스택 포인터 등)를 저장해둡니다. 해당 진행 상태를 통해 프로세스 전환이 일어나도 현재까지 진행했던 작업을 이어서 진행할 수 있는 것이죠.

 

다중 코어 : 병렬성

병렬성은 기본적으로 여러 코어가 존재해야 진행이 가능합니다. 여러 작업을 다중 코어가 나눠 분담해야하기 때문입니다.

 

 

그럼 동시성이 좋은가요? 병렬성이 좋은가요?

당연히 상황마다 다릅니다. 동시성과 병렬성 모두 장단점이 있기 때문이죠. 각 개념의 장단점을 통해 어떤 상황에 적용하면 좋을지까지 생각해봅시다.

 

동시성 장단점

장점

작업 관리 용이: 리소스를 나누지 않고 하나의 CPU에서 여러 작업을 처리하기 때문에 시스템을 관리하는 데 용이하고, 리소스 충돌을 적게 일으킵니다.

단점

진정한 동시 실행 아님: 실제로 한 번에 하나의 작업만 처리되므로, 전체적인 실행 속도가 느릴 수 있습니다. CPU가 작업을 번갈아 가며 처리하므로 한 작업의 완료에 시간이 걸릴 수 있습니다.

복잡한 상태 관리: 여러 작업을 동시에 처리하는 것처럼 보이지만, 내부적으로는 작업 전환(컨텍스트 스위칭)이 발생합니다. 이때 작업 간 상태를 잘 관리해야 하므로 코드가 복잡해질 수 있습니다.

 

병렬성 장단점

장점

성능 향상: 여러 CPU 코어를 사용하여 동시에 작업을 처리하므로, 처리 속도가 빨라지고 성능이 향상됩니다. 특히, 연산이 많은 작업에서 두드러진 성능 향상이 있습니다.

단점

복잡성: 병렬 프로그램은 동기화와 리소스 관리에 더 많은 신경을 써야 하므로 코드가 복잡해집니다. 예를 들어, 여러 스레드가 동시에 같은 자원에 접근하려 할 때 발생할 수 있는 경쟁 상태(race condition)를 관리해야 합니다.

 

마무리

병렬성이 더 유리한 상황은 주로 대규모 데이터 처리, CPU 집약적인 작업, 고성능 컴퓨팅 환경 등에서 나타납니다. 반면, 동시성이 더 유리한 경우는 리소스가 한정된 시스템이나 작은 작업을 여러 가지 동시에 처리하려는 상황에서 발생합니다.