2. 데이터의 흐름(dataflow)
• 기존의 병렬화 방식(동시실행지원 컨테이너,병렬가능 반복구문도 포
함해서)
-> 각각의 코드 조각을 여러 개의 스레드에서 실행되게 하는 것에 매
우 효율적이다.
• 하지만 병렬처리의 속도에 영향을 주는 가장 큰 영향을 주는 대기시
간(I/O 같은 것)에 대응 하기에 효율적인 것은 아니다.
• 결국 데이터의 흐름에 집중해볼 필요가 있다.
->데이터 흐름 중심 프로그래밍
3. Actor-Based Programming
• 하나의 어플리케이션을 병렬실행 가능한 여러 개의 독립된
부분(Actor)으로 나눈다.
• 각각의 Actor는 메시지(데이터를 총칭하는것) 를 주고 받으면서
결과를 만들어 낸다.
• 즉, 공유 데이터가 없다.
• 이런 방식으로 설계하다 보면 개발자들이 좀더 데이터 흐름을
중심으로 생각하면서 프로그래밍 할 수 있다.
-> 하지만 결국 똑같은 거 아닐까?
4. The Concurrency Runtime
• Scheduler와 Resource Manager
로 구성되어있다.
• Scheduler는 Resource Manager
로 부터 컴퓨터의 자원정보를 모
은다.
• 병렬실행 가능한 부분의 actor를
효율적으로 scheduling해서 실행
한다.
• 고수준에서 병렬 프로그래밍 할
수있게 추상화된 구조다.
https://msdn.
microsoft.com
/en-
us/library/ee2
07192.aspx
7. Message-Passing Framework
• 여러 종류의 메시지 블록으로 구성된다.
• 각각의 메시지 블록은 메시지를 받고, 처리하고 전달하는 역할
을 한다.
• 이런 메시지 블록들을 연결해서 동작들이 파이프 라인처럼 작
동하게(순서대로 작동하게) 할 수 있다.
• 또한 각각의 메시지 블록은 병렬적으로 스케줄링 돼서 실행된
다.
https://msdn.microsoft.com/ko-kr/magazine/ff959205.aspx
8. ISource and ITarget.
• 각각의 메시지 블록은 메시지를 받고, 처리하고 보내는역할을
한다.
• Isource<Type>는 입력포트
• Itarget<Type>은 출력포트 라고 생각하면 된다.
• 각각의 메시지 블록역할에 따라 두타입을 을 상속받는다.
9. Concurrncy:: send/asend,receive/try_receive
• 각각의 블록으로 파이프 라인을 구성하면 큐처럼 작동하게 된
다.(대부분의 블록은 입력된 순서대로 처리하고 출력한다.)
• 각각의 send와 receive는 큐의 push 와 pop의 역할을 한다. 물
론 다음에 정리된내용을 보면 pop을 했을때 데이터가 지워질수
도 아닐수도 있다.
• asend/try_receive 는 비동기 방식 즉 보내기나 받기가 완료 되
었나를 확인하지 않고 바로 리턴 되는 함수들이다.
10. Message Blocks: unbounded_buffer<Type>
• 큐처럼 작용하는 메시지 블록
(push,pop)
• 개수의 제한은 정해져 있지 않다.
• 여러 개의 소스 로부터 받아올 수 있다.
• 여러 개의 타겟에 보낼 수 있다
• 하지만 큐처럼 사용되기 때문에
보통 하나의 타겟에 보내도록 사용된다.
https://msdn.microsoft.com/en-us/library/dd504833.aspx
11. Message Blocks: overwrite_buffer<Type>
• 앞의 unbounded_buffer와 유사.
• 하지만 한 개의 값만 저장.
• 계속 넣으면 덮어써진다.
• 또 다른 블록이나 에이전트에
전달을 해도 값이 없어지지않는다.
• 그래서 보통 하나의 소스로 부터
여러 개의 타겟으로 보내는데 사용
https://msdn.microsoft.com/en-us/library/dd504833.aspx
12. Message Blocks: single_assignment Class
• overwrite_buffer와 거의 유사
• 하지만 한번밖에 쓸수가 없다.
처음 값이 유지됨
https://msdn.microsoft.com/en-us/library/dd504833.aspx
13. Message Blocks: call<Type>
• 메시지를 받는다.
• 받은 메시지를 사용자가 지정한
작업을 수행한다.
• 람다,함수객체,함수자등을 사용
할수 있다.
• 다른 함수호출과 다른점은 입력
과 작업수행이 병렬적으로 스케
줄 된다는 것이다.
https://msdn.microsoft.com/en-us/library/dd504833.aspx
15. Message Blocks:그 외
• 여러 개의 메시지를 하나의 메시지로묶어주는 블록
make_join(&tmbuf, &kbbuf);
(multitype_join 도 존재 서로다른타입을 받을수 있다.)
make_choice(&fib35, &fib37, &half_of_fib42);
• 다른 블록에 일정 시간간격 마다 메시지를 보낸다.
timer<wchar_t> progress_timer(100u, L'.', &print_character, true);
• 추가 참고 https://msdn.microsoft.com/en-us/library/dd504833.aspx
17. asynchronous agents
• asynchronous agents는 비교적 복잡한 작업이나, I/O를 비동기
적으로 처리하기 위한 독립적인 컴포넌트이다.
• 다른 asynchronous agent나 메시지 블록과 메시지를 이용해서
통신을 한다.
• 각각의 asynchronous agents는 하나의 태스크로 concurrency
runtime에 의해서 스케쥴된다.
18. asynchronous agents state
• asynchronous agents는 프로세스 같이 상태가 존재 한다.
생성자 시작 메소드
종료 메소드
취소 메소드
https://msdn.microsoft.com/en-us/library/dd551463.aspx
https://msdn.microsoft.com/ja-jp/magazine/ff959205.aspx
19. asynchronous agents
• asynchronous agent는 concurrency::agent를 상속받는다.
• 실행할 작업을 순수 가상함수 run() 함수를 재정의 한다.
• run() 마지막에는 반드시 done() 메소드로 상태를 변경해 준다.
• asynchronous agent의 파괴자에서 agent::wait(this);를 호출해
서 done이 호출될 때(혹은 cancled())까지 소멸자 호출을 막아
야 한다.
20. asynchronous agents
생성자에서 입력포트를 받아서 설정
소멸자가 호출되서 에이전트가 종료상태전에 완료 되지 못하도록
run함수를 재정의 한다. 이 함수가 실제 실행하는 작업.
상태를 종료 상태로 만든다.
https://msdn.microsoft.com/ko-kr/magazine/ff959205.aspx
22. Tying Everything Together
현재 시간을 더해주는 메시지 블록
각각의 에이젼트에 메시지블록 (트랜스포머이므로
소스이자 타겟이다)을 연결해 준다.
각각의 에이젼트를 실행 상태로 변경
비동기로 실행되므로 이다음 줄이 실행된다.
각각의 소멸자에서 wait를 호출하거
나 바깥에서 호출한다. 종료상태가
될 때 까지 소멸자 호출을 막는다.