concurrently, parallelism, asynchronous

concurrently(동시성), parallelism(병렬화), asynchronous(비동기)

이름부터 어렵다

비슷한것 같으면서도 다르기 때문에 혼란을 야기하는데, 여기에 정리해놓고 리마인드 해야지

다만, 이 내용이 정확한 내용인지는 나도 장담 못함…

concurrently(동시성)

여러 작업이 번갈아 가면서 동시에 실행되는 것을 말한다

동시라고는 하지만 실제로는 Context Switching에 가깝다

따라서 Single core에서도 동시성이 있는 프로그래밍을 하고 수행할 수 있다.

thread 기반 프로그래밍이 동시성 프로그래밍의  좋은 예이다.

single core에서도 다수의 thread를 만들어서 수행할 수 있으며, 사용자가 보기에 동시에 실행되는 것처럼 빠르게 번갈아 가면서 수행된다

concurrently 프로그래밍은 태생적으로 resource에 대한 race condition이 발생 한다.

예를 들어서 전역 변수를 접근하는 concurrently 프로그램을 짠다면 하이젠버그를 만나게 될 것이다.

parallelism (병렬화)

여러 작업이 다수의 core에서 동시에 수행되는 것을 말한다.

병렬화 프로그래밍은 single core에서는 불가능하다. 반드시 다수의 코어가 실제적으로도 동시에 일을 해야 하는 것을 말한다.

이런 의미에서 보면 동시성 프로그래밍을 한 후에, multicore에서 실행하면

“야호~ 나 프로그램을 병렬화 했어” 라고 말할 수 있을까?

OS가 알아서 작업을 각각의 core에 알아서 스케쥴일 해줄테니 말이다.

잘 모르겠지만, 아닌것 같다.

병렬화는 프로그래머가 명시적으로 해당 부분을 강제로 다수의 코어가 나누어서 수행한다는 의미가 강하다.

예를 들어서 1에서 100까지 더해서 합하는 프로그래밍을 한다고 해보자.

이때 병렬화 프로그래밍을 한다는 것은, 1~50까지는 1번 코어가 계산하도록 하고, 51~100까지는 2번 코어가 계산을 하도록 한후에 나중에 합치는 프로그래밍을 할 것이다.

보통 동시성 프로그래밍을 한다고 하면, 위 작업같은 조치를 취하지 않는다.

병렬화 프로그래밍은 대부분이 프로세서가 시간이 오래 걸리는 연산 작업을 다수의 코어가 나눠서 같이 계산을 한다는 의미로 많이 쓰인다.

이런 용도로 병렬화 라이브러리가 OpenMP이다. OpenMP를 쓰는 프로그래밍은 병렬화 프로그래밍이라고 할 수 있다.

병렬화도 잘못 짜게 되면 resource에 대한 race condition을 유발 할 수도 있지만, OpenMP같은 라이브러리만을 이용해서 활용한다면, 그 문제가 거의 발생하지 않는다.

con_and_par.jpg

위 그림은 concurrent 와 parallelism 의 차이를 보여준다

asynchronous (비동기)

비동기 프로그래밍은 하나의 작업의 흐름에서 프로그램의 수행이  블록되지 않고, 계속 실행하게 만드는 기법이다.

프로그램이 블록 되는 이유는 대부분이 I/O 처리때문이다. (HDD, Network, Display, Mouse, …)

예를 들어서 아래와 같은 코드를 보자.

read_storage(buffer, 2000);

위 코드는 저장장치에서 2000바이트를 읽어서 buffer에 저장하라는 코드이다. (pseudo code임)

위 코드는 2000바이트를 읽을 때 까지 해당 코드가 멈추게 된다. 그냥 하릴없이 멈춘다. 저장장치가 2000바이트를 다 줄때까지…

그런데 해당 함수를 호출한 thread만 멈춘다. 다른 thread는 안 멈춘다.

다른 thread에는 영향을 안주고 자신만 멈추니까 비동기 프로그래밍의 매력이 별로 없어보인다.

GUI 프로그래밍을 생각해보자. 위 read_storage 처리 함수와 GUI 의 다양한 처리를 하는 함수들이 같은 thread에서 동작한다고 생각해보자. 그러면 저 함수가 리턴될 때 까지 화면은 멈추게 되고, 응답없음 이란 글자를 보게될 것이다.

그래서 과거에는 GUI 프로그래밍을 할  때 GUI 를 처리하는 thread에서는 저런 block이 발생하는 작업을 안하고 다른 thread에게 시키던지, non-block 함수를 써서 계속 polling으로 I/O 처리가 끝났는지 확인하곤 했다.

figure1.gif

위 그림은 동기,비동기 / 블럭,논블럭 차이에 대한 설명이다.

사실 비동기 프로그래밍은 병렬화, 동시성 프로그래밍 하고는 같은 층위의 개념은 아니다. 병렬화, 동시성 개념은 다수의 작업을 코어에 어떻게 할당하는가에 대한 논의라면, 비동기 프로그래밍은 하나의 작업이 멈출지, 말지에 대한 논의이다. 좀 더 하위 개념에 가까운것 같다.

그럼에도 불구하고  비동기 프로그래밍은 multi-thread 프로그래밍에 좋은 대안이다. 실제로 multi-thread 프로그래밍보다 비동기 프로그래밍이 성능이 좋다. (정말?)

그 예시가 바로 node.js 이다.  참조( http://www.nextree.co.kr/p7292/ )

비동기 프로그래밍의 가장 큰 예시는 callback, EventEmitter 이다.

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

%s에 연결하는 중