리눅스에서 pi-futex 에 관한 내용을 보고, priority inheritance 를 어떤 식으로
지원하는지에 대해 많이 검색해보고 있으나 정보 수집이 어려워서 질문을 올려봅니다.
기본적으로 futex_lock_pi / futex_unlock_pi 를 비롯해서 futex_wait_requeue_pi / futex_cmp_requeue_pi(이건 futex_requeue)
등의 시스템 콜이 지원되고 있는데, 잘 이해가 안되는 부분이 몇 가지 있습니다.
이런 시스템 콜들은 모두 priority inheritance 를 유저 모드에서 구현하기 "위한" 시스템 콜인가요?
아니면 priority inheritance 를 이미 내부적으로 지원한다는 의미인가요?
glibc 소스를 보면 pthread_mutex_lock 이나 pthread_mutex_unlock 등의 함수 내에서는
futex_lock_pi 와 futex_unlock_pi 를 사용하는 것으로 보이고 뒤의 requeue_pi 계열 함수는
사용을 하지 않는 것으로 보입니다.
그것도 처음 부분 코드에서
unsigned int type = PTHREAD_MUTEX_TYPE (mutex);
if (__builtin_expect (type & ~PTHREAD_MUTEX_KIND_MASK_NP, 0))
return __pthread_mutex_lock_full (mutex);
이러한 조건에서 __pthread_mutex_lock_full 로 들어가는데, 제가 일반적으로 어플리케이션에서
사용하는 것처럼 락을 사용하는 경우 저 함수 호출은 되지 않고 바로 lll_futex_wait 로 그냥 가버리는 것 같습니다.
PTHREAD_MUTEX_KIND_MASK_NP 가 무슨 의미의 타입인지도 검색해도 잘 안나와서 모르겠네요.
pthread_cond_~ 계열 함수에서는 requeue_pi 계열 함수를 사용하는 것으로 보이기는 하는데,
결과적으로 궁금한 것은 pthread 가 priority inheritance 를 지원을 하는 건가요?
사실 우선순위가 역전되도록 예제 코드를 만들어보고 싶어도 개별 쓰레드 우선순위 설정하는
것부터 영 막혀서 잘 안되네요.
대략적으로 알려주시면 정말 감사하겠습니다..
댓글 0
.