동시성과 병렬성

2025. 1. 10. 06:14CS

동시성과 병렬성

이미지 출처: https://brightdata.com/blog/web-data/concurrency-vs-parallelism

 


 

개념

 

 

동시성 (Concurrency)

여러 작업을 논리적으로 동시에 실행하는 것처럼 보이게 설계·관리

스케줄링, 컨텍스트 스위칭, 비동기 처리 등을 통해 동작
일반적으로는 "동시성 = 논리적으로 동시에 실행"을 의미

물리적 코어가 여러 개여도, 동시성 자체는 논리적인 실행 순서 관리에 초점이 맞춰짐

 

 

병렬성 (Parallelism)

여러 코어(또는 머신)를 물리적으로 활용해, 동시에 작업을 수행함으로써 성능(처리량, 응답속도 등)을 향상 시키는 것

한 작업을 여러 부분으로 나누어 동시에 처리하거나, 여러 작업을 배분해 처리하여 전체 처리 시간을 단축
일반적으로는 "병렬성 = 물리적으로 동시에 실행"을 의미

소프트웨어 레벨에서 병렬 처리를 요청해도, 실제 코어가 부족할 땐 시분할이 일어날 수 있으므로 항상 물리적이라는 보장은 없음(논리적 병렬성, 성능 향상이 제한적)

 


 

논리적 병렬성

 

 

“병렬 처리를 요청하는 것”과 “물리적으로 병렬 처리되는 것”은 별개의 문제

여러 스레드(또는 프로세스)를 생성하여 병렬 처리를 요청했더라도, 실제 실행은 OS 스케줄러의 리소스 할당 방식에 따라 물리적 병렬성으로 이어지지 않을 수 있다.

특히, 운용 가능한 코어가 하나뿐인 환경에서는 여러 작업이 결국 시분할로 실행되며, 사용자 관점에서만 병렬 실행처럼 보이는 상태가 된다.
이러한 상황은 논리적 병렬성으로 분류될 수 있고, 실제로는 단일 코어가 빠르게 컨텍스트 스위칭하여 작업을 번갈아 수행하는 구조이다.

 

 

단일 코어? 컨텍스트 스위칭? 시분할? -> 그럼 논리적 병렬성은 동시성인가?

논리적 병렬성과 일반적인 동시성은 유사한 상황에서 발생할 수 있지만, 같은 개념은 아니다.
두 개념은 물리적 실행 여부를 기준으로 한 해석 관점설계 및 실행 목표의 차이에서 구분된다.
발생 맥락

논리적 병렬성은 병렬 처리를 요청했지만, 물리적 자원 부족으로 인해 논리적으로만 병렬처럼 보이는 상태.
동시성은 물리적 병렬성을 포함하지 않더라도, 여러 작업이 겹쳐 실행될 수 있는 설계.

즉, 논리적 병렬성은 병렬 처리를 의도했지만 물리적 한계로 인해 발생하는 현상이고, 동시성은 애초에 작업 겹침과 조율에 초점을 둔 설계 개념.
목표의 차이

논리적 병렬성은 병렬성의 실행 성능(성능 향상, 처리량 증가)을 목표로 하지만, 실제 실행이 물리적 자원에 제한을 받는 상태.
동시성은 반드시 성능 향상을 목표로 하지 않고, 자원 공유와 작업 조율(협력)에 초점을 맞춤.
같은 상황, 다른 해석

"병렬 처리를 요청했으나 운용 가능한 코어가 하나뿐인 상황에서, 여러 작업이 시분할(time-sharing)로 실행될 때"

동시성: 여러 작업이 겹쳐 실행되도록 설계되었다고 해석.
논리적 병렬성: 병렬 처리를 요청했지만, 실제론 물리적으로 병렬 실행되지 않고 논리적으로만 병렬처럼 보이는 상태로 해석.

 

 

중간 정리

 

동시성과 병렬성

동시성: 여러 작업이 겹쳐서 실행될 수 있도록 하는 설계·관리하는 개념.
단일 코어(시분할)나 멀티 코어에서도 적용 가능 (동시성 자체는 논리적인 실행에 초점)


병렬성: 물리적 자원(여러 코어 또는 여러 머신)을 활용해 여러 작업을 실제로 동시에 실행함으로써 성능을 향상시키는 것.

 

 

OS와 하드웨어 자원

병렬성을 최대로 활용하려면, 멀티코어 환경과 OS 스케줄러의 효율적 매핑이 필수적.
코어가 부족하거나, OS 스케줄링 정책이 제약적이면, 논리적 병렬성 수준에 머물게 됨

 

 

최적의 활용을 위해서는

