스레드 돌다가 lock 기다리면서 슬립하는것도 커널 스케줄러가 관리 하나요?
안녕하세요.
스레드 프로그래밍에서 동기화를 공부하다가 스케줄링 쪽에 제 실력으로는 확인할수 없는 부분이 있어서 질문 드립니다.
테스트 프로그램으로.. 스레드를 4개 생성했고, 하는 일은 글로벌 배열에다가 루프를 돌면서 값을 쓰는 프로그램을 만들어 봤습니다.
아마도 락을 번갈아 잡으면서 쓰게 되겠지요.
프로그램 내에서, lock을 pthread_mutex_lock() 를 사용해서 락을 사용했는데, 코드를 따라가 보니, glibc 라이브러리에
이 코드가 있더군요(__pthread_mutex_lock).
계속 따라가 보니, 어셈블리가 나오는데, 대략..아마도 락을 잡지 못하면 슬립을 하는듯 보이고요.
그런데, 코드가 복잡해서 스케줄링과 관련해서 따라가면서 해석하기가 어렵네요. 모르겠는 부분이,
즉, 락을 기다리면서, 잠들어 있는 스레드들을 커널이 현재 돌아 가고 있는 프로그램들(ex. 데몬)과 섞어서,
예를 들어, 타임퀀텀을 다 써서 자고 있는 프로세스들과,
차별없이 한큐에 넣어서, 스케줄링을 하는건가요? ULK 책을 보니, 이 큐가 아마도, 실행큐가 되겠네요.
아니면, 사용자 프로그램에서 생성된 스레드가 락을 기다리면서 슬립하는 경우, 커널이 별도로 큐를 만든다던지 해서,
따로 관리 하는건가요? 기존 프로세스들은 타임퀀
텀과 관련해서 우선순위도 있고 할테지만, 락을 기다리면서 잠든 스레드들은 무슨 기준으로 스케줄을 하는지, 모르겠네요.
제가 알기로, unlock이 되면, 큐에 잠들어
있는 스레드들을 동시에 깨워서 다시 경쟁 시킨다고 기억이 나는데, 이게 이 실행큐에 해당하는것은 아닌듯 하네요.
리눅스 코드(2.6.24)를 살펴 보니, 그냥 섞어서 하는듯 보입니다만.. 잘 모르겠네요.
..
답변 부탁드리겠습니다.
리눅스 커널에서
리눅스 커널에서 어떤지는 직접 본적이 없어서 명확하지는 않습니다만
어떤 운영체제 이론 서적에서는 락의 데이터 구조에 태스크 리스트가 있어서
그 락을 얻지 못하면 잠들게되고 락의 태스크 리스트에 연결되고
락이 풀어지면 락의 태스크 리스트에서 깨어난다고 합니다.
스핀락이 아닌 세마포어나 뮤텍스는 그걸 얻지 못하면 잠드는게 맞는것 같구요
잠든 태스크들은 잠든 태스크들의 리스트가 따로 있는것 까지는 알겠는데
잠든 태스크 중에서 어떤 것을 선택하는지는 잘 모르겠습니다.
----
섬기며 사랑하면 더 행복해집니다.
개인 홈페이지가 생겼습니다 http://caoskernel.org
어셈러브를 개편중입니다 http://www.asmlove.co.kr
댓글 달기