맨위로가기

병행 컴퓨팅

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

병행 컴퓨팅은 여러 계산을 동시에 수행하는 방식으로, 19세기 철도 및 전보 시스템 연구에서 개념이 시작되었다. 1960년대부터 병행 알고리즘에 대한 학문적 연구가 시작되었으며, 액터 모델, 페트리 네트, 프로세스 계산, 입출력 오토마톤 등의 모델이 병행 시스템을 이해하고 분석하는 데 사용된다. 병행 프로그램을 구현하기 위해 프로세스 또는 스레드를 사용하며, 공유 메모리 통신과 메시지 전달 통신 방식을 통해 병행 구성 요소 간의 상호 작용을 구현한다. 병렬 프로그래밍 언어는 병행성을 위한 구조를 제공하며, 자바, C# 등이 널리 사용된다. 최근 한국에서는 병행 프로그래밍을 지원하는 함수형 언어에 대한 관심이 증가하고 있다.

더 읽어볼만한 페이지

  • 병행 컴퓨팅 - 슈퍼컴퓨터
    슈퍼컴퓨터는 일반 컴퓨터보다 훨씬 높은 성능을 가진 컴퓨터로, 복잡한 계산과 시뮬레이션을 수행하며, 프로세서, 메모리, 스토리지, 네트워크 등으로 구성되어 병렬 처리를 통해 높은 성능을 구현하고, 군사, 기상 예측, 과학 기술 분야, 인공지능 등 다양한 분야에서 활용되고 있다.
  • 병행 컴퓨팅 - 프로세스
    프로세스는 컴퓨터에서 실행되는 프로그램의 인스턴스로, 운영 체제가 시스템 자원을 효율적으로 관리하며 멀티태스킹 환경에서 독립적인 실행 흐름을 유지한다.
  • 에츠허르 데이크스트라 - 교착 상태
    교착 상태는 둘 이상의 프로세스가 자원을 점유하고 서로의 자원을 요청하여 더 이상 진행할 수 없는 상태를 의미하며, 상호 배제, 점유 대기, 비선점, 순환 대기 네 가지 조건이 모두 충족되어야 발생하고, 운영 체제는 이를 예방, 회피, 무시, 발견하는 방법으로 관리한다.
  • 에츠허르 데이크스트라 - 세마포어
    세마포어는 데이크스트라가 고안한 정수 변수로, P/V 연산을 통해 자원 접근을 제어하고 동기화 문제를 해결하며, 계수 세마포어와 이진 세마포어로 나뉘어 멀티스레드 환경에서 자원 관리 및 스레드 동기화에 기여한다.
병행 컴퓨팅
일반 정보
정의여러 계산이 겹치는 기간 동안 실행되는 컴퓨팅 형태
설명프로그램, 알고리즘 또는 문제가 여러 독립적으로 실행되는 부분으로 분해되어 동시에 또는 부분적으로 실행될 수 있는 능력
개요
관련 분야운영 체제
병렬 프로그래밍
분산 시스템
관련 개념교착 상태
경쟁 조건
상호 배제
동기화
병행성 제어
구현 방법다중 처리
다중 스레딩
분산 컴퓨팅

2. 역사

병행 컴퓨팅의 개념은 19세기와 20세기 초, 철도전보 시스템의 발전과 함께 등장했다. 이 시기에는 여러 열차를 효율적으로 관리하고, 주어진 전선에서 여러 전송을 처리하는 방법에 대한 고민이 필요했다. 예를 들어, 1870년대 시분할 다중화와 같이 효율성을 높이기 위해 주어진 선로에서 여러 전송들을 어떻게 관리할 것인지에 대한 질문에서 병행 컴퓨팅의 초기 아이디어가 나왔다. 이러한 초기 연구는 세마포어와 같은 용어의 등장에도 기여했다.[8]

1960년대에 에츠허르 데이크스트라상호 배제 문제를 식별하고 해결하는 논문을 발표하면서 병행 알고리즘에 대한 학문적 연구가 본격적으로 시작되었다.[26]

3. 모델

병행 컴퓨팅을 이해하고 분석하기 위한 다양한 모델들이 존재한다. 대표적인 모델로는 액터 모델, 페트리 네트, 프로세스 계산, 입출력 오토마톤 등이 있다.[1]

