4. • I/O Bound
• 작업 시간이 주로 입/출력 작업이 완료될 때까지 대기하는 기간에 의해
결정되는 것들을 말함
• CPU Bound
• 작업 시간이 주로 중앙 Processor 의 처리 시간에 영향을 받아 결정되는
것들을 말함
I/O Bound vs CPU Bound
4
5. • 동시성 (Concurrency)
• 서로 독립적인 작업을 작은 단위 연산으로 나누고 시분할 형태로 연산
• 논리적으로 동시에 실행되는 것 처럼 보여짐
• 단일 Thread/Processor 에서도 적용 가능
• 병렬성 (Parallelism)
• 실제로 동시에 여러 작업을 연산
• 단일 Thread/Processor 에서는 적용 불가 (대조적으로)
• 데이터 병렬성과 작업 병렬성으로 구분 할 수 있음
Concurrency VS Parallelism
5
6. • 작업 병렬성
• 동시에 구분된 작업을 수행
• 독립적인 작업을 여러 쓰레드에 나눠서 연산
• 데이터 병렬성
• 동시에 같은 연산을 서로 다른 데이터에 대해 수행
• 같은 연산을 다른 스레드에서 수행
Task Parallelism VS Data Parallelism
6
7. • 동시성
• 작업 병렬성
• 데이터 병렬성
Concurrency VS Task Parallelism VS Data Parallelism
7
1 1 2 2 3 3 4 4
1
1
2
2
3
3
4
4
1 33 1
2 24 4
8. • 동시에 하나 이상의 작업이나 프로그램을 처리할 수 있는 능력
• Single-Tasking 이랑 반대되는 용어
• 하나의 작업이 완전히 끝나야만 다른 작업을 시작할 수 있음
• Processor 의 갯수보다 동시에 많은 일을 할 수 있도록 함
Multi-Tasking
8
9. • Preemptive Multitasking (선점형 멀티태스킹)
• 작업의 선점이 허락되는 멀티태스킹 방법
• 인터럽트 메커니즘을 포함하여, 스케줄러가 현재 실행중인 작업을
중단하고 다른 작업을 결정할 수도 있음
• Cooperative Multitasking (협력형 멀티태스킹)
• Non- Preemptive 라고도 불림
• 프로세서가 정기적으로, 혹은 유후 상태일때 자발적으로 현재 실행
중인 작업의 제어권을 넘김
Multi-Tasking
9
11. • SMP (Symmetric Multiprocessing)
• 모든 Processor 들이 동등한 권리를 가짐
• 모두 같은 물리적인 메모리에 접근할 수 있음
• ASMP (Asymmetric Multiprocessing)
• Processor 마다 다른 권리를 가짐
• Processor 마다 다른 물리적인 메모리 공간을 가질 수 있음
• 특정 Process 는 특정 Processor 에서만 실행됨
SMP vs ASMP
11
14. • Process 내에서 독립적으로 실행될 수 있는 명령들의 묶음
• 대부분의 경우, Thread 는 Process의 하위로 구성됨
Thread
14
15. • Process 들은 서로 독립적으로 존재
• Thread 들은 Process 의 집합으로 존재
• Process 들은 분리된 주소 공간을 가짐
• Thread 들은 주소 공간을 공유함
• Process 들 간의 통신에는 시스템이 제공하는 IPC 에 의하여 가능
• Thread 들은 Process 의 상태와 메모리, 다른 자원을 공유
Thread vs Process
15
16. • Input 에 대한 빠른 대응을 할 수 있음
• 동시에 작업 할 수 있기 때문에 빠름
• 프로세스를 여러개 생성하는 것보다 자원 소모가 적음
• 자원 공유와 소통이 프로세스 보다 간단함
Thread 강점
16
17. • 동기화 문제가 있음
• 하나의 스레드가 프로세스를 중단시킬 수 있음
Thread 약점
17
18. • Python 에서 Thread 는 동시에 여러 작업을 수행하는 것 처럼 보여짐
• CPython 기준으로 Thread 에서 GIL 을 사용
Thread in Python
18
19. • Python 에서 사용하는 Global Lock
• Lock 은 크게 두 종류의 개념으로 분리
• Coarse-Grained-Lock : 큰 단위로 Lock 을 잡아 사용
• Fine-Grained-Lock : 작은 단위로 Lock 을 잡아 사용
• GIL 은 Coarse-Grained-Lock
GIL (Global Interpreter Lock)
19
20. • Single Thread 일때, 속도가 빠름
• C Extension/Wrapping 이 유용
• C Extension 사용시, GIL 이 해제됨
• C Library 사용시, GIL 을 사용하면 Thread-Safety 를 고려할 필요 없음
• I/O Bound 에 유리
• Blocking I/O Call 의 경우, GIL 의 영향이 없음
Coarse-Grained-Lock
20
24. • 자원을 효율적으로 사용하려면 Multiprocess 를 사용하는 것을 권장
• ProcessPoolExecutor 는 Python 3.x 부터 추가됨
• 여러 I/O-Bound 작업을 동시에 수행하는 것에는 문제 되지 않음
Thread in CPython
24
25. • 스레드 기반 시스템 구현을 지원하는 두 가지 모듈이 있음
• _thread
• 저수준 API 지원
• 커스터마이징한 Thread Pool 이나 Lock 다른 원시적인 기능을 사용할 때 유용
• threading (thread 에서 rename 되었음)
• 고수준 API 지원
• 일반적으로 많이 사용
Thread in Python
25
32. • 장점
• 메모리 사용량이 적음
• 공유된 메모리를 사용하여 프로세스의 상태를 공유할 수 있음
• I/O Bound 작업에 좋은 선택지가 됨
• 단점
• GIL 의 영향을 받음
• interruptible 하고 killable 할 수 없음
• 일반적으로 코드의 직관성이 떨어짐
Threading
32
33. • 장점
• 분리된 메모리 공간을 가지고 있고, CPU와 코어 갯수의 장점을 살릴 수 있음
• CPython 에서 GIL 의 영향을 받지 않음
• CPython 에서 CPU-Bound 작업은 Multiprocessing 으로 처리해야함
• Shared Memory 를 사용하지 않는 한, 대부분의 동기화 문제가 사라짐
• 자식 프로세스들을 interruptible 하고 killable 할 수 있음
• 단점
• IPC 사용이 복잡할 수 있음
• 메모리를 보다 많이 사용할 수 있음
Multiprocessing
33
37. • 비선점 멀티태스킹을 위해 만들어진 서브루틴
• 실행의 정지와 재개를 위한 여러 진입점을 허락
• Exception, Event loops, Iterators, Infinite list, Pipe 등에 적합
Coroutine
37
38. • Subroutine
• 처음부터 시작하여, 끝날때 한번 종료됨
• Subroutine 의 Instance 는 한번만 반환함
• 호출간의 상태를 유지하고 있지 않음
• 프로그램 시작전에 할당된 하나의 스택만 있으면 됨
• Coroutine
• 다른 Coroutine 을 호출하며, 종료될 수 있고, 원래 로직으로 돌아올 수 있음
• 상태를 유지하며, 호출마다 다름
• 사전에 할당된 스택이나 이전에 할당된 스택을 캐싱하여 저비용으로 만들 수 있음
Subroutine 과의 비교
38
39. • Generator
• Semi-Coroutine 이라고도 불림
• 제어권을 여러번 양보할 수 있음
• 실행 중인 작업을 중단하고, 여러 진입점에서 재 진입 할 수 있음
• 제어권을 양보한 뒤에도 실행의 흐름을 제어 할 수 없음
• 컨트롤을 Generator 의 호출자에게 넘김
• Yield 는 반환의 목적
• Coroutine
• 제어권을 여러번 양보할 수 있음
• 실행 중인 작업을 중단하고, 여러 진입점에서 재 진입 할 수 있음
• 제어권을 양보한 뒤에도 실행의 흐름을 제어 할 수 있음
• Yield 는 입력의 목적
Generator 와의 비교
39
44. Concurrent.futures (비동기 Non-blocking)
44
• 멀티프로세싱 및 멀티스레딩을 위한 API 제공
• 다중 스레드와 다중 프로세스에 타겟팅
• Python 3.2 에 추가됨
• 기존에는 스레드, 프로세스 관련 API들이 C 코드의 래핑 수준이었음
• 스레드와 프로세스를 사용하는 API 를 통일
45. Asyncio (단일 스레드 비동기 Non-Blocking 지원)
45
• 비동기 Non-Blocking I/O
• I/O 작업에서 불필요하게 기다리는 시간을 비동기로 처리하여
Block 되지 않도록 하는 개념
• NodeJS 에서도 단일 스레드 비동기 I/O 개념을 사용하여 불필
요한 대기 시간을 줄이는 것으로 성능을 향상
46. Coroutine in Python (asyncio)
46
• asyncio
• Python 3.4 버전에서 추가됨
• 비동기 프로그래밍을 위한 모듈
48. Coroutine in Python (Native Coroutine)
48
• asyncio
• Python 3.5 버전에서 추가됨
• async 와 await 가 추가됨
• async 는 native coroutine 선언
• await 는 yield 를 대체하는 표현
• 해당 작업이 끝날때까지 대기한다는 의미
• Native Coroutine 과 Generator 기반의 Coroutine 은 혼용해서 사용할 수 없음
• asnyc / await 구문과 yield 를 혼용해서 사용할 수 없음
• Native Coroutine 과 Generator 기반의 Coroutine 은 상호 운영 가능
51. Else
51
• Gevent
• Libev 기반의 동시성 라이브러리
• 동시성과 네트워크 관련 작업들을 위한 API 제공
• Green Thread를 사용
• Greenlets
• Gevent 에서 주로 사용되는 패턴
• C 확장 모듈 형태로 제공되는 경량 코루틴
52. Else
52
• Green Thread
• Runtime Library 나 Virtual Machine 에 의해 스케줄링 되는 스레드
• OS 기반으로 스케줄링 되지 않음
• 커널 공간이 아닌 유저 영역에서 관리됨
• Java 의 Thread library 에서 유래함
• CPU 문맥 교환 문제를 제외하고는 일반 스레드가 가진 문제와 동일
54. t h a n k y o u
Copyright 2017 Penta Security Systems Inc. All rights reserved.
KOREA
U.S.A.
JAPAN
Yeouido, Seoul www.pentasecurity.co.kr (HQ)
Houston, Texas www.pentasecurity.com
Shinjuku-Ku, Tokyo www.pentasecurity.co.jp