Arm Linux Kernel Hacks

rousalome.egloos.com

포토로그 Kernel Crash


통계 위젯 (화이트)

43111
637
415419


[리눅스커널] 스케줄링: 런큐 자료구조 struct rq 소개 10. 프로세스 스케줄링

런큐는 실행 대기와 CPU에서 실행 중인 프로세스를 관리하는 스케줄링 핵심 자료구조입니다.
프로세스가 CPU에서 실행을 하려면 먼저 런큐에 Enqueue를 해야 합니다. 스케줄러는 런큐에 Enqueue한 프로세스 중에 우선순위를 계산해서 다음 프로세스를 선택하기 때문입니다. 런큐의 특징은 다음과 같습니다. 
percpu 타입 전역 변수
RT, CFS, Deadline 서브 런큐를 관리
실행 요청을 한 프로세스가 Enqueue됨
CPU를 점유하면서 실행 중인 current 프로세스 관리

런큐에 대해서 알아보기 전에 런큐 단어의 뜻부터 생각해보겠습니다.
runqueue는 run+queue 합성어로 실행큐라는 의미입니다. 달리 보면 프로세스가 실행하기 위한 큐라고 볼 수 있습니다.

스케줄러는 런큐와 자주 대화를 나눕니다. 

    CPU를 점유하고 있는 프로세스는 누구니?
    현재 런큐에서 대기 중인 프로세스는 갯수를 알려줘

이렇게 스케줄러는 런큐 자료구조에 자주 접근해서 실행 대기 상태 프로세스 목록을 확인하고 스케줄링 프로파일 정보를 확인합니다. 따라서 리눅스 시스템에서 프로세스 실행 흐름에 대한 전반적인 정보를 런큐가 저장합니다.

태스크 디스크립터만큼 중요한 자료구조가 런큐입니다. 런큐 자료구조를 보면 실행 대기 상태 프로세스와 CPU를 점유하면서 실행 중인 프로세스 목록까지 확인할 수 있기 때문입니다.

먼저 런큐 자료구조부터 살펴볼까요?

런큐 자료구조 struct rq 소개

런큐 구조체는 struct rq 이며 이 구조체 필드에 프로세스 스케줄링에 관련된 데이터를 저장합니다.

struct rq 구조체 선언부는 다음과 같습니다.
[https://elixir.bootlin.com/linux/v4.19.30/source/kernel/sched/sched.h]
struct rq {
raw_spinlock_t lock;
unsigned int nr_running;
...
struct load_weight load;
unsigned long nr_load_updates;
u64 nr_switches;

struct cfs_rq cfs;
struct rt_rq rt;
struct dl_rq dl;
...
unsigned long nr_uninterruptible;

struct task_struct *curr, *idle, *stop;
...
};

다음 테이블에서 struct rq 구조체 필드 중 중요한 내용을 확인할 수 있습니다.
타입 필드 런큐 자료구조를 바꿀 때 경쟁 조건을 피하기 위한 락
raw_spinlock_t lock 런큐 자료구조를 변경할 때 경쟁 조건을 피하기 위한 락
unsigned int nr_running 런큐에 Enqueue된 모든 프로세스 갯수
u64 nr_switches 컨텍스트 스위칭을 수행한 개수
struct cfs_rq cfs CFS 런큐
struct rt_rq rt RT(실시간) 런큐
unsigned long nr_uninterruptible 런큐에 있는 태스크 중 TASK_UNINTERRUPTIBLE 상태 프로세스 갯수 
struct task_struct * curr 해당 런큐에서 CPU를 점유하면서 실행 중인 프로세스의 태스트 디스크립터
struct task_struct * idle 런큐 idle 프로세스의 태스크 디스크립터
struct list_head cfs_tasks CFS 런큐에 Enqueue된 모든 일반 프로세스의 연결 리스트

런큐 자료구조인 struct rq 필드를 소개했습니다. 다음 소절에서는 라즈베리파이에서 확보한 코어 덤프로 런큐 자료구조를 직접 확인해 보는 시간을 갖겠습니다.

"혹시 궁금한 점이 있으면 댓글로 질문 남겨주세요. 아는 한 성실히 답변 올려드리겠습니다!" 

Thanks,
Austin Kim(austindh.kim@gmail.com)

Reference(프로세스 스케줄링)

스케줄링 소개
프로세스 상태 관리
   어떤 함수가 프로세스 상태를 바꿀까?
스케줄러 클래스
런큐
CFS 스케줄러
   CFS 관련 세부 함수 분석  
선점 스케줄링(Preemptive Scheduling)   
프로세스는 어떻게 깨울까?
스케줄링 핵심 schedule() 함수 분석
컨택스트 스위칭
스케줄링 디버깅
   스케줄링 프로파일링
     CPU에 부하를 주는 테스트   
     CPU에 부하를 주지 않는 테스트

# Reference: For more information on 'Linux Kernel';

디버깅을 통해 배우는 리눅스 커널의 구조와 원리. 1

디버깅을 통해 배우는 리눅스 커널의 구조와 원리. 2


 


핑백

덧글

댓글 입력 영역