이 외에도 램포트의 TLA+와 같은 논리, 트레이스 및 액터 이벤트 다이어그램과 같은 수학적 모델도 병행 시스템의 동작을 설명하기 위해 개발되었다.[1] 소프트웨어 트랜잭션 메모리는 데이터베이스 이론에서 원자적 트랜잭션 개념을 빌려 메모리 접근에 적용한다.[1]

3. 1. 액터 모델

액터 모델은 병행 컴퓨팅의 한 형태로, "액터"라고 불리는 독립적인 계산 주체들이 메시지를 주고받으며 상호작용하는 방식으로 동작한다.

3. 2. 페트리 네트

페트리넷은 1962년에 소개된 병행 컴퓨팅 모델로, 병행 실행 규칙을 체계화하려는 초기 시도였다.[1] 이후 데이터 플로우 아키텍처가 데이터 흐름 이론을 기반으로 구축되었으며, 데이터 흐름 이론의 아이디어를 물리적으로 구현하기 위해 만들어졌다.[1]

3. 3. 프로세스 계산

프로세스 계산은 1970년대 후반부터 개발된 병행 시스템의 동작을 수학적으로 표현하고 분석하기 위한 형식 체계이다.[1] 통신 시스템 계산법(CCS) 및 통신 순차 프로세스(CSP) 등이 대표적이며, 상호 작용하는 구성 요소로 구성된 시스템에 대한 대수적 추론을 허용한다.[1] π-계산법은 동적 토폴로지에 대한 추론 기능을 추가했다.[1]

3. 4. 입출력 오토마톤

입출력 오토마톤은 1987년에 소개되었다. 입출력 오토마톤은 시스템의 입출력 동작을 모델링하고 분석하는 데 사용되는 형식 체계로, 병행 시스템의 상호작용을 분석하는 데 유용하다.[1]

4. 구현

병행 프로그램은 다양한 방법으로 구현될 수 있다. 예를 들어, 각 계산 실행을 운영 체제 프로세스로 구현하거나, 계산 프로세스를 단일 운영 체제 프로세스 내의 스레드 집합으로 구현할 수 있다.[3][6]

운영 체제가 제공하는 프로세스와 스레드의 동시 실행과 그 상호 통신이 구현의 틀이 되며, 프로세스 그룹과 스레드 그룹의 병행 실행에 따른 복수 작업의 동시 실행 가능성은 멀티태스킹 등으로 불린다.

4. 1. 상호작용 및 통신

병행 컴퓨팅 시스템에서 병행 구성 요소 간의 통신은 프로그래머에게 숨겨질 수도 있고(예: 퓨처 사용), 명시적으로 처리해야 할 수도 있다. 명시적 통신은 크게 공유 메모리 통신과 메시지 전달 통신 두 가지 유형으로 나눌 수 있다.

  • 공유 메모리 통신: 병행 구성 요소들이 공유 메모리 위치의 내용을 변경하여 통신하는 방식이다.
  • 메시지 전달 통신: 병행 구성 요소들이 메시지 교환을 통해 통신하는 방식이다.


일반적으로 (항상 그런 것은 아니지만) 프로세스당 메모리 오버헤드와 작업 전환 오버헤드는 메시지 전달 시스템에서 더 낮지만, 메시지 전달 자체의 오버헤드는 프로시저 호출보다 더 크다. 이러한 차이점은 종종 다른 성능 요인에 의해 상쇄된다. 메시지 전달은 공유 메모리 캐시 일관성 유무에 관계없이 대칭형 멀티프로세싱을 통해 효율적으로 구현할 수 있다.

4. 1. 1. 공유 메모리 통신

병행 구성 요소는 공유 메모리 위치의 내용을 변경하여 통신한다. 자바 및 C#에서 주로 사용된다.[6] 이 방식의 병행 프로그래밍은 일반적으로 스레드 간 조정을 위해 뮤텍스, 세마포어, 모니터 등의 잠금 장치를 사용해야 한다.[6] 이러한 잠금 장치를 제대로 구현한 프로그램을 스레드 안전하다고 한다.

동기 경향을 띤다. 명시적인 조작은 특별한 프로그램 구문을 필요로 하며, 소프트웨어 트랜잭션 메모리, 임계 구역동기 등의 모델에 따라 구현된다.

