디시인사이드 갤러리

갤러리 이슈박스, 최근방문 갤러리

갤러리 본문 영역

동시성과 병렬성 프로그래밍 기초에 대한 이야기

ㅆㅇㅆ(124.216) 2025.02.12 04:18:05
조회 509 추천 9 댓글 14
														





3eef9e36ebd518986abce89543877365a5

공짜 점심은 끝났어 -Herb Sutter


갑자기 뜬금없이 무료 급식은 끝났다니 동네 노숙자들은 다 죽으라는 소리인가, 이 소리는 2000년대 중반 우리는 *무어의 법칙에 따라 CPU 성능이 발전했지만


CPU 클럭 속도(Clock Speed)가 물리적 한계(발열,전력 소모)등으로 인해서 싱글 코어의 성능의 향상이 멈추게 되었다


개발자들은 이제 컴퓨터의 성능을 다 이끌어 나갈 새로운 방법을 찾아야했고, 좋았던 시절이 끝났다며 Herb Sutter가 05년도에 글을 작성했다.


이제 프로그래머는 안락하고 따뜻한 싱글 코어와 품속에서 벗어나 차가운 병렬 프로그래밍을 사용하여야 하드웨어의 잠재력을 다 발휘할 수 있겠되었다.


그리고 이때 수많은 책들이 난립하고, 정리되는 중 병렬 프로그래밍 계의 명저이자 불후의 고전인 책이 나온다.


*무어의 법칙-CPU 성능이 2년마다 2배씩 증가한다던 법칙(초기에는 1년 이후에 수정해서 2년, 이후에 인텔에서 18개월이 되었다)



3eec9e36ebd518986abce8954785766cf38393


The Art of Concurrency 


쓰레드 몽키라는 부제처럼 초보자도 이해하기 쉽게 친절하게 설명해주고, 이제 나는 이 책의 내용을 바탕으로 이야기할 것이다.


물론 이 책은 꽤 오래된 책이기에 최신 개념의 이야기는 적용되어있지 않다.


Rust의 소유권이나, GO의 Goroutine이라거나 이런 내용은 없지만 역시 핵심 내용은 여전히 유지된다.


그리고 초창기 프로그래머가 겪은 교훈을 탐구해보자.




3ee99e36ebd518986abce8954783706c20

너무 깊게 설명하면, 그것만 설명해도 모자라기때문에 필요한 개념만 간단하게 설명하겠다


1.프로세스(Process):운영체제의 자원 할당 및 관리 기본 단위 

-실행중인 프로그램의 인스턴스. 자원 할당 및 스케쥴링의 기본 단위

-독립적인 메모리 공간을 차지함


2.쓰레드(Thread):프로세스내에서 실제 작업을 수행하는 실행 흐름의 최소단위

-쓰레드는 프로세스 내에서 실제 코드를 실행하는 실행흐름의 최소단위 , 하나의 프로세스는 하나이상의 쓰레드를 가질 수 있다.

-프로세스 내의 모든 쓰레드는 프로세스 자원(주소 공간, 메모리,파일 디스크립터)을 공유함


3.스케쥴링(Scheduling):운영체제가 어떤 프로세스 또는 쓰레드에게 CPU를 할당할지 결정하는 과정

-컨텍스트 스위칭은 스레드 교체시 발생하는 오버헤드.

-False Sharing: 서로 다른 쓰레드가 '논리적'으로는 독립된 데이터를 쓰지만 '물리적으로는' 같은 캐시 라인에 위치하여 발생하는 성능저하 현상. (논리적 독립, 물리적 공유)


그럼 


비유를 들겠다.


프로세스는 공장


쓰레드는 공장 안에 있는 노동자(마치 글쓴이와 같은)


스케쥴링은 공장안에 있는 노동자가 받는 공장안의 작업 지침이다.


False Sharing은 작업자(쓰레드)들이 같은 도구상자(캐시라인)을 두고 다투는 현상이라고 할 수 있다.


