35
Real-Time Computing and Communications Lab., Hanyang University http://rtcc.hanyang.ac.kr Real-Time Computing and Communications Lab., Hanyang University http://rtcc.hanyang.ac.kr 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 Real-Time Computing and Communications Lab., Hanyang University

Embed Size (px)

Citation preview

Real-Time Computing and Communications Lab., Hanyang Universityhttp://rtcc.hanyang.ac.kr

Real-Time Computing and Communications Lab., Hanyang Universityhttp://rtcc.hanyang.ac.kr

Operating System 6 주차- Completely Fair Scheduler (1) -

Real-Time Computing and Communications Lab.

Hanyang University

[email protected]

[email protected]

2Real-Time Computing and Communications Lab., Hanyang University

http://rtcc.hanyang.ac.kr 2Real-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

3Real-Time Computing and Communications Lab., Hanyang University

http://rtcc.hanyang.ac.kr 3Real-Time Computing and Communications Lab., Hanyang University

http://rtcc.hanyang.ac.kr

Linux Scheduler

4Real-Time Computing and Communications Lab., Hanyang University

http://rtcc.hanyang.ac.kr 4Real-Time Computing and Communications Lab., Hanyang University

http://rtcc.hanyang.ac.kr

Linux Scheduler

Linux Scheduler 는 Scheduler class 라는 이름으로 모듈화 되어 있다 .

각각의 Scheduler class 는 우선순위를 가지고 있다 . Task 는 아래의 Scheduler class 중 1 개에 속해서 ,

해당 알고리즘에 맞게 동작한다 .

5Real-Time Computing and Communications Lab., Hanyang University

http://rtcc.hanyang.ac.kr 5Real-Time Computing and Communications Lab., Hanyang University

http://rtcc.hanyang.ac.kr

CFS (Completely Fair Scheduler)

CFS (Completely Fair Scheduler) Linux kernel version 2.6.23 이후로 기본 스케줄러로 사용되고

있는 스케줄러 일반적인 여러 task 들에 대해 공정하게 CPU time 을 할당하기

위해 도입 Basic concept

• 각각의 task 들이 가지는 weight 에 비례하여 CPU time 을 할당

6Real-Time Computing and Communications Lab., Hanyang University

http://rtcc.hanyang.ac.kr 6Real-Time Computing and Communications Lab., Hanyang University

http://rtcc.hanyang.ac.kr

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

7Real-Time Computing and Communications Lab., Hanyang University

http://rtcc.hanyang.ac.kr 7Real-Time Computing and Communications Lab., Hanyang University

http://rtcc.hanyang.ac.kr

CFS Parameters

Schedulable Entity 각각의 프로세스들은 자신의 task_struct 에 sched_entity 를

가짐 Task 의 weight 과 같은 linux scheduling 에 필요한 정보를

가지고 있음 /include/linux/sched.h

8Real-Time Computing and Communications Lab., Hanyang University

http://rtcc.hanyang.ac.kr 8Real-Time Computing and Communications Lab., Hanyang University

http://rtcc.hanyang.ac.kr

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 의 값을 가짐

9Real-Time Computing and Communications Lab., Hanyang University

http://rtcc.hanyang.ac.kr 9Real-Time Computing and Communications Lab., Hanyang University

http://rtcc.hanyang.ac.kr

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)

10Real-Time Computing and Communications Lab., Hanyang University

http://rtcc.hanyang.ac.kr 10Real-Time Computing and Communications Lab., Hanyang University

http://rtcc.hanyang.ac.kr

CFS Parameters

Timeslice Task 가 preemption 되기 전 CPU 를 통해 수행된 시간 Timeslice 는 각 task 의 weight 에 따라서 proportional 하게

할당됨

11Real-Time Computing and Communications Lab., Hanyang University

http://rtcc.hanyang.ac.kr 11Real-Time Computing and Communications Lab., Hanyang University

http://rtcc.hanyang.ac.kr

CFS Parameters

Virtual Runtime (vruntime) “ideal multitasking” 을 수행하기 위해 제안됨 Nice value = 0 에 해당하는 weight 값과 자신의 weight 값의

상대적인 비율에 따른 가상의 시간 (=vruntime) 을 계산함 . Scheduler 는 vruntime 이 가장 작은 task 를 선택함 .

• Red-black tree leftmost node

12Real-Time Computing and Communications Lab., Hanyang University

http://rtcc.hanyang.ac.kr 12Real-Time Computing and Communications Lab., Hanyang University

http://rtcc.hanyang.ac.kr

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 은 어떻게 되겠는가 ? 그리고 이때 , 어떤 효과가 예상되는가 ?

13Real-Time Computing and Communications Lab., Hanyang University

