Operating System 6주차 - Completely Fair Scheduler (1) - Real-Time Computing and Communications Lab. Hanyang University [email protected] [email protected] Real-Time Computing and Communications Lab., Hanyang University http://rtcc.hanyang.ac.kr Contents Linux Scheduler CFS (Completely Fair Scheduler) CFS Parameters CFS Source code (1) Kernel Functions Foreground & Background “top” command 과제 4 preview Real-Time Computing and Communications Lab., Hanyang University http://rtcc.hanyang.ac.kr 22 Linux Scheduler Real-Time Computing and Communications Lab., Hanyang University http://rtcc.hanyang.ac.kr 33 Linux Scheduler Linux Scheduler는 Scheduler class라는 이름으로 모듈 화 되어 있다. 각각의 Scheduler class는 우선순위를 가지고 있다. Task는 아래의 Scheduler class중 1개에 속해서, 해당 알 고리즘에 맞게 동작한다. Real-Time Computing and Communications Lab., Hanyang University http://rtcc.hanyang.ac.kr 44 CFS (Completely Fair Scheduler) CFS (Completely Fair Scheduler) Linux kernel version 2.6.23 이후로 기본 스케줄러로 사용되고 있 는 스케줄러 일반적인 여러 task 들에 대해 공정하게 CPU time을 할당하기 위해 도입 Basic concept • 각각의 task 들이 가지는 weight에 비례하여 CPU time을 할당 Real-Time Computing and Communications Lab., Hanyang University http://rtcc.hanyang.ac.kr 55 CFS Parameters CPU’s Run queue Linux에서 각각의 CPU는 자신의 run queue를 가진다. Real-time task들은 array로 저장하고 일반적인 task에 대해서는 Red-black tree 구조를 통해 task를 저장 /kernel/sched/sched.h -> cfs_rq Real-Time Computing and Communications Lab., Hanyang University http://rtcc.hanyang.ac.kr 66 CFS Parameters Schedulable Entity 각각의 프로세스들은 자신의 task_struct에 sched_entity 를 가짐 Task의 weight과 같은 linux scheduling에 필요한 정보를 가지고 있음 /include/linux/sched.h Real-Time Computing and Communications Lab., Hanyang University http://rtcc.hanyang.ac.kr 77 CFS Parameters Task Priority 각각의 task는 priority에 따라서 CPU를 할당 Priority값이 작을수록 우선순위가 높다는 것을 의미 Non-real-time priority의 경우 100 ~ 139 의 값을 가짐 (Nice value : -20 ~ 19, default is 0) Real-time priority의 경우 0 ~ 99의 값을 가짐 Real-Time Computing and Communications Lab., Hanyang University http://rtcc.hanyang.ac.kr 88 CFS Parameters Nice value Nice value란 모든 Unix system에서 사용되는 표준 Priority. Linux의 경우 각각의 task에 대한 time slice를 nice value 값을 이 용해 할당. kernel/sched/sched.h에 각 nice value값에 따른 task weight 값 이 정의되어 있음. Default : 0 (Weight = 1024) Real-Time Computing and Communications Lab., Hanyang University http://rtcc.hanyang.ac.kr 99 CFS Parameters Timeslice Task가 preemption 되기 전 CPU를 통해 수행된 시간 Timeslice는 각 task의 weight에 따라서 proportional 하게 할당됨 Real-Time Computing and Communications Lab., Hanyang University http://rtcc.hanyang.ac.kr 10 10 CFS Parameters Virtual Runtime (vruntime) “ideal multitasking”을 수행하기 위해 제안됨 Nice value = 0에 해당하는 weight 값과 자신의 weight 값의 상대 적인 비율에 따른 가상의 시간(=vruntime)을 계산함. Scheduler는 vruntime이 가장 작은 task를 선택함. • Red-black tree leftmost node Real-Time Computing and Communications Lab., Hanyang University http://rtcc.hanyang.ac.kr 11 11 Quiz 1. 프로세서가 100ms 동안 실행 한다고 가정하고 같은 nice 값을 가지는 task 가 2개 (A, B) 존재한다면, 각각의 task가 가지는 timeslice는 어떻게 되는가? 만약 4개 라면? 2. 프로세서가 100ms 동안 실행하고, nice 0과 nice5를 가지는 2개의 task가 실행된다. 각각의 task가 가지는 timeslice는 어떻게 되겠는가? 3. 프로세서가 100ms 동안 실행하고, 같은 nice값을 갖는 task가 2개 있다. 스 케줄러는 20ms 주기로 context switching을 한다고 가정하자. 60ms의 시간이 지났을 때, 각각의 task가 실제 실행된 시간은? 4. 3의 상황에서 만약 weight가 3:1인 task가 2개라면? 그리고 이때 virtual runtime의 개념 을 CFS는 어떻게 사용하는가? 5. task의 nice value가 작아질 수록 virtual runtime은 어떻게 되겠는가? 그리 고 이때, 어떤 효과가 예상되는가? Real-Time Computing and Communications Lab., Hanyang University http://rtcc.hanyang.ac.kr 12 12 Overview of Scheduling Flow Timer interrupt에 의해 CFS의 scheduling tick이 동작 각각의 scheduling tick에 대해 1. 현재 running task에 대해 virtual runtime을 update 2. Virtual runtime과 time slice를 구한 뒤 • (virtual runtime) ≥ (time slice)를 만족하면, TIF_NEED_RESCHED flag 를 set 3. TIF_NEED_RESCHED를 check • Set 상태이면, run queue에서 가장 작은 virtual runtime 값을 갖는 task 를 scheduling 함 • Red-black tree에 현재 running task를 Enqueue • Red-black tree에서 left-most node를 Dequeue Real-Time Computing and Communications Lab., Hanyang University http://rtcc.hanyang.ac.kr 13 13 CFS Source code scheduler_tick task_tick -> task_tick_fair entity_tick update_curr calc_delta_fair YES cfs_rq->nr_running > 1 = true? check_preempt_tick sched_slice NO vruntime > time slice NO YES resched_task set_tsk_need_resched Real-Time Computing and Communications Lab., Hanyang University http://rtcc.hanyang.ac.kr 14 14 CFS Source code scheduler_tick Timer interrupt에 의해서 실행 현재 running task에 대한 정보를 받아 task tick(= task_tick_fair) 을 실행 Real-Time Computing and Communications Lab., Hanyang University http://rtcc.hanyang.ac.kr 15 15 CFS Source code task_tick_fair CFS task 들에 대해 scheduling tick을 수행 현재 task의 sched_entity 를 받아 entity_tick 호출 Real-Time Computing and Communications Lab., Hanyang University http://rtcc.hanyang.ac.kr 16 16 CFS Source code entity_tick CFS의 schedulable entity의 정보를 update update_curr를 호출하여 virtual runtime을 update check_preempt_tick를 호출하여 TIF_NEED_RESCHED의 조건 을 검사 Real-Time Computing and Communications Lab., Hanyang University http://rtcc.hanyang.ac.kr 17 17 CFS Source code update_curr 프로세스의 vruntime 값을 갱신 Real-Time Computing and Communications Lab., Hanyang University http://rtcc.hanyang.ac.kr 18 18 CFS Source code calc_delta_fair 실제 time slice값에 대하여 task의 weight 비율에 따른 vruntime 을 계산 __calc_delta를 호출하여 vruntime 계산 Real-Time Computing and Communications Lab., Hanyang University http://rtcc.hanyang.ac.kr 19 19 CFS Source code check_preempt_tick CFS의 entity_tick에 의해서 호출됨 ideal runtime을 구하기 위해 time slice를 구하는 sched_slice 함 수 호출 (virtual runtime) > time slice 이면, resched_task 호출 Real-Time Computing and Communications Lab., Hanyang University http://rtcc.hanyang.ac.kr 20 20 CFS Source code sched_slice 해당 task에 대해 time slice 값을 반환 struct load_weight *load는 cfs_rq 전체의 weight를 뜻함. se->load.weight은 현재 task의 weight을 뜻함. Real-Time Computing and Communications Lab., Hanyang University http://rtcc.hanyang.ac.kr 21 21 CFS Source code resched_task 해당 task가 rescheduling 되어야 함을 mark하는 함수 set_tsk_need_resched를 호출하여 TIF_NEED_RESCHED를 set 시킴 Real-Time Computing and Communications Lab., Hanyang University http://rtcc.hanyang.ac.kr 22 22 Kernel Functions access_ok 사용자 영역의 포인터를 검증하는데 사용되는 커널 함수 Def : int access_ok (type, address, size) Parameters • • • • Type : 접근 유형 (VERIFY_READ, VERIFY_WRITE) Address : 사용자 영역의 메모리 블록을 가리키는 포인터 Size : 블록 크기 Return : 성공일 때 0을 반환 linux/include/asm/uaccess.h에 정의되어 있음 Real-Time Computing and Communications Lab., Hanyang University http://rtcc.hanyang.ac.kr 23 23 Kernel Functions copy_to_user, copy_from_user 커널과 유저 영역 사이에서 Data를 복사 Def • unsigned long copy_to_user(*to_user, *from_kernel, data_size) • unsigned long copy_from_user(*to_kernel, *from_user, data_size) Parameters • *to_user, *from_user : 사용자 영역의 Data pointer • *to_kernel, *from_kernel : 커널 영역의 Data pointer • Data_size : Data의 크기 Real-Time Computing and Communications Lab., Hanyang University http://rtcc.hanyang.ac.kr 24 24 Kernel Functions Example (Kernel code) User로부터 integer 변수를 받아 커널에서 factorial 계산 Real-Time Computing and Communications Lab., Hanyang University http://rtcc.hanyang.ac.kr 25 25 Kernel Functions Example (Kernel code) SYSCALL_DEFINE 사용 • helloworld.c file에 다음과 같이 추 가해 보았습니다. • 비슷한 목적을 가진 시스템 콜에 대해서 1개의 파일에 여러 개의 시스템 콜을 구현할 때 사용할 수 있습니다. • 상단에 추가적으로 맵핑을 위해 linux/syscalls.h를 추가해줍니다. Real-Time Computing and Communications Lab., Hanyang University http://rtcc.hanyang.ac.kr 26 26 Kernel Functions Example (User code) getfactorial 시스템 콜을 호출해 factorial 계산 Real-Time Computing and Communications Lab., Hanyang University http://rtcc.hanyang.ac.kr 27 27 Foreground & Background (중복) 프로세스를 실행하는 방법은 크게 2가지가 있다. Foreground 기본적으로 모든 프로세스는 foreground로 실행된다. 키보드와 연결되어 있으며 결과를 직접적으로 스크린 혹은 터미널 창에 출 력한다. 꽤 긴 시간 동안 동작하는 프로그램을 실행시켰을 경우에는 그 시간 동안 터 미널을 이용할 수 없게 되므로, 곤란한 경우가 생기게 된다. Background 키보드와 연결되지 않은 상태로 실행된다. 만약 이 프로세스가 키보드 입력을 필요로 할 경우에는, 입력을 기다린다. Background로 프로세스를 실행하는 것의 장점은 한 프로세스가 동작하고 있는 동안에도 다른 프로세스를 실행시킬 수 있다는 점이다. $ ./a.out & 를 통해 백그라운드로 실행할 수 있다. Real-Time Computing and Communications Lab., Hanyang University http://rtcc.hanyang.ac.kr 28 28 Foreground & Background (중복) Example> matrix source code 단순하게 100 x 100 행렬을 10^5 제곱하는 함수. 참고로 아래 프로그램은 input_matrix의 초기화가 생략되어 있습니다. Real-Time Computing and Communications Lab., Hanyang University http://rtcc.hanyang.ac.kr 29 29 Foreground & Background (중복) Example> Foreground & Background Foreground 실행 -> 프로세스가 종료할 때 까지 다른 작업 못함. Background 실행 -> 다른 작업 가능 “ctrl + z” 프로세스 중지 -> foreground 프로세스 중지 Real-Time Computing and Communications Lab., Hanyang University http://rtcc.hanyang.ac.kr 30 30 Foreground & Background (중복) Example> Foreground & Background command “jobs” • 현재 실행되고 있는 프로세스들의 상태와, job 번호를 알 수 있다. Background -> Foreground • $ fg %job번호 (ex> fg %2) Real-Time Computing and Communications Lab., Hanyang University http://rtcc.hanyang.ac.kr 31 31 Foreground & Background (중복) Foreground -> Background • $ bg %job번호 • foreground 에서 background로 바꾸려면, 먼저 foreground로 실행되고 있는 프로세스를 ctrl + z로 중지 시킨 후 해야 한다. Real-Time Computing and Communications Lab., Hanyang University http://rtcc.hanyang.ac.kr 32 32 “top” command Linux에서 시스템 사용량을 확인 Usage : $ top [options] Real-Time Computing and Communications Lab., Hanyang University http://rtcc.hanyang.ac.kr 33 33 “top” command Table 필드 정보 PID : 프로세스 ID (PID) USER : 프로세스를 실행시킨 사용자 ID PRI : 프로세스 우선순위 (nice value + 20) NI : task의 Nice value VIRT : 가상 메모리 사용량 RES : 현재 Page가 상주하고 있는 크기 (Resident Size) S : 프로세스 상태 (S : sleeping, R : running, W : swapped out process, Z : zombies) %CPU : 프로세스가 사용하는 CPU 사용률 %MEM : 프로세스가 사용하는 메모리 사용률 COMMAND : 실행된 명령어 Real-Time Computing and Communications Lab., Hanyang University http://rtcc.hanyang.ac.kr 34 34 과제 4 Preview Example> Real-Time Computing and Communications Lab., Hanyang University http://rtcc.hanyang.ac.kr 35 35
© Copyright 2026 Paperzz