이제 병렬 프로그래밍을 할 수 있는 기초에 섰다.




병렬성과 동시성: 차이점은 무엇인가?


3eee9e36ebd518986abce89547837c6c069a

"병렬(parallel)"과 "동시(concurrent)"라는 용어는 멀티코어 프로세서가 일반화된 이후 더욱 빈번하게 사용되고 있다. 

하지만, 이러한 용어들은 멀티코어가 등장하기 전부터 컴퓨팅 분야에서 혼란스럽게 사용되기도 했다. 

그렇다면 이 두 개념은 어떻게 다르며, 서로 구별할 수 있을까? 아니면 두 용어가 같은 의미를 가지고 있는 걸까?



동시성(Concurrency)과 병렬성(Parallelism)의 차이 구분해보자


3ee89e36ebd518986abce8954281746e

동시성(Concurrency)

-여러개의 작업이 동시에 '진행 중(in progress)'일 수 있는 시스템을 의미한다.

-한 개의 CPU 코어에서도 동시성을 구현할 수 있다. 

-완전히 동시에 실행되는 것이 아니라, 여러개의 작업이 '진행 중(in progress)'에 상태에 있는 것이 핵심이다.


3eeb9e36ebd518986abce89542837065


병렬성(Parallelism)

-두 개이상의 작업이 동시에 "실행(executin)'되는 시스템을 의미한다.


-병렬성을 구현하려면 반드시 여러개의 CPU 코어가 필요하다


-즉 실제로 동시에 실행(Simulataneous Execution)되어야 병렬성이 성립한다.


결국 핵심 차이점은 다음과 같다


-동시성은 여러개의 작업이 '진행중'이지만 반드시 동시에 실행될 필요는 없다, 단일 코어로도 가능


-병렬성은 여러개의 작업이 '물리적'으로 동시에 실행된다. 여러개의 CPU 코어가 필요하다


즉 모든 병렬 프로그래밍은 동시성을 갖지만, 모든 동시 프로그래밍이 병렬적인 것은 아니다.


이 내용을 요약하여 보자.


개념병렬 프로그래밍 (Parallel)동시 프로그래밍 (Concurrent)
정의여러 작업이 실제로 동시에 실행됨여러 작업이 진행 중이지만, 실제로 동시에 실행되지 않을 수도 있음
CPU 코어 활용멀티코어 / 멀티 프로세서 필요싱글코어에서도 가능
중요한 요소작업 분할, 로드 밸런싱, 데이터 의존성 제거태스크 스케줄링, 리소스 동기화, 상태 관리
예제대규모 행렬 연산, 머신러닝 병렬 처리웹 서버의 여러 요청 처리, UI 이벤트 루프



자 이제 동시성 프로그래밍과 병렬성을 구분했다.


이제 무엇을 해야할까? 


가장 먼저 해야할 일은 무엇일까?


'언제 사용해야할 것인가?'



3eea9e36ebd518986abce8954485766ecc


브룩스의 법칙 : "늦은 프로젝트에 인력을 추가하면 더 늦어지게 된다"


언제 동시성을 적용할 것인가?에 대한 대답을 하기위해서 우리 위대한 선배 프로그래머는 하나의 논리 단위를 만들어 둔다


그것이 바로 'TASK'다


역시 TASK의 역사를 읊으면 끝이 없지만, 대충 설명하자면 TASK 는 이전보다 훨씬 예전에 생겼었지만 이전에는 쓰레드와 유사한 의미로 쓰이다가

00년대 후반에 이르러 추상화된 논리 단위로 쓰이기 시작한다.


TASK라는 논리단위는 복잡성을 효과적으로 관리하고, 개발자는 아키텍쳐라는 관점으로 보면서 동시성 적용 여부를 판단할 수 있게 한다.


TASK를 사용하면 Lowlevel 쓰레드 관리나 동기화에 대한 세부적 고민에서 벗어나 