병렬 컴포넌트들은 공유 메모리의 내용을 갱신함으로써 통신을 수행한다. 임계 구역을 정하고 락 객체를 사용하여 동기화하여 그 범위를 병행성 제어한다. 락 기법에는 세마포어, 뮤텍스, 모니터, 배리어, 읽기/쓰기 락 등이 있다.

4. 1. 2. 메시지 전달 통신

병행 구성 요소들은 메시지를 교환하여 통신한다. MPI, Go, Scala, Erlang, occam 등이 이러한 통신 방식을 사용한다. 메시지 교환은 비동기적으로 수행될 수도 있고, 송신자가 메시지를 받을 때까지 차단되는 동기식 "랑데부" 스타일을 사용할 수도 있다. 비동기 메시지 전달은 신뢰할 수 있거나 신뢰할 수 없을 수 있으며, 이를 "전송 및 기도"라고도 한다. 메시지 전달 병행성은 공유 메모리 병행성보다 추론하기 쉽고, 더 강력한 병행 프로그래밍 형태로 간주된다. 액터 모델 및 다양한 프로세스 계산 등 메시지 전달 시스템을 이해하고 분석하기 위한 여러 수학적 이론이 존재한다.

5. 일관성 모델

병행 프로그래밍 언어와 멀티프로세서 프로그램은 일관성 모델(메모리 모델이라고도 함)을 가져야 한다. 일관성 모델은 컴퓨터 메모리에 대한 연산이 어떻게 발생하고 결과가 생성되는지에 대한 규칙을 정의한다.

최초의 일관성 모델 중 하나는 레슬리 램포트의 순차적 일관성 모델이었다. 순차적 일관성은 프로그램의 실행이 순차적 프로그램과 동일한 결과를 생성하는 속성이다. 구체적으로, "모든 프로세서의 연산이 어떤 순차적 순서로 실행되고, 각 개별 프로세서의 연산이 해당 프로그램에 의해 지정된 순서로 이 순서에 나타나는 경우" 순차적으로 일관적이다.[7]

일관성 모델은 여러 프로세스/스레드가 동시에 데이터 영역에 읽기/쓰기를 수행해도 순차적 계산과 완전히 동일한 결과를 얻을 수 있도록 하기 위한 계산 모델이다. 일관성 모델을 구현할 때 공유 메모리 통신에 분류되는 임계 구역 동기화가 자주 사용된다.

6. 병행 프로그래밍 언어

병행 프로그래밍 언어는 병행성을 위한 언어 구조를 사용하는 프로그래밍 언어이다. 이러한 구조에는 다중 스레딩, 분산 컴퓨팅 지원, 메시지 전달, 공유 메모리 또는 퓨처 및 프로미스가 포함될 수 있다.[9] 이러한 언어는 때때로 '병행 지향 언어' 또는 '병행 지향 프로그래밍 언어'(COPL)라고도 불린다.

오늘날 병행성을 위한 특정 구조를 가진 가장 일반적인 프로그래밍 언어는 Java와 C#이다. 이 두 언어는 기본적으로 공유 메모리 병행성 모델을 사용하며, 모니터를 통해 잠금을 제공한다(메시지 전달 모델은 기본 공유 메모리 모델 위에 구현될 수 있으며, 구현되어 왔다). 메시지 전달 병행성 모델을 사용하는 언어 중에서는 Erlang이 현재 업계에서 가장 널리 사용된다.

많은 병행 프로그래밍 언어는 생산용보다는 연구용 언어(예: Pict)로 더 많이 개발되었다. 그러나 Erlang, Limbo, occam과 같은 언어는 지난 20년 동안 다양한 시기에 산업적으로 사용되었다.

다음은 병행 프로그래밍 기능을 사용하거나 제공하는 언어들의 목록이다. (단, 모든 언어를 포함하는 것은 아니다.)

