Contents Notice Linux Scheduler (복습) CFS

Operating System 7주차
- Completely Fair Scheduler (2) -
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
 Notice
 Linux Scheduler (복습)
 CFS (Completely Fair Scheduler) (복습)
 CFS Parameters (복습)
 CFS Source code
 Kernel Functions (복습)
 Task Priority 확인 및 변경
 과제 4
Real-Time Computing and Communications Lab., Hanyang University
http://rtcc.hanyang.ac.kr
22
Notice
 2015/04/24 Midterm Exam
 2015/05/15 School Anniversary
 So there will be no Lab Class.
 Good Luck for you exam!!!
Real-Time Computing and Communications Lab., Hanyang University
http://rtcc.hanyang.ac.kr
33
Notice
 What is Session ?
 A collection of one or more process groups
 Controlling process is the session leader that establishes the
connection to the controlling terminal.
Real-Time Computing and Communications Lab., Hanyang University
http://rtcc.hanyang.ac.kr
44
Notice
 Previous Linux Booting
 $ sudo vim /etc/default/grub
• 여기서 grub는 GNU 프로젝트의 부트로더 이다.
• 아래의 그림처럼 ‘#’을 이용해 주석처리 한다.
 $ sudo update-grub
 $ sudo reboot
Real-Time Computing and Communications Lab., Hanyang University
http://rtcc.hanyang.ac.kr
55
Notice
 Previous Linux Booting
 booting 시 다음과 같이 version을 선택할 수 있게 된다.
Real-Time Computing and Communications Lab., Hanyang University
http://rtcc.hanyang.ac.kr
66
Notice
 Kernel Version Check
 $ uname –r 혹은 uname –a 를 통해 현재 커널 버전을 확인할 수 있다.
Real-Time Computing and Communications Lab., Hanyang University
http://rtcc.hanyang.ac.kr
77
Notice
 5주차 실습자료 ppt 관련 수정사항
 i386(32 bit)에서는 glibc 에서 eax와 int 0x80을 이용하여 system
call table로 가서 system call 호출
 X86_64(64 bit)에서는 glibc 에서 rax와 syscall을 이용
 exit system call
 User Program 에서 exit 함수 사용
 glibc/stdlib/exit.c 내에 void exit(int status) 함수 호출
• exit -> __run_exit_handlers -> _exit
 glibc/sysdeps/unix/sysv/linux/_exit.c
• INLINE_SYSCALL 매크로 실행
 glibc/sysdeps/unix/sysv/linux/x86_64/sysdep.h
• INLINE_SYSCALL -> INTERNAL_SYSCALL_NCS 에서 어셈블리코
드로 syscall 명령 실행해서 시스템 콜 테이블로 접근
Real-Time Computing and Communications Lab., Hanyang University
http://rtcc.hanyang.ac.kr
88
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
99
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
10
10
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
11
11
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
12
12
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
13
13
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
14
14
CFS Parameters
 Timeslice
 Task가 preemption 되기 전 CPU를 통해 수행된 시간
 Timeslice는 각 task의 weight에 따라서 proportional 하게 할당됨
Real-Time Computing and Communications Lab., Hanyang University
http://rtcc.hanyang.ac.kr
15
15
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
16
16
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
17
17
CFS Source code (1)
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
18
18
CFS Source code (1)
 scheduler_tick
 Timer interrupt에 의해서 실행
 현재 running task에 대한 정보를 받아 task tick(= task_tick_fair)
을 실행
Real-Time Computing and Communications Lab., Hanyang University
http://rtcc.hanyang.ac.kr
19
19
CFS Source code (1)
 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
20
20
CFS Source code (1)
 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
21
21
CFS Source code (1)
 update_curr
 프로세스의 vruntime 값을 갱신
Real-Time Computing and Communications Lab., Hanyang University
http://rtcc.hanyang.ac.kr
22
22
CFS Source code (1)
 calc_delta_fair
 실제 time slice값에 대하여 task의 weight 비율에 따른 vruntime
을 계산
 __calc_delta를 호출하여 vruntime 계산
Real-Time Computing and Communications Lab., Hanyang University
http://rtcc.hanyang.ac.kr
23
23
CFS Source code (1)
 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
24
24
CFS Source code (1)
 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
25
25
CFS Source code (1)
 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
