학부 수업 정리/시스템프로그래밍 (21-2)
[시스템] 7. Threads
퐁키조아
2021. 12. 28. 21:23
1. Threads (스레드)
스레드는 프로세스의 실행단위를 의미한다. 각 스레드는 context of the process 에서 실행되며, 같은 코드와 전역 변수를 공유한다. 즉, 프로세스끼리는 자원 공유가 힘들었던 반면 스레드는 자원을 공유하기가 매우 편리하다. (동일 프로세스 내에서 스레드끼리 같은 메모리의 스택 영역에서 실행된다.)
- fork(): 자식 프로세스 생성
- exec(): 새로운 프로세스로 대체
- pthread_create(): 새로운 스레드 생성
2. pthread_create(): 스레드 생성
$\verb|int pthread_create(pthread_t *thread,|$
$\verb|const pthread_attr_t *attr, void* (*start) (void *), void *arg)|$
- $\verb|thread|$: Thread Identifier - 같은 프로세스 내에서는 서로 다른 스레드 ID를 가져야 한다. (따라서 이 인자로 주는 값을 잘 저장해놔야 나중에 식별할 수 있다.)
- $\verb|attr|$: 일반적으로 NULL이다. Initialization, detatch state, scope, inherit scheduler 등을 정할 수 있다.
- $\verb|start|$: 스레드의 메인 함수 역할을 할 시작 함수를 명시
- $\verb|arg|$: 스레드의 메인 함수로 보낼 argument 를 의미
- Return Value: 성공 시 0을 리턴함 (대부분의 스레드 관련 시스템 콜들은 성공할 경우 0을 리턴한다.)
pthread_self()
현재 스레드의 TID 리턴 (pthread_create의 첫번째 인자값) - pthread_t 타입으로 리턴함
3. ptherad_exit, cancel: 스레드 종료
$\verb|void pthread_exit(void *retval)|$
exit()과 비슷한 역할을 하는 함수로, 이 시스템 콜을 호출한 스레드를 종료한다. retval은 이 스레드의 종료를 기다리는 (wait 하는 중인) 스레드에게 리턴하는 값이다.
$\verb|int pthread_cancel(pthread_t thread)|$
TID를 이용하여 다른 스레드를 종료시킬때 사용한다.
4. pthread_join: 스레드의 Reaping
$\verb|int pthread_join(pthread_t thread, void ** value_ptr)|$
프로세스의 waitpid() 과 비슷한 시스템 콜로, 대상이 스레드라는 점만 다르다. 첫번째 인자 thread는 Reaping할 스레드의 TID, 두번째 인자 value_ptr는 스레드가 종료하면서 리턴한 retval를 의미한다.
Therad의 상태
- Joinable Threads (default): 다른 스레드가 종료하고 Reap 할 수 있는 스레드를 의미한다. 즉, pthread_join 의 대상이 되는 스레드이다.
- Detached Threads: 다른 스레드가 종료나 Reap 이 불가능한 스레드를 의미한다. 즉, 종료가 될 때 메모리 자원들이 자동으로 회수된다. ($\verb|pthread_detach(pthread_t thread)|$ 을 통해서 스레드를 Joinable에서 Detach 상태로 바꿀 수 있다.)
Joinable 스레드는 병렬성이 떨어지는 문제점이 있고, Detached 스레드는 실행 결과를 회수하는 것에 대한 문제점이 있다.