언어설명
Ada범용, 메시지 전달 및 모니터 기반 병행성을 기본적으로 지원
Alef스레드 및 메시지 전달을 통한 병행성, 초기 버전의 벨 연구소의 플랜 9에서 시스템 프로그래밍용
Alice표준 ML의 확장, 퓨처를 통한 병행성 지원 추가
아테지 PXπ-미적분에서 영감을 받은 병렬 기본 요소를 갖춘 Java의 확장
Axum도메인별, 병행, 액터 모델 및 C와 유사한 구문을 사용하는 .NET 공용 언어 런타임 기반
BMDFM이진 모듈 데이터플로우 머신
C++스레드 및 코루틴 지원 라이브러리[10][11]
(C 오메가)연구용, C#을 확장, 비동기 통신 사용
C#lock영어, yield영어를 사용하여 병행 컴퓨팅을 지원하며, 버전 5.0부터 async영어 및 await영어 키워드가 도입됨
클로저Java 플랫폼의 현대적이며 함수형 Lisp 방언
병행 클린Haskell과 유사한 함수형 프로그래밍
병행 컬렉션 (CnC)데이터와 제어의 흐름을 명시적으로 정의하여 메모리 모델과 무관하게 암시적 병렬성을 달성
병행 Haskell공유 메모리에서 병행 프로세스를 작동시키는 지연적 순수 함수형 언어
병행 ML표준 ML의 병행 확장
병행 파스칼Per Brinch Hansen 작성
Curry
D다중 패러다임 시스템 프로그래밍 언어로 병행 프로그래밍 (액터 모델)을 명시적으로 지원
E데드락을 방지하기 위해 프라미스를 사용
ECMAScript비동기 작업을 위해 프라미스를 사용
EiffelSCOOP 메커니즘을 통해 계약에 의한 설계를 기반으로 함
ElixirErlang VM에서 실행되는 동적이고 함수적인 메타 프로그래밍 인식 언어
Erlang공유 메모리 없이 동기 또는 비동기 메시지 전달을 사용
FAUST신호 처리를 위한 실시간 함수형, 컴파일러는 OpenMP 또는 특정 작업 훔치기 스케줄러를 통해 자동 병렬화를 제공
포트란coarrays 및 do concurrent는 Fortran 2008 표준의 일부
GoCSP를 기반으로 하는 병행 프로그래밍 모델을 갖춘 시스템 프로그래밍용
Haskell병행 및 병렬 함수형 프로그래밍 언어[12]
Hume오토마타 프로세스가 동기 채널 패턴 및 메시지 전달로 설명되는 제한된 공간 및 시간 환경을 위한 함수형, 병행
Io액터 기반 병행성
Janus논리 변수에 대한 고유한 askerteller, 가방 채널을 특징으로 하며 순수하게 선언적
Java스레드 클래스 또는 Runnable 인터페이스
Julia"병행 프로그래밍 기본 요소: 작업, async-wait, 채널."[13]
자바스크립트웹 워커, 브라우저 환경에서 프라미스, 콜백을 통해
JoCaml채널 기반의 병행 및 분산, OCaml의 확장, 프로세스의 join-calculus를 구현
조인 자바Java 언어를 기반으로 하는 병행성
Joule데이터 흐름 기반, 메시지 전달로 통신
JoycePer Brinch Hansen이 CSP의 기능을 갖춘 병행 파스칼을 기반으로 구축된 병행, 교육용
랩뷰그래픽, 데이터 흐름, 함수는 그래프의 노드이고, 데이터는 노드 간의 와이어. 객체 지향 언어 포함
LimboAlef의 친척, Inferno (운영 체제)에서 시스템 프로그래밍용
로코모티브 BASICAmstrad의 BASIC 변형은 병행 서브루틴에 대한 EVERY 및 AFTER 명령을 포함
멀티리습병렬 처리를 지원하도록 확장된 Scheme 변형
모듈라-2N. Wirth가 파스칼의 후속으로 코루틴을 기본적으로 지원하는 시스템 프로그래밍용
모듈라-3스레드, 뮤텍스, 조건 변수에 대한 광범위한 지원을 갖춘 Algol 계열의 현대적 멤버
뉴스퀵연구용, 채널을 일급 값으로 사용; Alef의 전신
occam통신 순차 프로세스 (CSP)의 영향을 크게 받음
occam-π밀너의 π-미적분의 아이디어를 통합한 occam의 현대적 변형
ooRexx객체 기반, 통신 및 동기화를 위한 메시지 교환
Orc매우 병행적이고 비결정적이며 Kleene 대수를 기반으로 함
Oz-Mozart다중 패러다임, 공유 상태 및 메시지 전달 병행성, 퓨처를 지원
ParaSail객체 지향, 병렬, 포인터가 없고, 경합 상태가 없음
PHPGo에서 영감을 받은 메시지 전달을 구현하는 병렬 확장을 갖춘 다중 스레딩 지원[14]
Pict본질적으로 밀너의 π-미적분의 실행 가능한 구현
Raku기본적으로 스레드, 프라미스 및 채널에 대한 클래스를 포함[15]
Python스레드 기반 병렬 처리 및 프로세스 기반 병렬 처리를 사용[16]
Reia공유되지 않는 객체 간에 비동기 메시지 전달을 사용
Red/SystemRebol을 기반으로 한 시스템 프로그래밍용
Rust시스템 프로그래밍용, 이동 의미 체계, 공유 불변 메모리 및 공유 가변 메모리를 사용한 메시지 전달 사용.[17]
Scala범용, 간결하고 우아하며 유형 안전한 방식으로 일반적인 프로그래밍 패턴을 표현하도록 설계됨
시퀀스L범용 함수형, 주요 설계 목표는 프로그래밍 용이성, 코드 명확성-가독성, 다중 코어 하드웨어에서 성능을 위한 자동 병렬화 및 경합 조건이 없음을 증명할 수 있음
SR연구용
슈퍼파스칼Per Brinch Hansen이 병행 파스칼 및 Joyce를 기반으로 구축된 병행, 교육용
Swift구조화된 방식으로 비동기 및 병렬 코드를 작성하기 위한 내장 지원[18]
Unicon연구용
TNSDL통신 교환 개발용, 비동기 메시지 전달 사용
VHSIC 하드웨어 설명 언어 (VHDL)IEEE STD-1076
XCXMOS에서 개발한 C 언어의 병행성 확장 하위 집합, 통신 순차 프로세스를 기반으로 하며, 프로그래밍 가능한 I/O를 위한 내장 구조