'어떤 작업을 병렬로 처리해야하는가' 같은 고수준의 설계 결정에 집중할 수 있게 한다.


TASK 기반 동시성 모델은 다음과 같은 틀을 프로그래머에게 제공해준다.


1. TASK 분할(Task Decomposition): 전체 프로그램을 작고 독립적인 Task들로 분할한다. Task는 명확한 입력과 출력을 가지고, 특정기능을 수행하는 논리적 단위


2. TASK 특성 분석(Task Characterization): Task의 특성을 분석하여, 어떤 Task는 병렬처리에 적합하고, 어떤 Task는 비동기 처리를 할지 결정에 도움을 준다.


3. Task 스케쥴링 및 실행(Task Scheduling and Excution) Task 스케쥴러를 사용하여 Task를 효율적으로 배분하고 실행한다. Task 의존관계를 고려하고 실행 순서를 정한 후, 자원을 효율적으로 배분한다.


어쨌건 TASK 모델로 분석했을때


동시성을 사용해야할때는


I/O 바운드 작업- 네트워크 통신,파일 입출력/데이터 베이스 쿼리 등 I/O 작업


CPU 바운드(CPU-Bound): 복잡한 계산,이미지 처리, CPU연산에 최대한 활용하여 계산 작업을 분산처리


응답성이 중요한 프로그램:GUI같이 사용자 경험이 중요한 프로그램등이 예시이다


동시성을 사용하지 말아야할때는


싱글 스레드:프로그램 자체가 본질적으로 싱글 스레드로 설계되있어서 동시성 적용이 어렵다.


작업량이 매우 적은 프로그램:전체 실행 시간이 짧을 경우 오히려 쓰레드 생성 소멸 자체가 오버헤드가 될 수 있다.


하드웨어 자원이 제한적인 경우: 특정 수준의 저수준 임베디드.


하지만 The Art of Concurrency에서는 실전중심의 접근 방식을 배치하여, 저수준 동기화 매커니즘보다는 일종의 상위 추상화 도구인 OpenMP,TBB에 집중한다




1ca8df32e0d439a86da69bed4f88736f6b1a1f8402d8bf52f3648acba41bc20c7256bae990204bdb3c90d326

컴퓨터 과학은 컴퓨터에 관한 것이 아닌다. 마치 천문학이 망원경에 관한 학문이 아닌 것처럼.


에츠허르 데이크스트라(Edsger Dijkstra)가 말했듯이 설계의 본질은 도구가 아닌 사고방식이다.


TASK설계는 본질은 도구가 아닌 사고방식이고, 아래는 이 TASK가 사용할 도구다.


실제로 책은 Mutex를 직접 흐름보다는 개념적 설명을 우선시하기때문에


이 부분부터는 책의 내용을 제외하고 동시성을 구현하기 위한 '도구' 즉 시스템을 이야기할 차례다.



3ee59e36ebd518986abce8954f87716ff5

쓰레드&락(Threads and Locks)


핵심특징: 가장 전통적 동시성 모델이며, 운영체제가 제공하는 '쓰레드' 라는 실행 단위와 

뮤텍스Mutex , 세마포어Semaphore 와 같은 락(Lock) 기반 매커니즘을 사용하여 동시성을 구현한다.


공유 메모리 기반으로 쓰레드 간 데이터 공유가 용이하지만, 동기화 문제(레이스 컨디션, 데드 락)등 발생 가능성이 높고, 프로그래머가 직접 락을 관리해야하므로 복잡성이 높다.


대부분의 언어 C, C++,Java,C#등이 지원한다.


TASK와 관계:쓰레드와 락 모델은 가장 Low-Level이며, 기본적인 병행성이다.

Task는 쓰레드 풀이라는 쓰레드 기반 모델을 추상화하는데, Task를 쓰레드위에서 '구현'한다.



3ee49e36ebd518986abce8954583766849ab


CSP(CommunicatingSequential Processes)


