동시성 대 병렬성 (Concurrency vs Parallelism)
돈 내는 회원만 볼 수 있는 글이지만, 읽어볼 만하기에 소개합니다.
글 : Concurrency vs Parallelism
저자 : Ashish Pratap Singh
링크 : Concurrency vs Parallelism. They are NOT the same. | by Ashish Pratap Singh | AlgoMaster.io | Medium
요약
동시성(Concurrency)
단일 CPU는 한 번에 하나의 작업만 수행할 수 있지만, 작업 간에 빠르게 전환하여 동시성을 달성합니다.
최신 CPU 설계로 가능한 이러한 원활한 전환은 멀티태스킹의 환상을 만들어내고 작업이 병렬로 실행되는 것처럼 보이게 합니다.
그러나 이것이 병렬이 아니라는 점에 유의하는 것이 중요합니다. 이것은 동시적입니다.
병렬성(Parallelism)
병렬성은 여러 작업이 동시에 실행됨을 의미합니다.
5 Likes
롭 파이크가 고루틴을 소개하면서 concurrency is not parallelism
이라고 말한게 벌써 10년이 넘었군요.
2 Likes
자주 듣고 또 읽지 않으면 망각하게 되어서~
이런 글은 늘 신선합니다.
cuda c 작성할 때 온몸 비틀기하며 메모리 얼라인 맞추고 명령어 순서 맞췄던거 PTSD가 ㅎㅎ
1 Like
마수리
March 21, 2025, 9:43am
6
저도 참… 이 2개가 다르다는 것만 알지 정확히는 이해하지 못하고 있습니다.
원글에 따르면 동시성이란 단일CPU는 1가지 일만 할수 있고 시분할 등을 통해서 매우 빠르게 여러개의 작업을 진행해 마치 동시에 병렬적으로 실행되는 것처럼 보이게 한다는 말인 것 같은데 맞나요? 그러면 어차피 한 순간에는 1개의 일만 하고 있으니 동시성 코드(?)란 것은 크리티컬 섹션 등을 고려하지 않아도 되는건가요?
병렬적인 코드는 많이 생성해 보았지만 동시성 코드(?)는 어떻게 생성하는걸까요?
아니면 동시성 코드 같은건 애초에 없고 CPU가 task
를 다루는 컨셉 같은걸까요?
2 Likes
저도 명확하게 안다기 보단 책에서 본 지식으로는 코루틴이라는 개념은 이미 1970년대 Single Core CPU를 다루던 시절부터 있던 개념이라 멀티스레딩보다 훨씬 전부터 있던 개념이라고 합니다.
동시성이라는게 끝나지 않고 멈춰져있는 상태도 동시성이라고 보시면 되지 않을까 하네요. 그래서 제가 알기론 C#의 Task 자체가 멀티스레딩이자 코루틴 자체를 병합한 개념이라고 알고 있습니다.
3 Likes
동시성 대 병렬성 (Concurrency vs Parallelism)
동시성 : 실제로 동시에 하지 않는다.
병렬성 : 실제로 동시에 한다.
동시성 : 작업을 맡은 프로세서가 그 작업을 다른 것에게 맡기고 응답을 기다리며 작업 마침을 때때로 점검한다.
병렬성 : 작업을 맡은 프로세서가 그 작업을 해야한다.
2 Likes
마수리
March 24, 2025, 3:24am
9
Task
객체도 await
를 통해 DB나 Network를 기다리는 코드가 있고
실제로 여러 Task
를 병렬적으로 실행시켜 동시에 특정 메모리에 접근할 수 있는데
이런 차이라고 보면 되는 것인가요?
이런 차이라면 동시성은 크리티컬 섹션을 고려하지 않아도 되는게 맞고 병렬성은 고려 해야 됨도 자연스러워지네요.
1 Like
대개 코드에 동시성과 병렬성이 혼재되어 있지 않을까 생각합니다.
만약 순수 기다림 코드라면, 크리티컬 섹션을 고려하지 않아도 될 것이라 생각합니다.
1 Like
제가 공부할 때 개념은 이랬습니다…
동시성 : 말 그대로 시간을 기준으로 동시에(혹은 그에 근접한 동시각에) 실행되는 것을 의미. 즉 시간을 기준으로 한다.
병렬성 : 실행 주체가 여럿인 것을 의미. 시간과 관계없이(라고 하지만 거의 동시접근을 상정한 상황이 주로 벌어지는 것을 의미) 실행 주체가 여럿인 것을 병렬성의 기준으로 한다.
1개의 작업이 빠르게 컨텍스트 스위칭되면서 동시에 혹은 그에 가깝게 실행되는 것
여러 실행 주체(이를 테면 스레드 따위) 등으로 각자 실행되는 것
이 정도로 동시성과 병렬성을 구분한다… 정도로 공부했던 거 같네요.
의미상으로도
동시성은 시분할을 통해 논리적으로 시간적 개념을 설명했다면
병렬성은 독립적인 것 여럿을 늘어놓는다 라는 본연의 의미에 좀 더 가깝게 바라봐야 하는 것이 맞는 거 같습니다.
뭐… 현실에서는 그냥 Task 만 잘 이해해도… ㅇㅅㅇ
1 Like
Greg.Lee:
제가 공부할 때 개념
음…cpu 또는 core가 한 개인 시절엔 동시성과 병렬성의 구분이 모호해 진다고 생각합니다.
OS 입장에서 볼 때에는 그 얘기가 맞아요.
그런데 개발자가 프로그래밍 언어로 OS 가 구동되는 하드웨어까지 염두해서
특별한 조작을 하는 것이 아니라면
프로그래밍 언어 차원에서 동시성과 병렬성의 구분은 명확해 집니다.
시간적 의미로 동시를 가리키는가
실제 실행 주체가 여럿인가
이 두 명제가 가장 기본적으로 명확한 구분 기준이 되죠.
그러나 뭐 어차피 우리가 코드를 작성하면서 의도하는 것은
동기로 다음 라인이 순차 실행되지 않을 것…
정도이니
현실적으로 이 둘을 명확히 구분하는 게 의미가 있나… 라고 물어본다면
그것도 맞는 말이다… 얼쑤!
이렇게 결론 낼 수 있겠네요…
얼쑤!
1 Like
이 표현을 현대적으로 풀어보자면
여러 스레드를 만들어서 하나의 작업을 수행하는 것 → 병렬성이 있다. (O)
또한 여러 스레드가 동시에 실행될 경우 → 동시성이 있다 (O)
실행 주체로 구분했을 때 병렬성과 동시성은 상대 혹은 반대 개념이 아니기 때문에 일종의 포함관계가 생길 수도 있어요.
그런데 코루틴 처럼 비동기로 수행되지만 단일 주체로 실행되는 경우
동시성은 시간만 의미하므로 → 동시성이 있다(O)
그런데 실행 주체는 하나 이므로 → 병렬성이 있다. (X)
이렇게 되죠.
병렬성을 지니지 않은 동시성은 실제로 그 실행 효율이
동기로 순차 수행되는 것과 다르지 않을 수도 있어요.
다만 이 경우 동기화 이슈가 생기지 않는 다는 장점이 있지요.
동기화 이슈를 제외하고 본다면
현대적 관점에서 동시성과 병렬성을 구분하는 것은 그다지 의미가 크지 않다고 볼 수도 있다…
뭐 이정도 결론이지 않을까 싶군요…
2 Likes
동시성이 이렇게 뜨겁다니 오랜만이네요.
저는 여전히 롭 파이크가 이야기한 부분에 머물고 있는데 최신 책을 확인해도 정의가 바뀐 거 같지는 않습니다.
This easy-to-read, hands-on guide demystifies concurrency concepts like threading, asynchronous programming, and parallel processing in any language.
Perplexed by concurrency? Don’t be. This engaging, fully-illustrated beginner’s guide gets you...
매우 쉽게 설명합니다. 한글 책도 있어요.
grokking concurrency!복잡한 수식과 전문 용어를 몰라도 괜찮다!읽기만 해도 동시성을 이해할 수 있다!동시성은 프로그램을 독립적으로 실행하도록 분리해 동시에 처리하는 방식이며, 이를 구현하려면 복잡성, 병렬성, 스레드, 프로세스, 멀티태스킹, 코...
C# 혹은 F#을 기준으로 학습한다면 다음 책을 추천합니다.
Concurrency in .NET teaches you how to build concurrent and scalable programs in .NET using the functional paradigm. This intermediate-level guide is aimed at developers, architects, and passionate computer programmers who are interested in writing...
책의 저자는 3가지로 구분했는데요.
Sequential programming
Concurrent programming
Parallel programming
Sequential programming
고전적인 순차 실행 프로그래밍입니다.
Concurrent programming
논리적으로 각 단계를 나누고 서로에게 영향을 미치지 않는다면 동시에 작업할 준비가 됐습니다.
Actor model로 코드를 작성하면 이해가 쉽습니다.
Akka.net , Proto Actor 혹은 orleans
Parallel programming
물리적으로 CPU 개수를 늘려 봅시다.
1 Like
동시성(Concurrency)이란 말은
cpu 하나인 상황에서
시간 분할(Time-sharing)을 이용하여
병렬(Parallelism)을 흉내내며
나온 낱말인 듯 싶습니다.
1 Like
도서 요약 - C# 으로 쓰는 함수형 프로그래밍, 엔리코 붜나노 - Slog - 닷넷데브
마침 3 장에 관련 내용이 나옵니다.
책의 저자는 동시성을 아래와 같이 설명합니다.
동시성: 복수의 태스크의 시간 창이 겹쳐진 상태.
비동시성
|---A---| |-----B-----| |--C--|
동시성
|---A---|
|-----B-----|
|--C--|
동시성이 유발되는 프로그래밍 기법
비동기 처리
하나의 태스크가 종료되기를 기다리지 않고 다른 태스크를 수행.
한 시점에 복수의 태스크가 동시에 실행됨.
주로 I/O 바운드 태스크.
병렬 처리
태스크를 쪼개서 여러 CPU 코어에 분산 실행.
한 시점에 복수의 부분 태스크가 동시에 실행됨.
멀티 스레딩
여러 스레드가 동시에 실행되는 것처럼 보이는 소프트웨어 기법.
한 시점에 하나의 스레드만 실행됨.
5 Likes