Sungkyunkwan University OS Project Dongkun Shin Schedule() 함수 분석 Sungkyunkwan University OS Project Dongkun Shin
Schedule()의 목적 CPU마다 존재하는 Run Queue로부터 프로세스 하나를 찾아 CPU 자원 할당 다양한 Scheduler와의 호환
schedule() 함수 호출 시기 직접 호출 필요한 자원 이용이 불가하여 다른 프로세스를 실행할 때 특정 디바이스 드라이버로부터 호출 Lazy 호출 (Deferred Invocation) <TIF_NEED_RESCHED flag가 Set되어 있는 경우> 특정 시간 간격 (Time quantum)마다 Try_to_wake_up() 함수가 호출되었을 때 Sched_setscheduler()가 호출되었을 때: 프로세스의 Scheduling policy 와/혹은 Priority를 변경하였을 때
Schedule() 개요 4 단계로 이루어짐 Process Switch 이전 Process Switch 중 다음 프로세스를 선택하기 위한 환경 설정 Runqueue로부터 다음 프로세스 선택 Process Switch 중 프로세스 전환을 위한 환경 설정 프로세스 전환 Process Switch 이후 선택된 다음 프로세스가 이전 프로세스와 동일 할 때 하는 작업 Process Switch 종료
__schedule() – 변수 설정 schedule()함수에 사용되는 지역변수들 본 함수의 가장 중요한 결과물은 next switch_count: 특정 Task의 Context가 Switch됨에 따라 올릴 switch_count switch_count는 Process를 분석할 때 사용됨. task_struct의 두 개 변수가 담당 nvcsw: Direct Switching Count nivcsw: Deferred Switching Count rq: 해당 CPU의 Runqueue 포인터 cpu: 현재 CPUID 커널 Preemption을 불가능하게 설정 (preempt count증가, memory barrier 설정) 현재 cpuid를 알아내어 cpu 변수 값 설정 해당 cpu의 runqueue를 가리키도록 rq값 설정 cpu에서 context switch를 위해 사용하는 값들을 rcu락으로 보호 prev 변수를 현재 실행중인 process로 설정
__schedule() – 현재 Switching 정보 Lazy호출이라 가정하여 Switch Count 설정 기존 prevstate가 stop되어 있으면 자발적인 switch라고 판단 siwtch count=nvcsw if unlikely함수는 가능성이 거의 없는 branch else 현재 process를 sleep 시키고 runqueue에서 제거 workqueue에 관한 내용 pending된 작업들을 수행할 지를 결정
__schedule() – pre_schedule CFS에는 pre_schedule함수가 정의 되어 있지 않으므로 아무 작업도 하지 않음
__schedule() – context switch runqueue에서 제거한 기존 process를 다시 runqueue에 삽입. CFS에서 정의한 put_prev_task()로 삽입하므로 기존과 다른 상태로 runqueue에 삽입됨 priority에 따라 weight를 재설정하여 삽입 CFS에서 정의한 pick_next_task를 호출해 다음에 실행될 process로 next 변수 설정 다음에 실행될 Process가 이전 Process와 다르면 context switch로 프로세스 전환 이 후 post_schedule은 CFS에 정의X preempt enable시키고 종료