동시성 대 병렬성

다중 스레드 프로그램과 관련하여 동시성과 병렬 처리가 모두 사용되지만 유사성과 차이점에 대해 많은 혼란이 있습니다. 이와 관련하여 큰 질문은 동시성 병렬 처리입니까? 두 용어가 매우 비슷해 보이지만 위의 질문에 대한 대답은 아니오이지만 동시성과 병렬성은 동일하지 않습니다. 자, 그들이 같지 않다면 그들 사이의 기본적인 차이점은 무엇입니까?

간단히 말해서 동시성은 서로 다른 스레드에서 공유 상태에 대한 액세스를 관리하고 다른 쪽에서는 병렬 처리가 여러 CPU 또는 해당 코어를 사용하여 하드웨어 성능을 향상시키는 것을 처리합니다.

세부적인 동시성

동시성은 실행에서 두 작업이 겹치는 경우입니다. 응용 프로그램이 동시에 둘 이상의 작업에서 진행되는 상황 일 수 있습니다. 우리는 그것을 도식적으로 이해할 수 있습니다. 다음과 같이 여러 작업이 동시에 진행되고 있습니다.

동시성 수준

이 섹션에서는 프로그래밍 측면에서 세 가지 중요한 동시성 수준에 대해 설명합니다.

낮은 수준의 동시성

이 수준의 동시성에는 원자 적 작업이 명시 적으로 사용됩니다. 오류가 발생하기 쉽고 디버그하기가 어렵 기 때문에 이러한 종류의 동시성을 응용 프로그램 빌드에 사용할 수 없습니다. 파이썬조차도 그러한 종류의 동시성을 지원하지 않습니다.

중간 수준의 동시성

이 동시성에서는 명시 적 원자 연산이 사용되지 않습니다. 명시 적 잠금을 사용합니다. Python 및 기타 프로그래밍 언어는 이러한 종류의 동시성을 지원합니다. 대부분의 애플리케이션 프로그래머는이 동시성을 사용합니다.

높은 수준의 동시성

이 동시성에서는 명시 적 원자 작업이나 명시 적 잠금이 사용되지 않습니다. 파이썬은concurrent.futures 이러한 종류의 동시성을 지원하는 모듈.

동시 시스템의 속성

프로그램 또는 동시 시스템이 정확하려면 일부 속성이 충족되어야합니다. 시스템 종료와 관련된 속성은 다음과 같습니다.

정확성 속성

정확성 속성은 프로그램이나 시스템이 원하는 정답을 제공해야 함을 의미합니다. 간단하게하기 위해 시스템이 시작 프로그램 상태를 최종 상태로 올바르게 매핑해야한다고 말할 수 있습니다.

안전 속성

안전 속성은 프로그램 또는 시스템이 “good” 또는 “safe” 상태 및 아무것도하지 않습니다 “bad”.

Liveness 속성

이 속성은 프로그램 또는 시스템이 “make progress” 그리고 그것은 어떤 바람직한 상태에 도달 할 것입니다.

동시 시스템의 행위자

이것은 여러 프로세스와 스레드가있을 수있는 동시 시스템의 공통 속성 중 하나이며, 동시에 실행되어 자체 작업을 진행합니다. 이러한 프로세스와 스레드를 동시 시스템의 행위자라고합니다.

동시 시스템의 리소스

액터는 작업을 수행하기 위해 메모리, 디스크, 프린터 등과 같은 리소스를 활용해야합니다.

특정 규칙 세트

모든 동시 시스템에는 행위자가 수행 할 작업의 종류와 각각에 대한 타이밍을 정의하는 일련의 규칙이 있어야합니다. 작업은 잠금 획득, 메모리 공유, 상태 수정 등이 될 수 있습니다.

동시 시스템의 장벽

동시 시스템을 구현하는 동안 프로그래머는 동시 시스템의 장벽이 될 수있는 다음 두 가지 중요한 문제를 고려해야합니다.

데이터 공유

동시 시스템을 구현하는 동안 중요한 문제는 여러 스레드 또는 프로세스 간의 데이터 공유입니다. 실제로 프로그래머는 공유 데이터에 대한 모든 액세스가 직렬화되고 한 번에 하나의 스레드 또는 프로세스 만 공유 데이터에 액세스 할 수 있도록 잠금이 공유 데이터를 보호하는지 확인해야합니다. 여러 스레드 또는 프로세스가 모두 동일한 공유 데이터에 액세스하려고 할 때 모두가 아니라 적어도 하나는 차단되고 유휴 상태로 유지됩니다. 즉, 잠금이 적용되면 한 번에 하나의 프로세스 또는 스레드 만 사용할 수 있다고 말할 수 있습니다. 위에서 언급 한 장벽을 제거하는 몇 가지 간단한 해결책이있을 수 있습니다.

