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
© Copyright 2024 Paperzz