핵심특징: 순차적으로 실행되는 프로세스 간의 통신을 동시성으로 구현하는 모델

프로세스 (또는 쓰레드) 는 독립적인 실행 단위로 동작하며, 데이터 공유 대신 "채널 (Channel)" 이라는 메시지 큐를 통해 데이터를 주고받으며 동기화

채널은 쓰레드 간 안전한 통신을 보장하고, 데이터 경쟁 (Race Condition) 을 원천적으로 방지

고 (Go), Erlang, Clojure (core.async 라이브러리) 등에서 주로 사용


TASK와의 관계: 일반적으로 생산자와 소비자의 관계로 구현된다. CSP 채널은 태스크 작업의 큐로 활용되고, TASK는 풀로 동적워커 그룹을 관리한다.

TASK는 실행의 단위의 추상화고

CSP 채널은 통신의 규칙을 추상화한다. 이 둘의 결합은 공유 메모리 없는 동시성이라는 CSP철학을 구현하기에 좋다.




3eec8068f5dc3f8650bbd58b36827c6a6670

Actor모델


핵심 특징: "액터 (Actor)" 라는 독립적인 객체들이 메시지를 통해 상호작용하는 분산 병행 모델

액터는 자신만의 상태와 행동을 캡슐화하고, 메시지 큐를 통해 비동기적으로 다른 액터와 통신 액터 모델은 inherently 병행적이며, 

메시지 기반 통신을 통해 동기화와 데이터 공유 문제를 간결하고 안전하게 해결할 수 있도록 도와줌. 에를랑 (Erlang), 아카 (Akka), 오를레앙 (Orleans), Vert.x 등 

액터 모델을 기반으로 하는 다양한 프레임워크가 존재하며, 분산 시스템, 내결함성 시스템, 반응형 시스템 구축에 널리 사용됨


TASK와의 관계; 액터 모델과 TASK는 동시성 모델을 추상화하는 수준에서 유사점을 가지나,

액터는 독립적인 행동자, TASK는 독립적인 단위로 추상화되어있다. 일반적으로 Task+액터 모델은 메세지 주도 아키텍쳐로 TASK를 액터의 메세지 처리 단위로 사용한다.




22ec8168f2d73ab64e81d2b628f1766c2ff2c9

STM(SoftWare Transactional Memory)


핵심 특징: 데이터베이스 트랜잭션 개념을 메모리 연산에 적용하여 락 없이 동기화를 구현하는 모델

원자적 블록 (Atomic Block) 을 사용하여 공유 메모리 접근을 트랜잭션으로 감싸고, 트랜잭션 충돌이 발생하면 자동으로 롤백 (Rollback) 하여 데이터 일관성을 보장한다.

락 기반 동기화의 복잡성과 데드락 문제를 해결하고, 더욱 쉽고 안전하게 동시성 제어를 할 수 있도록 도와줌

하스켈 (Haskell), 클로저 (Clojure), 스칼라 (Scala), Java (STM 라이브러리) 등에서 지원하며, 복잡한 공유 상태 관리가 필요한 병행 프로그램에 유용하다.


TASK와의 관계: Task는 트랙잭션 작업의 비동기 실행 단위가 되고, STM은 공유 메모리에 대한 원자적(Atomic) 접근을 보장한다. 장점은 트랙잭션의 합성성(Composability)가 보장된다는 것이다.




22ec8268f5dc3f8650bbd58b3683746ec500

"병렬 컴퓨팅이 미래다"라는 말은 완전히 엉터리다 -리누스 토르발즈


나 역시 전설적인 프로그래머인 리누스 형님의 말을 이해한다.


이런 어려운 프로그래밍이 프로그래머의 미래가 되어서는 안된다.


만약 병렬 프로그래밍을 기본으로 해야할 세상이 온다면 나는 삶의 희망을 잃고 내 방 천장에 키링이 될 것이다.



위 내용들을 단순하게 짧게 요약하면 다음과 같다.



동시 프로그래밍은

