본문 바로가기
멀티코어 프로그래밍/Pthread

Pthread Attributes

by 기리의 개발로그 2015. 7. 18.

Pthread Attributes



스레드 속성


int pthread_create(pthread_t *thread, const pthread_attr_t *att, void(* start_routine)(void *), void *arg) 



pthread_attr_t


- 스레드 속성 타입

- 새로 생성되는 스레드의 속성을 설정

- Atrribute를 사용하여 설정 가능한 속성의 예시

- Detached 스레드의 생성

- User mode / Kernel mode 스레드의 생성

- 스레드의 stack size 설정



스레드 종료와 자원 회수


- pthread_join의 기능

- 스레드 자원 반환

- 스레드 종료 여부 확인

- 스레드가 종료될때까지 pthread_join 함수가 끝나지 않음

- thread 0 은 thread 1 이 끝날 때까지 blocked 상태에 들어감

- 반환값 얻기



- Join을 호출하지 않는 경우

- thread 1 의 수행이 끝난 뒤 thread 1 에 배정된 자원이 회수되지 않음

- Zombie thread

- 메모리 누수 등의 문제


자원 회수의 필요성


- main 함수는 100개의 thread를 만들고

- case 1 : 전부 자원을 회수 후 10초간 sleep

- case 2 : 자원을 회수하지 않고 10초간 sleep

- foo 함수는 작업없이 즉시 실행을 끝냄





- Case 1 : -DJOIN 옵션을 넣고 컴파일

- join을 호출하는 코드가 활성화 됨

- 실행파일을 백그라운드에서 실행

- ps u 명령으로 사용중인 메모리 확인 가능

- VSZ는 점유중인 가상 메모리 사이즈



- Case 2 : -DJOIN 옵션없이 컴파일

- join을 호출하는 코드가 비활성

- VSZ가 증가

- 점유중인 가상 메모리 사이즈가 증가



- 생성한 스레드의 종료 여부 확인이 필요없는 경우

- ex) main 함수와 생성된 스레드 함수가 독립적인 일을 할 경우

- pthread_join에서 불필요한 대기시간 발생

- Join 없이 thread의 자원을 회수하는 방법이 필요

- Detached 스레드



스레드의 종류


- 두 종류의 스레드

- Joinable vs Detached



Joinable 스레드


- pthread_create 시 생성되는 스레드의 기본 성질

- 스레드 종료 시 pthread_join을 통해 다른 스레드에서 자원을 반환해줘야 함

- 스레드의 종료 시점을 다른 스레드에서 알 필요가 있을 때

- 스레드의 함수 반환값을 다른 스레드에서 사용할 필요가 있을 때



Detaced 스레드


- 스레드 종료 시 자신의 자원을 스스로 반환

- 다른 스레드와 독립적인 작업을 수행하는 스레드를 사용할 때



Detached 스레드의 구현


- thread_attribute를 사용하는 방법

- pthread_detach를 사용하는 방법



Attribute를 사용한 detached 스레드


- pthread_attr_init(pthread_attr_t *attr)

- attr 변수를 초기화

- pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate)

- Detach 여부를 결정

- PTHREAD_CREATE_JOINABLE
- PTHREAD_CREATE_DETACHED

- pthread_attr_getdetachstate(pthread_attr_t *attr, int *detachstate)

- detached 스레드인지 여부를 확인 가능

- 확인한 상태를 int *detachstate에 저장



Pthread_detach


- int pthread_detach(pthread_t thread)

- 아규먼트로 넘겨준 thread의 상태를 detached 상태로 만듦

- 메인 스레드뿐 아니라 호출된 스레드 스스로도 자신의 상태ㄹ를 detached로 변환할 수 있음

- pthread_self()

자기 자신의 thread id를 반환


User mode / Kernel mode


- 생성되는 스레드의 모드를 설정

- PTHREAD_SCOPE_SYSTEM

- User mode

- 각각의 스레드가 시스템 자원을 배정받음

- 프로세스 내부의 스레드들이 커널 스케줄러를 통해 스케줄 됨

- 리눅스 상에선 이 모드만 제공

- PTHREAD_SCOPE_PROCESS

- Kernel mode

- 프로세스에 배정된 자원을 프로세스 내의 스레드가 나눠가짐


- pthread_attr_setscope(pthread_attr_t *attr, int scope)

- 해당 attribute에 scope를 설정

- PTHREAD_SOCPE_PROCESS
- PTHREAD_SCOPE_SYSTEM

- pthread_attr_getscope(pthread_attr_t *attr, int *scope)

- 해당 attribute에서 scope를 얻어냄

- int *scope에 저장



스레드 스택 크기 설정


- 프로세스당 최대 스택 크기는 제한되어 있음

- 리눅스 환경의 경우 10MB

- 리눅스 pthread로 생성된 스레드의 최대 스택 크기는 프로세스와 같음

- 작은 메모리를 필요로 하는 스레드를 많이 생성할 경우 메모리 낭비가 생길 수 있다.

- 스레드 생성 시 최대 스택 크기를 바꿀 수 있음


- pthread_attr_setstacksize(pthread_attr_t *attr, size_t stacksize)

- 생성될 스레드의 스택 크기 설정(byte)

- pthread_attr_getstacksize(pthread_attr_t *attr, size_t *stacksize)

- 생성될 스레드의 스택 크기를 얻어냄

반응형

'멀티코어 프로그래밍 > Pthread' 카테고리의 다른 글

Pthread 아규먼트(2)  (2) 2022.05.09
Pthread 아규먼트(1)  (13) 2022.05.06
Pthread 프로그래밍(2)  (4) 2022.05.04
Pthread 프로그래밍(1) - "Hello World"  (6) 2022.05.03
Pthread  (9) 2022.05.02

댓글