Post date: Nov 30, 2016 5:43:41 AM
이번 강좌는 이전 강좌에서 잠들어( wait ) 있던 프로세스가 어떻게 다시 runqueue에 등록되는지 알아 보도록 하자..
잠들어 있던 프로세스가 깨어나는 방법은 다양하다 .. timeout이 된다든지, 어떤 조건( condition )에 만족할 경우라든지 아니면 누군가가 wake_up signal을 직접 보낼때 잠자던 프로세스가 깨어 난다.. 그럼 이때 깨어난 프로세스는 어떻게 다시 runqueue에 등록될까?
이전 강좌에 프로세스를 재우기 위해 wait_event_interruptible() 함수를 사용한 것 처럼 깨우는 함수도 wake_up_interruptible()을 사용하여 설명 하도록 하겠다..
1. 먼저 잠자던 프로세스를 깨우기 위해 wait.h 에 있는 wake_up_interruptible()을 호출 한다.
2. wake_up_interruptible() 함수는 sched.c에 있는 __wake_up() 함수를 호출하고
3. wake_up()함수는 다시 __wake_up_common()함수를 호출 한다.
4.__wake_up_common()함수는 등록된 wait_queue를 하나씩 찾아내며 생성시 등록된 func ( 기억 나겠지 ?? )를 호출하게 되는데
5. 그 함수가 wait.c에 있는 autoremove_wake_function() 이다.
6. autoremove_wake_function()은 다시 sched.c에 있는 default_wake_function()을 호출 하고
정상적으로 처리되면 wait_queue를 삭제하게 된다.
7. default_wake_function()으로 돌아 가서 default_wake_function()는 try_to_wake_up() 함수를 호출 하게 되는데..
8. 바로 이 try_to_wake_up() 함수에서 activate_task()를 호출하여 runqueue에 다시 등록하게 되는것이다.
<<이미지 클릭 시 확대 됨 >