데이터 공유 제한

가장 간단한 해결책은 변경 가능한 데이터를 공유하지 않는 것입니다. 이 경우 명시 적 잠금을 사용할 필요가 없으며 상호 데이터로 인한 동시성 장벽이 해결됩니다.

데이터 구조 지원

여러 번 동시 프로세스가 동일한 데이터에 동시에 액세스해야합니다. 명시 적 잠금을 사용하는 것보다 또 다른 솔루션은 동시 액세스를 지원하는 데이터 구조를 사용하는 것입니다. 예를 들어, 우리는queue스레드로부터 안전한 큐를 제공하는 모듈. 우리는 또한 사용할 수 있습니다multiprocessing.JoinableQueue 다중 처리 기반 동시성을위한 클래스.

불변 데이터 전송

때로는 사용중인 데이터 구조 (예 : 동시성 큐)가 적합하지 않은 경우 잠금없이 변경할 수없는 데이터를 전달할 수 있습니다.

가변 데이터 전송

위의 솔루션에서 불변 데이터가 아닌 변경 가능한 데이터 만 전달해야하는 경우 읽기 전용 인 가변 데이터를 전달할 수 있다고 가정합니다.

I / O 리소스 공유

동시 시스템 구현에서 또 다른 중요한 문제는 스레드 또는 프로세스에 의한 I / O 리소스 사용입니다. 한 스레드 또는 프로세스가 I / O를 오랫동안 사용하고 있고 다른 스레드가 유휴 상태 일 때 문제가 발생합니다. I / O가 많은 애플리케이션에서 작업하는 동안 이러한 종류의 장벽을 볼 수 있습니다. 웹 브라우저에서 페이지를 요청하는 예제의 도움으로 이해할 수 있습니다. 무거운 응용 프로그램입니다. 여기에서 데이터 요청 속도가 데이터 소비 속도보다 느리면 동시 시스템에 I / O 장벽이 있습니다.

다음 Python 스크립트는 웹 페이지를 요청하고 네트워크가 요청 된 페이지를 가져 오는 데 걸린 시간을 가져옵니다.

import urllib.request

import time

ts = time.time()

req = urllib.request.urlopen('http://www.tutorialspoint.com')

pageHtml = req.read()

te = time.time()

print("Page Fetching Time : {} Seconds".format (te-ts))

위 스크립트를 실행하면 아래와 같이 페이지 가져 오기 시간을 얻을 수 있습니다.

산출

Page Fetching Time: 1.0991398811340332 Seconds

페이지를 가져 오는 데 걸리는 시간이 1 초 이상임을 알 수 있습니다. 이제 수천 개의 서로 다른 웹 페이지를 가져 오려면 네트워크에 걸리는 시간을 이해할 수 있습니다.

병렬 처리 란 무엇입니까?

병렬성은 작업을 동시에 처리 할 수있는 하위 작업으로 분할하는 기술로 정의 할 수 있습니다. 위에서 논의한 바와 같이 두 개 이상의 이벤트가 동시에 발생하는 동시성과 반대입니다. 우리는 그것을 도식적으로 이해할 수 있습니다. 작업은 다음과 같이 병렬로 처리 할 수있는 여러 하위 작업으로 나뉩니다.

동시성과 병렬성의 차이에 대한 더 많은 아이디어를 얻으려면 다음 사항을 고려하십시오.

동시이지만 병렬이 아님

응용 프로그램은 동시적일 수 있지만 병렬이 아님은 동시에 둘 이상의 작업을 처리하지만 작업이 하위 작업으로 분할되지 않음을 의미합니다.

병렬이지만 동시에는 아님

응용 프로그램은 병렬 일 수 있지만 동시 작업은 아님을 의미합니다. 즉, 한 번에 하나의 작업에서만 작동하고 하위 작업으로 분할 된 작업을 병렬로 처리 할 수 ​​있습니다.

병렬도 동시도 아님

