쓰레드에는 2가지 타입이 있다.
•
유저 쓰레드(user) : 사용자 모드에서 사용하는 쓰레드(유저 모드에서 쓰레딩 한 쓰레드)
•
커널 쓰레드(kernel) : 커널 모드에서 사용하는 쓰레드(운영체제가 직접 매니징하는 쓰레드)
쓰레드는 운영체제가 지원. 그런데 자바(버추얼 머신임. 운영체제 아님)도 쓰레딩 기능을 지원한다. 자바는 운영체제가 아니므로 cpu를 넘나들 수는 없다.이와같이 운영체제의 쓰레드와는 무관한 쓰레드(green 쓰레드 라고도 함)를 user 쓰레드 라고 하고, kernel 쓰레드는 코어에서 직접 쓰레딩을 할 수 있는 것을 커널 쓰레드라고 하고, 이는 운영체제가 직접 관리 한다.
? 유저 쓰레드와 커널 쓰레드가 그래서 어떤 관계인데?
기본적으로 우리는, 쓰레드 라이브러리가 있어야 쓰레드를 사용할 수 있다.
요즘 자주 사용하는 쓰레드 관련 라이브러리 :
•
Unix 계열 : POSIX Pthreads
•
Window : Windows thread
•
Java thread(가상머신이기에 운영체제에 종속적(유닉스 계열 운영체제에서는 피쓰레드, 윈도우에서는 윈도우 쓰레드를 사용해서 쓰레딩을 한다))
1에서 N까지의 합을 구하는 쓰레드.
•
주의 사항 : 컴파일시 -pthread 옵션을 줘야 쓰레딩을 지원한다.
CHILD : value = 5
PARENT : value = 0
이 출력된다.
Implicitly Threading
java의 Executer Framework을 통해 쓰레드 만드는 것을 자동화 할 수 있다.
concurrent → 시분할(time sharing, context switching)
parallel → 멀티코어(각각 다른 코어(cpu)에서 실행됨)
⇒ 이 두개가 다 적용된 프로그램(디자인)은 멀티코어 시스템에서 멀티 쓰레딩을 하는 프로그램(디자인)이다.
이걸 다 고려하려면 너무 개발이 어려워 진다. → 이 고려하는 걸 컴파일러 혹은 라이브러리가 알아서 해주게 할 수 있다. java.concurrent.*(자바 쩜 컨쿼런트 라는 패키지)에 이 작업을 제공하고 있다. → 라이브러리가 알아서 해주게하는 방식
컴파일러한테 일을 다시키는 것은 OpenMP로 제공 하고 있다.
OpenMP는 컴퍼일러 지시어를 줘서 C나 C++로 쓰인 프로그램에 손쉽게 사용 가능한 API를 제공한다.
Open MP
•
“parallel regins”만 지정을 해주면, 알아서 parallel하게 실행 해준다.
•
컴파일러한테 일을 다 시키는 것임.(컴파일러에게 parallel하게 처리해야하는 지역을 알려주면,)
•
해당 부분을 OpenMP 런타임 라이브러리가 그부분을 병렬 처리 할 수 있게 쓰레드를 만들어 준다.
◦
사용법
쓰레드 갯수를 omp_set_num_threads(4);를 호출 함으로써, 4개로 한정 시키고,
omp_get_thread_num();으로 쓰레드 id(tid)를 받아서 출력해 보는 예제.
어떤 쓰레드가 먼저 실행 될지 보장할 수 없기 때문에, 출력의 순서 또한 보장 되지 않는다.
#pragma omp parallel for → for 구문을 알아서 병렬 처리 해준다.
병렬 처리를 한것과 병렬처리 하지 않은 것의 시간 차이 비교 결과 →
$> time ./a.out ⇒ 이 명령어로 시간을 알 수 있다.
Real → 총 걸린 시간
User → OS 유저 모드에서 돌아간 시간
Sys → OS 커널 모드에서 돌아간 시간
병렬 처리한 경우 real 시간이 줄어든 것을 확인 할 수 있다.
그런데, user 모드에서 걸린시간이 1초가 넘어 가는 것을 볼 수 있어서 의문이 든다.
병렬 처리 하지 않은 실행 파일에서는 user mode + kernel mode 시간을 합한것이 총 처리 시간이 되었다. 그런데, 병렬처리한 실행 파일에서는 커널 쓰레드가 알아서 다 처리를 하고, 실제 리얼 타임(실행 시간)과 비슷하게 나왔다. User 타임은 병렬 처리 하는 동안 wait()하는 시간등(대기하는 시간등)이 모두 계산 되어서 나오는 시간이다.(의미 없는 시간)
•
쓰레드 학습
◦
fork와 pthread가 섞여있을 때, 전역변수의 값을 공유하는 가, 하지 않는 가에 따라서 달라지는 부분이 있다. 이부분을 조금 더 코드를 쳐보면서 실험하면서 공부하기 좋은 내용이다.
◦
자바가 쓰레드를 학습하기에(사용해 보기에)정말 좋은 언어이므로, 학습에 활용해 볼것.