리눅스 pthread(NPTL) 은 유저레벨 쓰레드인가요? 그 구현이 궁금합니다...
리눅스에서의 pthread 구현은 디폴트가 유저레벨 쓰레드로 알고 있는데,
(PTHREAD_SCOPE_PROCESS 가 지금 정상적으로 구현이 되었는지도 잘 모르겠습니다.)
유저레벨 쓰레드라면 어느 한 쓰레드에서 시스템 콜을 호출한 상태로 만약 대기하면
다른 쓰레드로 스위칭을 못하는 게 정상일 거 같은데,
당연한 얘기지만 메인 쓰레드에서 usleep(10000000); 정도 돌리고 다른 쓰레드에서는
무언가를 마구 출력시켰는데 뭐 멀쩡히 잘 동작하더군요.
뭐 애초에 이런 게 안되면 더 이상한거지만.. 지금까지 쓰레드 써오면서 저런 코드에서
아무 문제가 없어서 자연스레 그냥 넘어갔는데 생각해보니 이걸 어떻게 하는지 궁금합니다.
유저레벨 쓰레드라면 한 쓰레드에서 nanosleep 시스템콜을 호출해서 해당 커널 쓰레드가
스케줄링이 아예 안된다면 당연히 유저레벨 쓰레드는 실제 커널 쓰레드는 하나이므로
그 쓰레드가 스케줄링이 안되면 유저레벨 쓰레드 전체가 안되야 하는 것으로 생각했는데
실제로는 그렇지 않네요. 이건 왜 그런지 궁금합니다.
그리고 유저레벨 쓰레드의 구현 방식도 궁금한데, 유저 코드로 명령어 실행 도중에
어떻게 중단하고 스케줄링을 할 수 있나요? 인터럽트를 호출하는 것도 아닐테고
가령 mov eax, 3 이란 코드 실행 도중, 또는 후에 원래의 쓰레드 코드가 실행되는게 아니라
스위칭을 위해 스케줄링 코드가 실행되려면 무언가 인터럽트같은 외부의 개입이
필요할 거 같은데 어떻게 하는지 궁금합니다..
답변 부탁드립니다.
별도의 구현체를 사용중이신게 아니라면 유저레벨로
별도의 구현체를 사용중이신게 아니라면 유저레벨로 구현되어있지 않습니다.
유저 레벨 쓰레드를 구현할 때는 알람시그널을 이용하여 구현하는 것이 용이합니다.
역시 그렇군요.. glibc 코드를 아무리 봐도 기본
역시 그렇군요.. glibc 코드를 아무리 봐도 기본 옵션으로 할 경우
pthread_mutex_lock 코드에서 그냥 단순히 LLL_MUTEX_LOCK 을 호출해버리고
이건 매우 단순하게 바로 futex syscall 을 호출해 버리길래
유저레벨 락이 아니면 쓰레드도 유저레벨로 생성된게 아니란 생각밖에 안들더군요..
그러면 옵션을 따로 줘서 유저레벨 쓰레드를 만들 수 있는건가요? 아니면 원래부터 아예 없는 건가요?
여기저기서 리눅스의 NPTL 은 기본 유저 레벨 쓰레드라는 말을 많이 들어서 ㅡ,.ㅡ 잘못 알고 있었네요.
음 아래 질문은 생각해보니 시그널을 이용하면 되겠네요. 좋은 답변 감사드립니다.
댓글 달기