티스토리 뷰

Daylogs/Etc

동시성과 병렬성

ohgyun 2017. 7. 27. 00:06
발생일: 2016.05.26

키워드: 동시성, 병렬성, concurrency, parallelism

문제:
iOS의 GCD(Grand Central Dispatch) 문서를 보다 보니, 동시성은 병렬성과 같지 않다는 문구를 보았다.

Concurrency is not Parallelism: https://talks.golang.org/2012/waza.slide

헷갈린다.


해결책:

아래 이미지에서 두 개념의 차이를 한 눈에 이해할 수 있다.




간단하게 정리하면 아래와 같다.

Cuncurrency (동시성)
- 독립적으로 실행하는 프로세스들을 구성
- 한 번에 여러 개를 다루는 것과 관련
- 구조에 대한 것
- 동시성으로, 병렬 실행이 가능한(꼭 필요하지는 않음) 문제를 해결할 수 있는 해법을 만들 수 있다
- I/O Bound
- 예) 마우스, 키보드, 디스플레이, 디스크

Parallelism (병렬성)
- 계산을 동시에 실행
- 한 번에 여러 개를 실행하는 것과 관련
- 실행에 대한 것
- CPU Bound
- 예) (한 번에 여러 점을 출력하는) 벡터 점 제품


이해하기 쉽게 설명한 좋은 문서가 있다.

# 쉽게 설명해둔 포스트


# Python에서의 동시성/병렬성

- 파이썬은 GIL을 사용. 사실상 싱글 스레드

일?
- CPU Bound: 수행시간에 CPU가 더 영향이 큰 작업. 압축, 정렬, 인코딩 등
- I/O Bound: 수행시간에 I/O가 더 영향이 큰 작업. 네트워크, 디스크 등

- 많은 일을 하려면, 동시성이나 병렬성을 높이는 방법
- 동시성: 한 번에 처리하는 양을 늘리고,
- 병렬성: 동시에 처리

일에는,
- CPU Bound: 병렬성으로 올리고
- I/O Bound: 동시성으로 올린다.

<병렬성 증대>
그래서 CPU Bound 작업에서, 병렬성을 증가시키려면 multiprocessing 모듈을 써서,
코어 개수만큼 fork 해서 병렬성을 올릴 수 있다. (보통 코어 개수만큼 프로세스를 생성한다)

<동시성 증대>
non blocking socket, asyncore, select / poll
네트워크나 파일 처리 등의 I/O 작업을 비동기로 처리하기 위한 모듈.
리눅스나 유닉스 시스템에서 제공하는 기능을 파이썬에서 쓸 수 있게 해둔 모듈.


#
Node.js라면, CPU bound 작업할 땐 fork 로 수행하고, I/O는 그대로 사용하면 되겠다.


반응형
댓글
공지사항