동시 프로그래밍을 볼 때 일반적으로 동시 및 병렬이라는 두 가지 용어가 사용됩니다.
그리고 일부 프로그래밍 언어는 특히 Java 와 같은 병렬 프로그래밍 지원을 요구합니다 .
이것은 병렬 및 동시 프로그래밍이 실제로 다르다는 것을 의미합니까?
동시 프로그래밍을 볼 때 일반적으로 동시 및 병렬이라는 두 가지 용어가 사용됩니다.
그리고 일부 프로그래밍 언어는 특히 Java 와 같은 병렬 프로그래밍 지원을 요구합니다 .
이것은 병렬 및 동시 프로그래밍이 실제로 다르다는 것을 의미합니까?
답변:
Nish의 답변 외에도 Haskell의 병렬 및 동시 프로그래밍에 대한 Simon Marlow의 저서 또는 더 짧은 자습서를 추천하겠습니다 . 하스켈의 관점에서 첫 번째 질문에 대답하므로 이론적으로 기울어 진 독자에게 더 적합 할 수 있습니다 (Haskell은 순수하게 기능적이고 게으른 프로그래밍 언어로 다른 언어보다 수학에 훨씬 더 가깝습니다).
거기에서 인용 :
많은 분야에서 병렬과 동시라는 단어는 동의어입니다. 기본적으로 다른 개념을 설명하는 데 사용되는 프로그래밍에서는 그렇지 않습니다.
병렬 프로그램은 계산을보다 빠르게 수행하기 위해 여러 계산 하드웨어 (예 : 여러 프로세서 코어)를 사용하는 프로그램입니다. 계산의 다른 부분은 동시에 (병렬로) 실행되는 다른 프로세서에 위임되므로 계산이 순차적으로 수행 된 경우보다 결과가 더 빨리 전달 될 수 있습니다.
반대로, 동시성은 다중 제어 스레드가있는 프로그램 구조화 기술입니다. 일반적으로 제어 스레드는 "동시"실행됩니다. 즉, 사용자는 자신의 효과가 인터리브 된 것을 볼 수 있습니다. 이들이 실제로 동시에 실행되는지 여부는 구현 세부 사항입니다. 동시 프로그램은 인터리브 된 실행을 통해 단일 프로세서 또는 여러 물리적 프로세서에서 실행될 수 있습니다.
튜토리얼 (p.4)의 나머지 부분을 읽는 것이 좋지만이 섹션의 나머지 부분은 효율성, 모듈성 및 결정 성과 같은 프로그램의 양적 및 질적 특성과 프로그래밍 패러다임을 연결하므로이 섹션의 나머지 부분을 인용하겠습니다.
병렬 프로그래밍은 효율성과 관련이 있지만 동시 프로그래밍은 여러 독립 외부 에이전트 (예 : 사용자, 데이터베이스 서버 및 일부 외부 클라이언트)와 상호 작용해야하는 프로그램을 구성하는 것과 관련이 있습니다. 동시성은 이러한 프로그램을 모듈화 할 수있게합니다. 사용자와 상호 작용하는 스레드는 데이터베이스와 통신하는 스레드와 다릅니다. 동시성이 없으면 이러한 프로그램은 이벤트 루프 및 콜백으로 작성해야합니다. 실제로 많은 언어에서 동시성이 너무 비싸거나 너무 어렵 기 때문에 동시성이 사용 가능한 경우에도 이벤트 루프 및 콜백이 종종 사용됩니다. 사용하다.
"제어 스레드"라는 개념은 순전히 기능적인 프로그램에서 의미가 없습니다. 관찰 할 효과가없고 평가 순서가 관련이 없기 때문입니다. 따라서 동시성은 효과적인 코드를위한 구조화 기술입니다. Haskell에서는 IO 모나드의 코드를 의미합니다.
결정 론적 프로그래밍 모델과 비결정론 적 프로그래밍 모델 사이의 관련 차이점이 있습니다. 결정 론적 프로그래밍 모델은 각 프로그램이 하나의 결과 만 제공 할 수있는 모델이지만 비결정론 적 프로그래밍 모델은 실행의 일부 측면에 따라 다른 결과를 가질 수있는 프로그램을 허용합니다. 동시 프로그래밍 모델은 예상 할 수없는 시간에 이벤트를 발생시키는 외부 에이전트와 상호 작용해야하므로 반드시 비 결정적입니다. 그러나 비결정론은 몇 가지 주목할만한 결점을 가지고있다.
병렬 프로그래밍의 경우 가능하면 결정적 프로그래밍 모델을 사용하고 싶습니다. 목표는 응답에 더 빨리 도달하는 것이므로 프로세스에서 프로그램을 디버그하기 어렵게 만들지는 않습니다. 결정적 병렬 프로그래밍은 두 가지 측면에서 최고입니다. 테스트, 디버깅 및 추론은 순차 프로그램에서 수행 될 수 있지만 프로세서가 추가되면 프로그램이 더 빨리 실행됩니다. 실제로 대부분의 컴퓨터 프로세서 자체는 파이프 라이닝 및 여러 실행 단위의 형태로 결정 론적 병렬 처리를 구현합니다.
동시성을 사용하여 병렬 프로그래밍을 수행하는 것이 가능하지만 동시성이 sacriffices 결정론 때문에 선택이 좋지 않은 경우가 많습니다. Haskell에서 병렬 프로그래밍 모델은 결정 론적입니다. 그러나 결정 론적 프로그래밍 모델이 모든 종류의 병렬 알고리즘을 표현하기에는 충분하지 않다는 점에 유의해야합니다. 내부 비결정론, 특히 솔루션 공간 검색과 관련된 문제에 의존하는 알고리즘이 있습니다. Haskell에서이 클래스의 알고리즘은 동시성을 사용해서 만 표현할 수 있습니다.
동시성과 병렬 처리는 해결하고 야기하는 문제가 다르지만 독립적이지 않습니다.
두 작업을 동시에 실행 한다는 것은 두 작업의 개별 단계가 인터리브 방식으로 실행됨을 의미합니다. 병렬 처리를 무시하면 특정 시점에서 하나의 명령문 만 실행된다고 가정 할 수 있지만 다음 단계에서 어떤 태스크가 실행되는지 보장 할 수는 없습니다.
이것은 몇 가지 측면에서 유용합니다.
주요 과제 중 일부는 다음과 같습니다.
두 개의 태스크 를 동시에 실행 한다는 것은 명령문이 동시에 실행됨을 의미합니다 . 이것은 주로 다음에 유용합니다.
주요 과제는 다음과 같습니다.
병렬 컴퓨팅과 분산 컴퓨팅을 구별하려면 이 질문 을 참조하십시오 .
이에 대한 답변이 많이 있지만 혼란 스러울 수 있습니다. 나는 이런 식으로 생각하고 도움이 될 수 있습니까? :
동시 프로그래밍 은 실행 순서를 신경 쓰지 않는 코드입니다. Java는 동시 프로그래밍에는 좋지 않은 언어이지만 도움이되는 라이브러리와 프레임 워크가 있습니다. JavaScript는 동시 프로그래밍을위한 훌륭한 언어이며, 동시성 이 아닌 것을 작성하려고 할 때(예를 들어, 실행 순서를 강요하려는 경우)종종 어려운 경우가 있습니다. 동시 프로그래밍은 이벤트 중심 프로그래밍에 적합합니다 (실행 순서는 버튼을 클릭하거나 상자에 입력 할 때 작동하는 브라우저에서 실행되는 코드와 같은 이벤트 리스너에 의해 결정됨).
예를 들어 수백 개의 HTTP 요청을 작성하는 것이 있습니다. NodeJS에서 가장 간단한 해결책은 콜백 메소드를 사용하여 한 번에 100 개의 요청을 모두 여는 것입니다. 응답이 다시 올 때마다 메소드가 실행됩니다. 동시 프로그래밍입니다. Ruby에서 가장 간단한 (가장 일반적인) 솔루션은 요청을 열고 응답을 처리하고 다음 요청을 열고 응답을 처리하는 등입니다. 많은 요청의 경우 NodeJS가 적시에 수행하는 것이 더 쉽습니다. 서버를 망치거나 아웃 바운드 연결을 최대한 사용하지 않도록주의하십시오 (실수로 쉽게 수행 할 수 있음). 루비를 동시에 쓸 수는 있지만, 대부분의 루비 코드가 작성되는 방식이 아니기 때문에 조금 해가됩니다.
병렬 프로그래밍여러 스레드 또는 프로세스에서 동시에 실행할 수있는 코드입니다. 이를 통해 여러 CPU에서 코드를 실행하여 성능을 최적화 할 수 있습니다 (Akka와 같은 여러 시스템 포함). NodeJS는 멀티 스레드가 아니며 병렬 실행이 없으므로 스레드 안전 코드 작성에 대해 걱정할 필요가 없습니다 (그리고 내가 본 대부분의 JavaScript 코드는 스레드 안전하지 않습니다). Java에서는 언어가 동시 프로그래밍을 일반적인 패턴으로 만들지 않더라도 병렬 프로그래밍은 매우 기본적으로 제공되며 스레드 안전성에 대해 걱정해야하는 경우가 많습니다. 웹 사이트를 Java로 작성하는 경우 일반적으로 웹 사이트는 각 요청을 동일한 메모리의 별도 스레드에서 실행하는 컨테이너에서 실행됩니다.
위의 내용 중 일부는 당신이 말하는 범위와 경계에 달려 있습니다. 나는 웹 사이트에서 일합니다. 내가 보는 대부분의 Java 코드는 동시 프로그래밍이 아닙니다. 물론 충분히 축소하면 고객 요청이 들어오는 순서는 중요하지 않지만 그 이상으로 확대하면 코드에 따라 실행 순서가 결정됩니다. 그러나이 코드는 요청이 스레드로부터 안전해야하는 많은 공유 객체와 병렬로 실행될 수 있도록 작성되었습니다.
한편, 내가 보는 대부분의 JavaScript 코드는 동시 적입니다. 실행 순서가 여러 수준에서 중요하지 않은 방식으로 작성되었습니다. 그러나 공유 메모리에서 병렬 실행을 지원하도록 작성되지 않았습니다. 물론 여러 프로세스에서 동일한 코드를 병렬로 실행할 수는 있지만 객체는 공유되지 않으므로 의미가있는 병렬 프로그래밍이 아닙니다.
추가 독서를 위해, 나는이 질문에 대한 최상위 답변의 그림을 정말로 좋아합니다 : https://www.quora.com/What-are-the-differences-between-parallel-concurrent-and-asynchronous-programming