http://rtcc.hanyang.ac.kr 13Real-Time Computing and Communications Lab., Hanyang University

http://rtcc.hanyang.ac.kr

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

14Real-Time Computing and Communications Lab., Hanyang University

http://rtcc.hanyang.ac.kr 14Real-Time Computing and Communications Lab., Hanyang University

http://rtcc.hanyang.ac.kr

CFS Source code

scheduler_tick

task_tick -> task_tick_fair

entity_tick

update_curr calc_delta_fair

check_preempt_tick sched_slice

resched_task set_tsk_need_resched

cfs_rq->nr_running > 1 = true?

vruntime > time slice

YES

NO

YESNO

15Real-Time Computing and Communications Lab., Hanyang University

http://rtcc.hanyang.ac.kr 15Real-Time Computing and Communications Lab., Hanyang University

http://rtcc.hanyang.ac.kr

CFS Source code

scheduler_tick Timer interrupt 에 의해서 실행 현재 running task 에 대한 정보를 받아 task tick(=

task_tick_fair) 을 실행

16Real-Time Computing and Communications Lab., Hanyang University

http://rtcc.hanyang.ac.kr 16Real-Time Computing and Communications Lab., Hanyang University

http://rtcc.hanyang.ac.kr

CFS Source code

task_tick_fair CFS task 들에 대해 scheduling tick 을 수행 현재 task 의 sched_entity 를 받아 entity_tick 호출

17Real-Time Computing and Communications Lab., Hanyang University

http://rtcc.hanyang.ac.kr 17Real-Time Computing and Communications Lab., Hanyang University

http://rtcc.hanyang.ac.kr

CFS Source code

entity_tick CFS 의 schedulable entity 의 정보를 update update_curr 를 호출하여 virtual runtime 을 update

check_preempt_tick 를 호출하여 TIF_NEED_RESCHED 의 조건을 검사

18Real-Time Computing and Communications Lab., Hanyang University

http://rtcc.hanyang.ac.kr 18Real-Time Computing and Communications Lab., Hanyang University

http://rtcc.hanyang.ac.kr

CFS Source code

update_curr 프로세스의 vruntime 값을 갱신

19Real-Time Computing and Communications Lab., Hanyang University

http://rtcc.hanyang.ac.kr 19Real-Time Computing and Communications Lab., Hanyang University

http://rtcc.hanyang.ac.kr

CFS Source code

calc_delta_fair 실제 time slice 값에 대하여 task 의 weight 비율에 따른 vrun-

time 을 계산 __calc_delta 를 호출하여 vruntime 계산

20Real-Time Computing and Communications Lab., Hanyang University

http://rtcc.hanyang.ac.kr 20Real-Time Computing and Communications Lab., Hanyang University

http://rtcc.hanyang.ac.kr

CFS Source code

check_preempt_tick CFS 의 entity_tick 에 의해서 호출됨 ideal runtime 을 구하기 위해 time slice 를 구하는 sched_slice

함수 호출 (virtual runtime) > time slice 이면 , resched_task 호출

21Real-Time Computing and Communications Lab., Hanyang University

http://rtcc.hanyang.ac.kr 21Real-Time Computing and Communications Lab., Hanyang University

http://rtcc.hanyang.ac.kr

CFS Source code

sched_slice 해당 task 에 대해 time slice 값을 반환 struct load_weight *load 는 cfs_rq 전체의 weight 를 뜻함 . se->load.weight 은 현재 task 의 weight 을 뜻함 .

22Real-Time Computing and Communications Lab., Hanyang University

http://rtcc.hanyang.ac.kr 22Real-Time Computing and Communications Lab., Hanyang University

http://rtcc.hanyang.ac.kr

CFS Source code

resched_task 해당 task 가 rescheduling 되어야 함을 mark 하는 함수 set_tsk_need_resched 를 호출하여 TIF_NEED_RESCHED 를

set 시킴

23Real-Time Computing and Communications Lab., Hanyang University

http://rtcc.hanyang.ac.kr 23Real-Time Computing and Communications Lab., Hanyang University

http://rtcc.hanyang.ac.kr

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 에 정의되어 있음

24Real-Time Computing and Communications Lab., Hanyang University

http://rtcc.hanyang.ac.kr 24Real-Time Computing and Communications Lab., Hanyang University

http://rtcc.hanyang.ac.kr

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 의 크기

25Real-Time Computing and Communications Lab., Hanyang University

http://rtcc.hanyang.ac.kr 25Real-Time Computing and Communications Lab., Hanyang University

http://rtcc.hanyang.ac.kr

Kernel Functions

Example (Kernel code) User 로부터 integer 변수를 받아 커널에서 factorial 계산

26Real-Time Computing and Communications Lab., Hanyang University

