(A, B) 존재한다면, 각각의 task가 가지는 timeslice는

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