process vs thread
너무 중요해서 한번 더 설명하겠다.
process는 독립된 메모리 공간을 갖기 때문에 각각 1000번지는 서로 다른 실제 메모리 주소를 갖는다.
반면 thread t1, t2 에서 1000번지라함은 서로 동일한 실제 메모리 공간을 나타낸다.
쓰레드는 프로세스보다 더 lightweight하다. 따라서 생성뿐만 아니라 쓰레드간 communication이 프로세스간 communication보다 부하가 적다.
Pthread
pthread는 unix 계열 환경에서 C언어로 사용할 수 있는 쓰레드 관련 함수들의 모음(라이브러리)이다.
일반적으로 리눅스같은 유닉스 계열 운영체제에서 많이 이용된다.
크게 세 카테고리로 함수를 분류할 수 있다.
1. Thread Management
- folk() 프로세스 생성
- pthread_create() : 쓰레드 생성
- pthread_exit : 현재 쓰레드 종료
- pthread_cancel : kill another thread
main thread가 종료되면 다른 모든 쓰레드도 자동으로 종료된다.
5개의 쓰레드가 각각 PrintHello를 실행한다. (void*)t는 PrintHello 함수의 매개변수이다.
쓰레드가 동작할 함수는 반드시 void* 타입으로 매개변수를 받아야 한다. 그 후 의도한 타입으로 캐스팅하여 사용한다.
참고로 pthread_create가 &threads[t]처럼 포인터 타입으로 매개변수를 전달하는 이유는 쓰레드 생성 후 값을 초기화하기 위함이다.
keyboard input을 메인 쓰레드가 받을때마다 쓰레드가 생성되어 입력받은 문자열을 일정 시간 주기로 출력한다.
마스터 쓰레드는 계속 열어볼 파일이름을 입력 받고 파일열기,읽어오기 동작을 새로운 워커쓰레드를 만들어 수행한다.
- pthread_join : 이 함수를 호출한 쓰레드가 인자로 넘겨준 쓰레드의 종료를 기다린다.
워커 쓰레드들이 다 종료되고 나서야 메인 쓰레드는 결과를 출력하고 프로그램을 종료한다.
한가지 특이한건 pthread_join(pthread_t thread, void **value_ptr)에서 더블포인터를 쓴다는 것이다.
포인터 타입으로 전달받은 변수를 수정하고 싶기 때문에 포인터를 하나 더 붙인 것이다.
즉 int* x가 있을때 x를 수정하고 싶어서 foo(&x_ptr)처럼 int** x_dptr로 전달하는 것이다.
2. Mutexes (mutual exclusion)
lock처럼 상호배제, 동기화 수행
- pthread_mutex_init : mutex 변수 초기화
- pthread_mutex_destroy : 변수 제거
- pthread_mutex_lock
- pthread_mutex_unlock
- pthread_mutex_trylock
총 네개의 쓰레드가 dotprod를 수행한다.
dotprod에서는 전역 변수로 선언된 mutexsum을 여러 쓰레드가 lock, unlock하며 공유해서 사용한다.
3. Conditional Variables
어떤 조건을 설정하고 thread끼리 notify(), wait()를 사용할 수 있다.
- pthread_cond_init
- pthread_cond_destroy
- pthread_cond_wait
- pthread_cond_signal
'ComputerScience > Multi-core Computing' 카테고리의 다른 글
멀티코어컴퓨팅 - 10. OpenMP (0) | 2022.05.10 |
---|---|
멀티코어컴퓨팅 - 9. C++ Threads (0) | 2022.05.10 |
멀티코어컴퓨팅 - 7. Divide-and-Conquer for Parallelization (0) | 2022.04.19 |
멀티코어컴퓨팅 - 6. Concurrent Programming (0) | 2022.04.16 |
멀티코어컴퓨팅 - 5. Java Concurrency Utilities (0) | 2022.04.14 |