http://rtcc.hanyang.ac.kr 26Real-Time Computing and Communications Lab., Hanyang University

http://rtcc.hanyang.ac.kr

Kernel Functions

Example (Kernel code) SYSCALL_DEFINE 사용

• helloworld.c file 에 다음과 같이 추가해 보았습니다 .

• 비슷한 목적을 가진 시스템 콜에 대해서 1 개의 파일에 여러 개의 시스템 콜을 구현할 때 사용할 수 있습니다 .

• 상단에 추가적으로 맵핑을 위해 linux/syscalls.h 를 추가해줍니다 .

27Real-Time Computing and Communications Lab., Hanyang University

http://rtcc.hanyang.ac.kr 27Real-Time Computing and Communications Lab., Hanyang University

http://rtcc.hanyang.ac.kr

Kernel Functions

Example (User code) getfactorial 시스템 콜을 호출해 factorial 계산

28Real-Time Computing and Communications Lab., Hanyang University

http://rtcc.hanyang.ac.kr 28Real-Time Computing and Communications Lab., Hanyang University

http://rtcc.hanyang.ac.kr

Foreground & Background ( 중복 )

프로세스를 실행하는 방법은 크게 2 가지가 있다 .

Foreground 기본적으로 모든 프로세스는 foreground 로 실행된다 . 키보드와 연결되어 있으며 결과를 직접적으로 스크린 혹은 터미널 창에

출력한다 . 꽤 긴 시간 동안 동작하는 프로그램을 실행시켰을 경우에는 그 시간 동안

터미널을 이용할 수 없게 되므로 , 곤란한 경우가 생기게 된다 .

Background 키보드와 연결되지 않은 상태로 실행된다 . 만약 이 프로세스가 키보드 입력을 필요로 할 경우에는 , 입력을 기다린

다 . Background 로 프로세스를 실행하는 것의 장점은 한 프로세스가

동작하고 있는 동안에도 다른 프로세스를 실행시킬 수 있다는 점이다 . $ ./a.out & 를 통해 백그라운드로 실행할 수 있다 .

29Real-Time Computing and Communications Lab., Hanyang University

http://rtcc.hanyang.ac.kr 29Real-Time Computing and Communications Lab., Hanyang University

http://rtcc.hanyang.ac.kr

Foreground & Background ( 중복 )

Example> matrix source code 단순하게 100 x 100 행렬을 10^5 제곱하는 함수 . 참고로 아래 프로그램은 input_matrix 의 초기화가 생략되어 있습니다 .

30Real-Time Computing and Communications Lab., Hanyang University

http://rtcc.hanyang.ac.kr 30Real-Time Computing and Communications Lab., Hanyang University

http://rtcc.hanyang.ac.kr

Foreground & Background ( 중복 )

Example> Foreground & Background Foreground 실행 -> 프로세스가 종료할 때 까지 다른 작업 못

함 .

Background 실행 -> 다른 작업 가능

“ctrl + z” 프로세스 중지 -> foreground 프로세스 중지

31Real-Time Computing and Communications Lab., Hanyang University

http://rtcc.hanyang.ac.kr 31Real-Time Computing and Communications Lab., Hanyang University

http://rtcc.hanyang.ac.kr

Foreground & Background ( 중복 )

Example> Foreground & Background command “jobs”

• 현재 실행되고 있는 프로세스들의 상태와 , job 번호를 알 수 있다 .

Background -> Foreground• $ fg %job 번호 (ex> fg %2)

32Real-Time Computing and Communications Lab., Hanyang University

http://rtcc.hanyang.ac.kr 32Real-Time Computing and Communications Lab., Hanyang University

http://rtcc.hanyang.ac.kr

Foreground & Background ( 중복 )

Foreground -> Background• $ bg %job 번호• foreground 에서 background 로 바꾸려면 , 먼저 foreground 로

실행되고 있는 프로세스를 ctrl + z 로 중지 시킨 후 해야 한다 .

33Real-Time Computing and Communications Lab., Hanyang University

http://rtcc.hanyang.ac.kr 33Real-Time Computing and Communications Lab., Hanyang University

http://rtcc.hanyang.ac.kr

“top” command

Linux 에서 시스템 사용량을 확인 Usage : $ top [options]

34Real-Time Computing and Communications Lab., Hanyang University

http://rtcc.hanyang.ac.kr 34Real-Time Computing and Communications Lab., Hanyang University

http://rtcc.hanyang.ac.kr

“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 : 실행된 명령어

35Real-Time Computing and Communications Lab., Hanyang University

http://rtcc.hanyang.ac.kr 35Real-Time Computing and Communications Lab., Hanyang University

http://rtcc.hanyang.ac.kr

과제 4 Preview

Example>