동시성: 자원(메모리 경합, 락, 동기화 등)을 어떻게 안전하게 공유·조율할지 설계.

병렬성: 멀티코어나 분산 클러스터 자원을 얼마나 효율적으로 활용할지 설계 및 튜닝해야 하며, 캐시 경쟁, 프로세스 간 통신 비용 등 현실적 제약을 고려.

두 개념은 상호 보완적이므로, 둘 다 제대로 이해하고 구현해야 성능 최적화안정성을 함께 확보할 수 있음.

 


 

 

인텔, 하이퍼스레딩(Hyper-Threading)

 

하이퍼스레딩

이미지 출처: https://ko.wikipedia.org/wiki/%ED%95%98%EC%9D%B4%ED%8D%BC%EC%8A%A4%EB%A0%88%EB%94%A9

 

병렬성을 논리적과 물리적으로 나눠서 정리하다보니, 인텔의 하이퍼 스레딩은 어떻게 해석해야할까 궁금해졌다.

 

하이퍼스레딩하드웨어 가상화 기술로, 하나의 물리적 코어를 두 개의 논리적 코어로 나누어, 각각이 독립적으로 스레드를 실행하는 것처럼 OS에 가상의 코어를 보여준다.

 

물리적 코어 내부의 일부 자원을 이중화하여, 동시에 두 개의 스레드를 실행할 수 있는 구조를 제공하지만, 실행 유닛과 같은 주요 자원은 두 논리적 코어가 공유하므로 병렬성이 제한적이다.

 

OS 입장에서는 두 개의 논리적 코어를 독립적으로 스케줄링할 수 있으므로 사용자 관점에서 병렬 실행이 가능해 보이지만, 이는 위에서 설명했듯 작업 부하와 자원 활용 상태에 따라 제한적일 수 있다.

 

따라서 하이퍼스레딩은 물리적 자원의 일부를 가상화하여 논리적 병렬성을 제공하는 기술이지만, 물리적 자원의 한계를 극복하지는 못하기 때문에, 물리적 병렬성과 논리적 병렬성이 혼재된 사례로 해석할 수 있었다.

(완전한 물리적 병렬성 대신 부분적 병렬성을 제공하는 특수한 사례)

 

최근에는 인텔에서 루나레이크를 발표하며 하이퍼스레딩을 탑재하지 않던데, 복잡성을 줄이고 개별 코어의 성능을 극대화하는 방향으로 설계를 변경한 것으로 보인다...

 

 


 

마무리

 

 

동시성과 병렬성은 서로 다른 축에서 출발하지만, 실제 구현과 활용 단계에서는 자연스럽게 혼재되고 통합적으로 작동함을 이해할 수 있었다.

동시성은 여러 작업이 겹쳐 실행될 수 있도록 설계·관리하는 논리적 구조를 의미.
병렬성은 여러 물리적 자원을 활용해 작업을 동시에 처리함으로써 성능을 극대화하는 실행 관점.

 

이 둘은 개념적으로는 분명한 차이가 있지만, 실제 구현 단계에서는 동시성의 논리적 설계 위에 병렬성이 물리적으로 구현되거나, 물리적 병렬성 안에서 동시성을 조율해야 하는 상황이 자주 발생하므로 통합적으로 이해하고 활용하는 것이 중요한 것을 배웠다.

 


 

 

같은 상황에서도 OS 스케줄링, 코어 수, 분산 환경 등 다양한 층위에서 논리적 병렬성과 물리적 병렬성이 섞여 나타날 수 있다는 점도 주목할 만하다.

 

일반적인 개념을 암기하는 것뿐만 아니라, 이러한 층위를 명확히 구분하고 이해하는 것이 실제 문제 해결과 설계의 핵심이라고 생각한다.

 


 

 

동시성과 병렬성을 안정적으로 구현하기 위해서는 동기화가 필수적이다.

 

여러 코어가 동시에 같은 자원을 접근할 경우 데이터 경합(race condition) 같은 문제가 발생할 수 있으며, 이를 해결하기 위해 락(lock), 세마포어(semaphore), 메시지 패싱(message passing), CAS(compare-and-swap) 같은 메커니즘이 사용된다.

 

또한, Deadlock(교착 상태), Race Condition(경합 상태), Starvation(기아 상태)와 같은 문제들은 동시성과 병렬성을 설계하고 구현할 때 반드시 고려해야 할 주요 과제이다.

 

이를 해결하려면 적절한 스케줄링 정책이나 동기화 전략을 통해 자원 관리 문제를 효과적으로 제어해야 한다.

 

이는 추후에 포스팅할 예정이다.

'CS' 카테고리의 다른 글

DB Replication (MySQL - Binary Log)  (0) 2025.01.07