병행 컴퓨팅
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
병행 컴퓨팅은 여러 계산을 동시에 수행하는 방식으로, 19세기 철도 및 전보 시스템 연구에서 개념이 시작되었다. 1960년대부터 병행 알고리즘에 대한 학문적 연구가 시작되었으며, 액터 모델, 페트리 네트, 프로세스 계산, 입출력 오토마톤 등의 모델이 병행 시스템을 이해하고 분석하는 데 사용된다. 병행 프로그램을 구현하기 위해 프로세스 또는 스레드를 사용하며, 공유 메모리 통신과 메시지 전달 통신 방식을 통해 병행 구성 요소 간의 상호 작용을 구현한다. 병렬 프로그래밍 언어는 병행성을 위한 구조를 제공하며, 자바, C# 등이 널리 사용된다. 최근 한국에서는 병행 프로그래밍을 지원하는 함수형 언어에 대한 관심이 증가하고 있다.
더 읽어볼만한 페이지
- 병행 컴퓨팅 - 슈퍼컴퓨터
슈퍼컴퓨터는 일반 컴퓨터보다 훨씬 높은 성능을 가진 컴퓨터로, 복잡한 계산과 시뮬레이션을 수행하며, 프로세서, 메모리, 스토리지, 네트워크 등으로 구성되어 병렬 처리를 통해 높은 성능을 구현하고, 군사, 기상 예측, 과학 기술 분야, 인공지능 등 다양한 분야에서 활용되고 있다. - 병행 컴퓨팅 - 프로세스
프로세스는 컴퓨터에서 실행되는 프로그램의 인스턴스로, 운영 체제가 시스템 자원을 효율적으로 관리하며 멀티태스킹 환경에서 독립적인 실행 흐름을 유지한다. - 에츠허르 데이크스트라 - 교착 상태
교착 상태는 둘 이상의 프로세스가 자원을 점유하고 서로의 자원을 요청하여 더 이상 진행할 수 없는 상태를 의미하며, 상호 배제, 점유 대기, 비선점, 순환 대기 네 가지 조건이 모두 충족되어야 발생하고, 운영 체제는 이를 예방, 회피, 무시, 발견하는 방법으로 관리한다. - 에츠허르 데이크스트라 - 세마포어
세마포어는 데이크스트라가 고안한 정수 변수로, P/V 연산을 통해 자원 접근을 제어하고 동기화 문제를 해결하며, 계수 세마포어와 이진 세마포어로 나뉘어 멀티스레드 환경에서 자원 관리 및 스레드 동기화에 기여한다.
병행 컴퓨팅 | |
---|---|
일반 정보 | |
정의 | 여러 계산이 겹치는 기간 동안 실행되는 컴퓨팅 형태 |
설명 | 프로그램, 알고리즘 또는 문제가 여러 독립적으로 실행되는 부분으로 분해되어 동시에 또는 부분적으로 실행될 수 있는 능력 |
개요 | |
관련 분야 | 운영 체제 병렬 프로그래밍 분산 시스템 |
관련 개념 | 교착 상태 경쟁 조건 상호 배제 동기화 병행성 제어 |
구현 방법 | 다중 처리 다중 스레딩 분산 컴퓨팅 |
2. 역사
병행 컴퓨팅의 개념은 19세기와 20세기 초, 철도와 전보 시스템의 발전과 함께 등장했다. 이 시기에는 여러 열차를 효율적으로 관리하고, 주어진 전선에서 여러 전송을 처리하는 방법에 대한 고민이 필요했다. 예를 들어, 1870년대 시분할 다중화와 같이 효율성을 높이기 위해 주어진 선로에서 여러 전송들을 어떻게 관리할 것인지에 대한 질문에서 병행 컴퓨팅의 초기 아이디어가 나왔다. 이러한 초기 연구는 세마포어와 같은 용어의 등장에도 기여했다.[8]
병행 컴퓨팅을 이해하고 분석하기 위한 다양한 모델들이 존재한다. 대표적인 모델로는 액터 모델, 페트리 네트, 프로세스 계산, 입출력 오토마톤 등이 있다.[1]
1960년대에 에츠허르 데이크스트라는 상호 배제 문제를 식별하고 해결하는 논문을 발표하면서 병행 알고리즘에 대한 학문적 연구가 본격적으로 시작되었다.[26]
3. 모델
이 외에도 램포트의 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#을 확장, 비동기 통신 사용 |
C# | lock영어, yield영어를 사용하여 병행 컴퓨팅을 지원하며, 버전 5.0부터 async영어 및 await영어 키워드가 도입됨 |
클로저 | Java 플랫폼의 현대적이며 함수형 Lisp 방언 |
병행 클린 | Haskell과 유사한 함수형 프로그래밍 |
병행 컬렉션 (CnC) | 데이터와 제어의 흐름을 명시적으로 정의하여 메모리 모델과 무관하게 암시적 병렬성을 달성 |
병행 Haskell | 공유 메모리에서 병행 프로세스를 작동시키는 지연적 순수 함수형 언어 |
병행 ML | 표준 ML의 병행 확장 |
병행 파스칼 | Per Brinch Hansen 작성 |
Curry | |
D | 다중 패러다임 시스템 프로그래밍 언어로 병행 프로그래밍 (액터 모델)을 명시적으로 지원 |
E | 데드락을 방지하기 위해 프라미스를 사용 |
ECMAScript | 비동기 작업을 위해 프라미스를 사용 |
Eiffel | SCOOP 메커니즘을 통해 계약에 의한 설계를 기반으로 함 |
Elixir | Erlang VM에서 실행되는 동적이고 함수적인 메타 프로그래밍 인식 언어 |
Erlang | 공유 메모리 없이 동기 또는 비동기 메시지 전달을 사용 |
FAUST | 신호 처리를 위한 실시간 함수형, 컴파일러는 OpenMP 또는 특정 작업 훔치기 스케줄러를 통해 자동 병렬화를 제공 |
포트란 | coarrays 및 do concurrent는 Fortran 2008 표준의 일부 |
Go | CSP를 기반으로 하는 병행 프로그래밍 모델을 갖춘 시스템 프로그래밍용 |
Haskell | 병행 및 병렬 함수형 프로그래밍 언어[12] |
Hume | 오토마타 프로세스가 동기 채널 패턴 및 메시지 전달로 설명되는 제한된 공간 및 시간 환경을 위한 함수형, 병행 |
Io | 액터 기반 병행성 |
Janus | 논리 변수에 대한 고유한 asker와 teller, 가방 채널을 특징으로 하며 순수하게 선언적 |
Java | 스레드 클래스 또는 Runnable 인터페이스 |
Julia | "병행 프로그래밍 기본 요소: 작업, async-wait, 채널."[13] |
자바스크립트 | 웹 워커, 브라우저 환경에서 프라미스, 콜백을 통해 |
JoCaml | 채널 기반의 병행 및 분산, OCaml의 확장, 프로세스의 join-calculus를 구현 |
조인 자바 | Java 언어를 기반으로 하는 병행성 |
Joule | 데이터 흐름 기반, 메시지 전달로 통신 |
Joyce | Per Brinch Hansen이 CSP의 기능을 갖춘 병행 파스칼을 기반으로 구축된 병행, 교육용 |
랩뷰 | 그래픽, 데이터 흐름, 함수는 그래프의 노드이고, 데이터는 노드 간의 와이어. 객체 지향 언어 포함 |
Limbo | Alef의 친척, Inferno (운영 체제)에서 시스템 프로그래밍용 |
로코모티브 BASIC | Amstrad의 BASIC 변형은 병행 서브루틴에 대한 EVERY 및 AFTER 명령을 포함 |
멀티리습 | 병렬 처리를 지원하도록 확장된 Scheme 변형 |
모듈라-2 | N. Wirth가 파스칼의 후속으로 코루틴을 기본적으로 지원하는 시스템 프로그래밍용 |
모듈라-3 | 스레드, 뮤텍스, 조건 변수에 대한 광범위한 지원을 갖춘 Algol 계열의 현대적 멤버 |
뉴스퀵 | 연구용, 채널을 일급 값으로 사용; Alef의 전신 |
occam | 통신 순차 프로세스 (CSP)의 영향을 크게 받음 |
occam-π | 밀너의 π-미적분의 아이디어를 통합한 occam의 현대적 변형 |
ooRexx | 객체 기반, 통신 및 동기화를 위한 메시지 교환 |
Orc | 매우 병행적이고 비결정적이며 Kleene 대수를 기반으로 함 |
Oz-Mozart | 다중 패러다임, 공유 상태 및 메시지 전달 병행성, 퓨처를 지원 |
ParaSail | 객체 지향, 병렬, 포인터가 없고, 경합 상태가 없음 |
PHP | Go에서 영감을 받은 메시지 전달을 구현하는 병렬 확장을 갖춘 다중 스레딩 지원[14] |
Pict | 본질적으로 밀너의 π-미적분의 실행 가능한 구현 |
Raku | 기본적으로 스레드, 프라미스 및 채널에 대한 클래스를 포함[15] |
Python | 스레드 기반 병렬 처리 및 프로세스 기반 병렬 처리를 사용[16] |
Reia | 공유되지 않는 객체 간에 비동기 메시지 전달을 사용 |
Red/System | Rebol을 기반으로 한 시스템 프로그래밍용 |
Rust | 시스템 프로그래밍용, 이동 의미 체계, 공유 불변 메모리 및 공유 가변 메모리를 사용한 메시지 전달 사용.[17] |
Scala | 범용, 간결하고 우아하며 유형 안전한 방식으로 일반적인 프로그래밍 패턴을 표현하도록 설계됨 |
시퀀스L | 범용 함수형, 주요 설계 목표는 프로그래밍 용이성, 코드 명확성-가독성, 다중 코어 하드웨어에서 성능을 위한 자동 병렬화 및 경합 조건이 없음을 증명할 수 있음 |
SR | 연구용 |
슈퍼파스칼 | Per Brinch Hansen이 병행 파스칼 및 Joyce를 기반으로 구축된 병행, 교육용 |
Swift | 구조화된 방식으로 비동기 및 병렬 코드를 작성하기 위한 내장 지원[18] |
Unicon | 연구용 |
TNSDL | 통신 교환 개발용, 비동기 메시지 전달 사용 |
VHSIC 하드웨어 설명 언어 (VHDL) | IEEE STD-1076 |
XC | XMOS에서 개발한 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
[11]
웹사이트
Standard library header
[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