최근 한국에서는 함수형 프로그래밍 언어의 인기가 높아짐에 따라, 병행 프로그래밍을 지원하는 함수형 언어(예: Scala, Clojure)에 대한 관심도 증가하고 있다.

참조

[1] 서적 Operating System Concepts
[2] 서적 The Origin of Concurrent Programming https://link.springe[...]
[3] 간행물 Concurrency is not Parallelism http://talks.golang.[...] 2012-01-11
[4] 웹사이트 Parallelism vs. Concurrency https://wiki.haskell[...]
[5] 서적 On Concurrent Programming https://archive.org/[...] Springer 1997-05-06
[6] 서적 Principles of Concurrent and Distributed Programming Addison-Wesley
[7] 학술지 How to Make a Multiprocessor Computer That Correctly Executes Multiprocess Programs 1979-09-01
[8] 웹사이트 PODC Influential Paper Award: 2002 http://www.podc.org/[...] 2009-08-24
[9] 웹사이트 Making reliable distributed systems in the presence of software errors http://www.diva-port[...]
[10] 웹사이트 Standard library header (C++11) https://en.cpprefere[...] 2024-10-03
[11] 웹사이트 Standard library header (C++20) https://en.cpprefere[...] 2024-10-03
[12] 서적 Parallel and Concurrent Programming in Haskell : Techniques for Multicore and Multithreaded Programming
[13] 웹사이트 Concurrent and Parallel programming in Julia — JuliaCon India 2015 — HasGeek Talkfunnel https://juliacon.tal[...]
[14] 웹사이트 PHP: parallel - Manual https://www.php.net/[...] 2024-10-03
[15] 웹사이트 Concurrency https://docs.perl6.o[...] 2017-12-24
[16] 문서 Documentation » The Python Standard Library » Concurrent Execution https://docs.python.[...]
[17] 웹사이트 Typesafe Shared Mutable State http://winningraceco[...] 2012-11-14
[18] 웹사이트 Concurrency https://docs.swift.o[...] 2022-12-15
[19] 서적 Operating System Concepts
[20] 간행물 Concurrency is not Parallelism http://talks.golang.[...] 2012-01-11
[21] 웹사이트 Parallelism vs. Concurrency https://wiki.haskell[...] 2020-01
[22] 서적 On Concurrent Programming Springer 1997-05-06
[23] 서적 Principles of Concurrent and Distributed Programming Addison-Wesley
[24] 서적 Principles of Concurrent and Distributed Programming Addison-Wesley
[25] 서적 Operating System Concepts
[26] 웹사이트 PODC Influential Paper Award: 2002 http://www.podc.org/[...] 2009-08-24



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com