Guillermo Austin Kim

Sources

Posts

998 posts

[리눅스커널] 스케줄링: CFS 세부 함수 분석 - 타임 슬라이스 관리

Guillermo Austin Kim|2019년 8월 26일

CFS 스케줄러는 지속적으로 프로세스의 타임 슬라이스를 관리합니다. 타임 슬라이스를 소진했을 때 선점 요청 프로세스가 자신에게 주어진 타임 슬라이스를 다 소진하면 선점됩니다. 즉 CPU에서 실행을 멈추고 CPU를 비우게 되는 것입니다. 이제 타임 슬라이스가 무엇인지 알아봤으니 커널에서 타임 슬라이스를 어떤 방식으로 관리하는지 소스 코드를 분석하겠습니다. 커널에서 다음 함수가 실행할 때 프로세스 타임 슬라이스를 업데이트합니다.  scheduler_tick()  task_tick_fair()  check_preempt_tick() 위 함수들은 다음과 같은 역할을 수행합니다. 1. 프로세스가 타임 슬라이스를 소진했는지 점검합니다. 2. 프로세스 타임 슬라이스를 업데이트합니다. 3. 만약 프로세스가

[리눅스커널] 스케줄링: CFS 스케줄러 알고리즘과 vruntime

Guillermo Austin Kim|2019년 8월 26일

CFS는 용어 그대로 프로세스를 공정하게 실행하도록 구현된 스케줄러입니다.CFS의 목표는 런큐에 있는 실행 대기 상태 프로세스에게 CPU 시간을 우선순위에 따라 공정하게 할당하는 것입니다. 우선순위가 높은 프로세스는 CPU 시간을 더 부여하고 우선순위가 낮은 프로세스는 CPU 시간을 적게 할당합니다. load weight 소개 CFS 적용 전 프로세스에게 우선순위의 절대값을 기준으로 타임 슬라이스를 할당 했었습니다. 하지만 프로세스에게 공정한 CPU 시간을 할당 할 수 없었습니다. 그래서 CFS에서는 프로세스에게 공정한 CPU 시간 할당을 위해 우선순위의 비율로 CPU 시간을 분배하게 됐습니다.  정수형 우선순위를 절대값이 아니라 우선순위 비율로 정한 것이다. 이것이 load weight입

[리눅스커널] 스케줄링: CFS 스케줄러를 이루는 주요 개념 알아보기

Guillermo Austin Kim|2019년 8월 26일

CFS(Completely Fair Scheduler)는 2.6.23 커널 버전 이후 적용된 리눅스의 기본 스케줄러입니다. CFS이란 용어를 그대로 풀면 ‘완벽하게 공정한 스케줄러’라고 해석할 수 있습니다. 즉, 런큐에서 실행 대기 상태로 기다리는 프로세스를 공정하게 실행하도록 기회를 부여하는 스케줄러입니다. 이번 절에서는 CFS 알고리즘의 개념을 알아보고 코드 분석으로 세부 동작을 살펴보겠습니다. CFS는 실행 대기 상태인 프로세스들을 우선순위에 따라 최대한 공정하게 실행하는 스케줄러입니다. CFS 세부 동작과 알고리즘을 이해하려면 다음과 같은 개념을 파악할 필요가 있습니다.  타임 슬라이스 우선순위 가상 실행 시간(vruntime) 이번 소절에는 먼저 CFS를 이루는 3가지 주요 개념을 소개

[리눅스커널] 시그널: ftrace로 시그널 시그널 핸들러 동작 라즈베리파이에서 확인해보기

Guillermo Austin Kim|2019년 8월 25일

이번 소절에서는 유저 어플리케이션 코드를 작성하면서 시그널 핸들러를 커널에서 어떤 방식으로 호출하는지 살펴보겠습니다. 이번 챕터에서 배운 내용을 총정리하는 실습이니 꼭 따라서 해보시길 바랍니다. 유저 어플리케이션 시그널 핸들러 설정 코드 입력하기 다음은 유저 어플리케이션에서 시그널 핸들러를 지정하는 실습 코드입니다.1 #include 2 #include 3 #include 4 #include 56 void sig_handler(int signum) {7switch(signum) {8case SIGINT:9printf("sig num [%d] \n", signum);10break

[리눅스커널] 시그널: ftrace로 시그널 기본 동작 라즈베리파이에서 확인해보기

Guillermo Austin Kim|2019년 8월 25일

이번 시간에는 라즈베리파이에서 ftrace를 설정하고 로그를 받아 분석하는 실습을 해 보겠습니다. ftrace 설정하기 먼저 ftrace 설정 방법을 소개합니다.#!/bin/bash echo 0 > /sys/kernel/debug/tracing/tracing_onsleep 1echo "tracing_off" echo 0 > /sys/kernel/debug/tracing/events/enablesleep 1echo "events disabled" echo secondary_start_kernel > /sys/kernel/debug/tracing/set_ftrace_filtersleep 1echo "set_ftrace_filter init" echo function >