병행 컴퓨팅
"오늘의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년 동안 다양한 시기에 산업적으로 사용되었다.
다음은 병행 프로그래밍 기능을 사용하거나 제공하는 언어들의 목록이다. (단, 모든 언어를 포함하는 것은 아니다.)
최근 한국에서는 함수형 프로그래밍 언어의 인기가 높아짐에 따라, 병행 프로그래밍을 지원하는 함수형 언어(예: 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