728x90
Multicore Programming
- 스레드 : CPU 활용을 위한 기본 단위
- 멀티프로세스의 단점 : 동일 기능의 각 프로세스마다 code, data, file을 각각 할당하므로 처리 부담 증가
- multithread
- 프로세서 내의code, data, file은 공유한 상태로 레지스터, 스택, PC 등은 나누어 할당
- 멀티프로세싱 대비 연산 비용이 적음
- 같은 프로세스 자원을 공유하므로 shared memory / message passing보다 자원 공유가 쉬움
- Multicore programming 시 고려할 점
- 작업 분할, 데이터 분할, 데이터 의존성
- 불완전할 시 프로세스 간 데이터 의존으로 인해 속도 저하
- Concurrency / Parallelism
- Concurrency : 다수의 작업이 동시에 수행(시분할)
- 단일 코어에서 task 1, task 2, task 3...을 번갈아가며 조금씩 처리
- Parallelism : 다수의 작업이 동시에, 독립적으로 수행
- 코어 1 : task 1 / 코어 2 : task 2 ...
- data parallel : 동일 데이터를 분할, 각 코어가 동일한 동작 수행 (ex. 1~100까지 더할 때 1~25 / 26~50 / ... 로 연산 데이터를 나눔)
- task parallel : 작업을 분할하여 각 코어에 할당
- Concurrency : 다수의 작업이 동시에 수행(시분할)
- Amdahl's Law
- 동시성 프로그래밍으로 얻을 수 있는 성능 향상
- ( S : 병렬화 불가 부분, N : 코어 수 )
- ex. S=25%, N=2 >> speedup은 최대 약 1.6배
- 코어 N이 무한히 증가 >> 속도는 1/S로 수렴
Multithread model
- 스레드의 종류
- User thread : POSIX, window, java thread library
- Kernel thread
- Many-to-One
- user thread : kernel thread = N:1
- 멀티코어에서도 각 스레드가 병렬 처리되지 않을 수 있음
- 구현이 쉬움
- Ex. Solaris, GNU
- One-to-One
- user thread : kernel thread = 1:1
- 병렬 처리 가능, 높은 동시성
- 높은 Overhead : kernel thread가 많이 할당되어야 함
- Many-to-Many
- user thread : kernel thread = N:M
- 구현이 복잡하여 최근에는 잘 쓰이지 않음
- two-level : 여러 multithread model을 혼합하여 사용
Thread Library
- Pthread
- POSIX 표준에 따른 스레드 생성 및 동기화 API
- POSIX API는 실제 구현이 아닌 동작 방식만 나타냄
- UNIX 계열 OS에서 사용
- POSIX 표준에 따른 스레드 생성 및 동기화 API
- Java Thread
- JVM에 의해 관리
- thread class의 extend 혹은 Runnable 인터페이스의 implement로 스레드 생성
Implicit Thread
- Thread 구현에 필요한 노력을 경감
- Thread Pool
- 일정량의 스레드를 미리 생성
- Pool 내의 빈 스레드에 작업 할당
- 예측 가능한 범위 내에서 스레드 동작 가능
- Fork-Join
- 분할-정복법
- 여러 개의 thread로 나눈 후(fork), 스레드 종료를 대기(join)
- OpenMP
- C, C++, 포트란의 컴파일러 명령어와 API
#pragma omp parallel
로 병렬 처리가 가능한 부분을 선언
#pragma omp parallel for
for(i=0;i<N;i++)
{
c[i] = a[i] + b[i];
// fork-join 방식으로 각 스레드에 0~N의 구간을 나누어 처리
}
Threading Issue
- 스레드 fork와 exec
- 프로세스 내의 한 스레드에서 fork > 새로운 프로세스 생성
- fork 시 복사된 프로세스에는 해당 스레드만 유지하거나, 모든 스레드를 같이 복사할 수 있음
- exec 호출 : 호출한 main thread 외에는 kill
- 프로세스 내의 한 스레드에서 fork > 새로운 프로세스 생성
- Signal Handling
- Signal : Linux/Unit의 프로세스 이벤트
- 인터럽트가 HW적 event라면, Signal은 SW적 Event
- Signal Handler가 Signal을 전달
- dehault handler : Process 생성 시 같이 생성
- Signal의 전달 방식
- 시그널이 발생한 스레드에 전달
- memory violation, divide by zero 등
- Synchronous Signal : 발생한 스레드가 명확한 Signal
- 프로세스 내의 모든 스레드에 전달
- Crtl+C 명령어(Linux의 강제 종료 명령어) 등
- 특정 스레드에 모든 시그널 전달
- 시그널이 발생한 스레드에 전달
- 스레드 동작 시 시그널 유발
- 시그널을 처리하기 위해 bitmask 사용 (시그널을 처리할 / 하지 않을 스레드 지정)
- Signal : Linux/Unit의 프로세스 이벤트
- Thread Cancellation
- 외부에서 스레드를 강제 종료
- Asynchronous cancellation : 모든 target thread를 즉시 삭제
- Deferred cancelation : 스레드가 삭제 가능할 때 제거
- 스레드가 중요 자료를 접근하고 있을 때 삭제 시 문제를 방지하기 위함
- 기본 cancellation type
- Thread - Local Storage
- TLS라고도 함
- 멀티스레드는 같은 메모리를 참조
- Local 변수는 함수 내에서만 선언
- TLS는 특정 스레드 내에서만 사용
- Scheduler Activation
- M:M thread model의 Issue
- Lightweight Process(LWP) : 가상의 process를 통해 user - kernel thread 연결
- upcall : kernel thread를 갖고 있는 LWP가 user thread에 할당된 경우, 새 LWP를 호출하여 해당 문제를 해결
728x90