26
26
CFS Source code (2)
__schedule
preempt_disable
put_prev_task
put_prev_task_fair
pick_next_task
pick_next_task_fair
put_prev_entity
__enqueue_entity
pick_next_entity
set_next_entity
YES
__dequeue_entity
TIF_NEED_RESCHED = true ?
NO
Real-Time Computing and Communications Lab., Hanyang University
http://rtcc.hanyang.ac.kr
27
27
CFS Source code (2)
 TIF_NEED_RESCHED is set
 arch/x86/entry_64.S file에서 __schedule 호출
 __schedule
 kernel/sched/core.c
 현재 task의 정보를 prev에 저장
Real-Time Computing and Communications Lab., Hanyang University
http://rtcc.hanyang.ac.kr
28
28
CFS Source code (2)
 __schedule
 put_prev_task를 호출하여 현재 task를 run queue에 넣음.
 pick_next_task를 호출하여 run queue에서 가장 priority가 높은
task를 받음. (Red-black tree leftmost node)
 put_prev_task와 pick_next_task의 경우 kernel/sched/fair.c 에
서 각각 put_prev_task_fair, pick_next_task_fair를 가리킴.
Real-Time Computing and Communications Lab., Hanyang University
http://rtcc.hanyang.ac.kr
29
29
CFS Source code (2)
 put_prev_task_fair
 CFS run queue에 prev task의 sched_entity를 넣는
put_prev_entity 호출
Real-Time Computing and Communications Lab., Hanyang University
http://rtcc.hanyang.ac.kr
30
30
CFS Source code (2)
 put_prev_entity
 __enqueue_entity를 호출하여 prev task를 CFS run queue에 넣
음
Real-Time Computing and Communications Lab., Hanyang University
http://rtcc.hanyang.ac.kr
31
31
CFS Source code (2)
 pick_next_task_fair
 pick_next_entity를 호출하여 CFS run queue의 left-most node
를 받음
 set_next_entity를 호출하여 CFS run queue에서 해당 entity를
dequeue 함
Real-Time Computing and Communications Lab., Hanyang University
http://rtcc.hanyang.ac.kr
32
32
CFS Source code (2)
 pick_next_entity
 __pick_first_entity를 호출하여 CFS run queue의 left-most
node를 받음
Real-Time Computing and Communications Lab., Hanyang University
http://rtcc.hanyang.ac.kr
33
33
CFS Source code (2)
 set_next_entity
 __dequeue_entity를 호출하여 해당 sched_entity를 CFS run
queue에서 제거
Real-Time Computing and Communications Lab., Hanyang University
http://rtcc.hanyang.ac.kr
34
34
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
35
35
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
36
36
Kernel Functions
 Example (Kernel code)
 User로부터 integer 변수를 받아 커널에서 factorial 계산
Real-Time Computing and Communications Lab., Hanyang University
http://rtcc.hanyang.ac.kr
37
37
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
38
38
Kernel Functions
 Example (User code)
 getfactorial 시스템 콜을 호출해 factorial 계산
Real-Time Computing and Communications Lab., Hanyang University
http://rtcc.hanyang.ac.kr
39
39
Priority 확인 및 변경
 여러 개의 프로세스들이 실행하려 시도될 때, 그들
각각이 가진 priority가 그 프로세스가 가져갈
CPU의 점유율을 결정한다.
 Linux CFS의 경우 -20~19사이에서 동작한다.
 priority는 낮은 숫자일 수록 더 자주 실행됨을 의
미한다. 즉, priority(=nice)값이 작을 수록 높은
우선순위를 가지게 된다.
 다음 슬라이드에서 설명 할 2개의 함수는 지정한
타겟의 priority를 확인하고 변경하는 함수로
sys/resource.h 에 선언되어 있다.


int getpriority(int which, id_t who)
int setpriority(int which, id_t who, int priority)
Real-Time Computing and Communications Lab., Hanyang University
http://rtcc.hanyang.ac.kr
40
40
Priority 확인 및 변경
 getpriority
 지정한 타겟의 priority를 반환하는 함수
 Def : int getpriority(int which, id_t who)
 Parameters
• which는 다음 중 하나로 설정한다.
 PRIO_PROCESS : 프로세스
 PRIO_PGRP : 프로세스 그룹
 PRIO_USER : 유저
• who는 which의 ID로 차례로 PID, PGID, UID를 의미한다.
 성공하면 해당되는 ID를 반환하고, 실패하면 -1을 반환한다.