애플리케이션은 병렬 또는 동시가 될 수 없습니다. 즉, 한 번에 하나의 작업에서만 작동하며 작업이 하위 작업으로 분할되지 않습니다.

병렬 및 동시

응용 프로그램은 병렬 및 동시 작업이 될 수 있습니다. 즉, 둘 다 한 번에 여러 작업에서 작동하고 작업이 병렬 실행을 위해 하위 작업으로 나뉩니다.

병렬성의 필요성

단일 CPU의 서로 다른 코어 또는 네트워크 내에서 연결된 여러 컴퓨터간에 하위 작업을 분산하여 병렬화를 달성 할 수 있습니다.

병렬화를 달성해야하는 이유를 이해하려면 다음과 같은 중요한 사항을 고려하십시오.

효율적인 코드 실행

병렬 처리의 도움으로 코드를 효율적으로 실행할 수 있습니다. 부분적으로 동일한 코드가 병렬로 실행되기 때문에 시간을 절약 할 수 있습니다.

순차 컴퓨팅보다 빠름

순차 컴퓨팅은 더 빠른 컴퓨팅 결과를 얻을 수없는 물리적 및 실제적 요인에 의해 제한됩니다. 반면에이 문제는 병렬 컴퓨팅으로 해결되며 순차 컴퓨팅보다 빠른 컴퓨팅 결과를 제공합니다.

실행 시간 단축

병렬 처리는 프로그램 코드의 실행 시간을 줄여줍니다.

병렬 처리의 실제 사례에 대해 이야기하면, 컴퓨터의 그래픽 카드는 독립적으로 작동하고 동시에 실행을 수행 할 수있는 수백 개의 개별 처리 코어를 가지고 있기 때문에 병렬 처리의 진정한 힘을 강조하는 예입니다. 이러한 이유로 우리는 고급 애플리케이션과 게임도 실행할 수 있습니다.

구현을위한 프로세서 이해

우리는 동시성, 병렬성 및 이들 간의 차이점에 대해 알고 있지만 구현 될 시스템은 어떻습니까? 소프트웨어를 설계하는 동안 정보에 입각 한 결정을 내릴 수있는 이점을 제공하기 때문에 우리가 구현할 시스템에 대한 이해가 매우 필요합니다. 다음 두 종류의 프로세서가 있습니다.

단일 코어 프로세서

단일 코어 프로세서는 주어진 시간에 하나의 스레드를 실행할 수 있습니다. 이러한 프로세서는context switching특정 시간에 스레드에 필요한 모든 정보를 저장 한 다음 나중에 정보를 복원합니다. 컨텍스트 전환 메커니즘은 주어진 시간 내에 여러 스레드에서 진행하는 데 도움이되며 시스템이 여러 작업을 수행하는 것처럼 보입니다.

단일 코어 프로세서에는 많은 이점이 있습니다. 이러한 프로세서는 더 적은 전력을 필요로하며 여러 코어 사이에 복잡한 통신 프로토콜이 없습니다. 반면에 단일 코어 프로세서의 속도는 제한적이며 더 큰 응용 프로그램에는 적합하지 않습니다.

멀티 코어 프로세서

멀티 코어 프로세서에는 여러 개의 독립적 인 처리 장치가 있습니다. cores.

각 코어에는 저장된 명령 시퀀스를 실행하는 데 필요한 모든 것이 포함되어 있으므로 이러한 프로세서에는 컨텍스트 전환 메커니즘이 필요하지 않습니다.

가져 오기-디코딩-실행주기

멀티 코어 프로세서의 코어는 실행주기를 따릅니다. 이주기를Fetch-Decode-Execute주기. 그것은 다음 단계를 포함합니다-

술책

이것은 프로그램 메모리에서 명령을 가져 오는 과정의 첫 번째 단계입니다.

풀다

최근에 가져온 명령어는 CPU의 다른 부분을 트리거하는 일련의 신호로 변환됩니다.

실행

페치 및 디코딩 된 명령어가 실행되는 마지막 단계입니다. 실행 결과는 CPU 레지스터에 저장됩니다.

여기에서 한 가지 장점은 멀티 코어 프로세서의 실행이 단일 코어 프로세서보다 빠르다는 것입니다. 더 큰 용도에 적합합니다. 반면에 여러 코어 간의 복잡한 통신 프로토콜이 문제입니다. 다중 코어는 단일 코어 프로세서보다 더 많은 전력을 필요로합니다.