1.Task 스케쥴링(Task Scheduling) -어떤 작업을 언제 실행할 것인가?

2.상호 배제(Mutex),락(Lock),비동기처리(Async)등 동기화 기법

3.리소스 경합(Resource Contention) 최소화-여러 작업이 동시에 공유 작업에 접근할때 해결


-동시 프로그래밍은 어떤 순서로 실행할 것인가?의 문제다


병렬 프로그래밍은 

1.Task 분할(Work Decomposition)

2.데이터 종속성(Data Dependency) 최소화

3. 로드 밸런싱(Load Balancing)-모든 코어가 균등하게 작업하게 하는 것


-병렬 프로그래밍은 어떻게 나눌 것인가?의 문제다


그럼 다들 오늘도 즐거운 프로그래밍!


추천 비추천

9

고정닉 1

2

댓글 영역

전체 댓글 0
등록순정렬 기준선택
본문 보기

하단 갤러리 리스트 영역

왼쪽 컨텐츠 영역

갤러리 리스트 영역

갤러리 리스트
번호 제목 글쓴이 작성일 조회 추천
설문 타고난 드립력으로 사석에서 만나도 웃길 것 같은 스타는? 운영자 25/02/10 - -
2818281 이렇게 선택하면 지금 갤럭시가 내놓은 최강노트북 되는거지?? ㅇㅇ(123.213) 02.14 35 0
2818280 일하는게 너무 재미있음 [2] 익명의따당이갤로그로 이동합니다. 02.14 49 0
2818279 나 오늘 안전 사고 사례로 나올뻔 [1] ㅆㅇㅆ찡갤로그로 이동합니다. 02.14 54 0
2818278 니네 회사도 헤드셋이나 이어폰 끼고 프갤러(112.217) 02.14 28 0
2818277 인스타 보는데, 여자가 한시간만에 프로그램 뚝딱 [2] 머스크멜론(218.234) 02.14 56 0
2818276 개발자 노트북으로 그램 17 VS 요가북 9i [6] 프갤러(210.126) 02.14 49 0
2818275 프갤=노가다 갤러리 [17] ㅇㅇ(211.235) 02.14 202 7
2818273 화교분탕들의 집요한 지센 연애썰 날조 - 등본 주작 ㅇㅇ(175.223) 02.14 31 0
2818272 동남아 백수 오늘의 모닝 커피. [2] 40대프린이(175.176) 02.14 45 1
2818271 컴공 출신 개발자는 좀 취업되냐 반도체 전공하는게 낫나 [13] ㅇㅇ(106.101) 02.14 106 0
2818270 지잡컴공 자퇴했다 [11] ㅇㅇ(221.151) 02.14 104 1
2818269 딥시크 이새끼왤케멍청함? [1] ㅇㅇ갤로그로 이동합니다. 02.14 41 0
2818268 프로그래머들아 코딩 인력을 챗지피티로 대신한다는게 진짜 가능하냐? [8] 프갤러(211.235) 02.14 94 0
2818267 핏덩이는 선짓국 ㅇㅇ(211.219) 02.14 22 0
2818266 나라상태를볼려면 그나라재벌기득권보면 되는거맞음 뒷통수한방(1.213) 02.14 28 0
2818265 근데 자바스크립트 << 이새끼 언어 맞지? [4] 프갤러(211.210) 02.14 68 0
2818264 전시물 구경 발명도둑잡기갤로그로 이동합니다. 02.14 23 0
2818263 하루 한 번 헤르미온느 찬양 헤르 미온느갤로그로 이동합니다. 02.14 29 0
2818262 dda 프갤러(59.29) 02.14 16 0
2818261 드라마 제목이 이게 뭐노 [1] 아스카영원히사랑해갤로그로 이동합니다. 02.14 55 0
2818260 신종야옹씨가 윤괴수 탄핵찬성하는건 볼때마다 놀랍 헬마스터갤로그로 이동합니다. 02.14 33 0
2818259 어느 1군 걸그룹 월드투어에 대한 합리적 의문 ㅇㅇ(175.223) 02.14 39 0
2818258 노가다 나왔다 [4] ㅆㅇㅆ찡갤로그로 이동합니다. 02.14 79 2
2818256 인지과학조져라 손발이시립디다갤로그로 이동합니다. 02.14 37 0
2818255 윤석열 탄핵 가결되면 청와대에서 파티해야함 신종야옹갤로그로 이동합니다. 02.14 30 0
2818254 다시보는 sqlite blob *루비*갤로그로 이동합니다. 02.14 33 0
2818253 오늘 저녁은 노숙자 급식소 가서 먹어야지 ㅎㅎ *루비*갤로그로 이동합니다. 02.14 34 0
2818249 winAPI 다뤄봤으면 HLSL도 금방배움? [3] ㅇㅇ(124.60) 02.14 86 0
2818246 문제만 풀수있고 실제 동작은 어떤지 못그리겠음 [1] ㅇㅇ(118.235) 02.14 34 0
2818242 방금 메인보드 지름. 16만 1천원이네 ㅠㅠ *루비*갤로그로 이동합니다. 02.14 43 0
2818241 이재명 주 4일제 웃겨서 토나온다. 넥도리아(223.38) 02.14 63 0
2818240 옥상에 노숙자들 찾아와서 치킨 먹거나 아무튼 그래 넥도리아(223.38) 02.14 27 0
2818239 우리집은 아버지가 아들한테 에쎈프라임한 보루 사오라고 심부름. 넥도리아(223.38) 02.14 31 0
2818238 메인보드를 뭘 골라야할까. 일단 메모리 슬롯 4 [6] *루비*갤로그로 이동합니다. 02.14 41 0
2818237 아 짜증나 움직일 때마다 usb2.0 알림소리 들린다. 넥도리아(223.38) 02.14 26 0
2818236 나를 개발 소스를 분석하라고 하지 는 않겠어. [1] 넥도리아(223.38) 02.14 41 0
2818235 폰 바꾸라는 애기하지마라 옆에젠폰4 일본어 한국구글키보드로 하고 있다. 넥도리아(223.38) 02.14 24 0
2818234 디시할 때 글중간에 사진 넣으면 텍스트 날라감 넥도리아(223.38) 02.14 29 0
2818233 아 자꾸 이미지 세션이 날아간다. 넥도리아(223.38) 02.14 35 0
2818230 마이크 고무 떼서 이 폰 스피커폰으로 통화해야 통화됨 넥도리아(223.38) 02.14 23 0
2818228 아 2시간에서 3시간 째 안되면 접어야 하는데 넥도리아(223.38) 02.14 25 0
2818227 내가 바로 따국쟝이댱 ㅇㅅㅇㅋ [6] 익명의따당이갤로그로 이동합니다. 02.14 54 0
2818225 디시게시글이멈춘다. 넥도리아(223.38) 02.14 21 0
2818224 홈페이지렉... 혹시해킹에 의해서도 내 pc가 멈출 수 있을까? 넥도리아(223.38) 02.14 20 0
2818218 분야 인공지능으로 갈거면 알고리즘 굳이 안해도 됨? [2] 프갤러(112.169) 02.14 58 0
2818217 웹 호스팅 도서 추천 몰라(211.36) 02.14 26 0
2818215 노션 말고 개인생산성앱 추천 좀 해줘 [6] 프갤러(118.33) 02.14 61 0
2818213 그누보드 쓰지마 ㅇㅇ(211.219) 02.14 30 0
2818207 아스카 문명했습니다 [7] 아스카영원히사랑해갤로그로 이동합니다. 02.14 90 0
2818205 74% 넥도리아(112.170) 02.14 23 0
뉴스 ‘이혼숙려캠프’ 서장훈, 지인 전화 요금 내주는 남편에 “여유 있는 나도 저러지 않는다” 디시트렌드 02.14
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2