Real-Time Computing and Communications Lab., Hanyang University
http://rtcc.hanyang.ac.kr
41
41
Priority 확인 및 변경
 Example> getpriority
 source code
 result
Real-Time Computing and Communications Lab., Hanyang University
http://rtcc.hanyang.ac.kr
42
42
Priority 확인 및 변경
 setpriority
 지정한 타겟의 priority를 변경하는 함수
 Def : int setpriority(int which, id_t who, int priority)
 Parameters
• which는 앞의 getpriority에서와 동일
• who는 which의 ID로 차례로 PID, PGID, UID를 의미한다.
• priority는 변경하고자 하는 우선순위 값으로, -20~20사이에서 실행된
다.
 성공하면 해당되는 0을 반환하고, 실패하면 -1을 반환한다.
 위의 함수를 사용하기 위해서는 관리자 권한으로 실행하여야 한다.
• $ sudo ./”File name”
Real-Time Computing and Communications Lab., Hanyang University
http://rtcc.hanyang.ac.kr
43
43
Priority 확인 및 변경
 Example> setpriority
 source code
 result
Real-Time Computing and Communications Lab., Hanyang University
http://rtcc.hanyang.ac.kr
44
44
과제 4
 1. 동적으로 Priority(=nice) 값을 바꿔서 CPU 점유율을 보장 받는 프로
그램을 구현한다.
 Target Program -> CPU bound program
• ex> 행렬곱셈
 프로그램은 CFS로 동작하는 우선순위 범위 내에서 동작해야 하며, 본 과제
에서는 약 30% 점유율을 유지하도록 한다.
 $ top 를 통해, CPU 점유율을 실시간으로 확인할 수 있다.
 2. Test
 단일코어 환경에서 테스트 -> VirtualBox 설정을 통해 변경 가능
 첫 번째 terminal에서 top명령어를 통해 CPU 점유율을 확인한다.
 두 번째 terminal에서 백그라운드 실행을 통해 프로그램을 점진적으로 추가
하고, 우선순위 값의 변경과, CPU 점유율을 확인한다.
 5/1 실습 수업시간 조교들이 프로그램 동작 유무 직접 확인.
Real-Time Computing and Communications Lab., Hanyang University
http://rtcc.hanyang.ac.kr
45
45
과제 4
 Example>
Real-Time Computing and Communications Lab., Hanyang University
http://rtcc.hanyang.ac.kr
46
46
과제 4
 Due: 2015/05/01 실습 수업 시간
 5/1 실습 보고서 출력해서 수업시간에 제출
 보고서
•
•
•
•
표지
과제 내용 요약
Kernel Code 수정 한 부분에 대한 설명(스크린샷 첨부할 것)
추가한 시스템 콜이 있다면 핸들러 함수부분만 스크린샷 첨부하고 설
명
• 별도의 CPU Bound Program을 구현했다면 코드를 첨부하고 설명
• 과제예시에 matrix_test처럼, CPU점유율을 유지하는 프로그램에서 어
떻게 30% 를 유지하도록 하였는지 커널 수정한 것과 연관 지어 설명
• 최종 결과 스크린 샷 및 분석
Real-Time Computing and Communications Lab., Hanyang University
http://rtcc.hanyang.ac.kr
47
47
과제 4
 5/1 실습수업 강의 후 프로그램 동작 확인
 결석해야 할 사유가 있을 시 사전에 조교에게 말할 것
 테스트는 빠른 확인을 위해 단일코어 환경에서 실시한다
 조교 앞에서 동작하지 않으면 구현한 단계에 따라 점수 A B C F부여
 보고서 및 프로그램 동작 확인 전부 받아야 과제 만점 받을
수 있음.
Real-Time Computing and Communications Lab., Hanyang University
http://rtcc.hanyang.ac.kr
48
48
과제 4
 문의사항
 이름 : 김연준
 E-Mail : [email protected]
 이름 : 하태욱
 E-Mail : [email protected]
 실습관련 질문 시 제목을 아래의 양식에 맞춰서 메일을 보내주세요.
• ex> [운영체제] 학번_이름
 지연제출에 대해서는 감점이 있을 수 있음.
Real-Time Computing and Communications Lab., Hanyang University
http://rtcc.hanyang.ac.kr
49
49