Guillermo Austin Kim

Sources

Posts

998 posts

[리눅스커널] 워크큐(workqueue): 워크를 워크큐에 큐잉하는 인터페이스 함수 분석하기

Guillermo Austin Kim|2019년 9월 16일

커널은 디바이스 드라이버 레벨에서 워크큐를 큐잉할 수 있는 여러 가지 함수를 지원합니다.이번 시간에는 워크를 워크큐에 큐잉할 때 사용하는 함수를 소개하고 코드를 분석합니다.  schedule_work() queue_work() queue_work_on() 먼저 schedule_work() 함수를 분석해볼까요? schedule_work() 함수 분석하기 schedule_work() 함수 구현부 코드는 다음과 같습니다.[https://github.com/raspberrypi/linux/blob/rpi-4.19.y/include/linux/workqueue.h]1 static inline bool schedule_work(struct work_struct *work)2 {3 return queue_wo

[리눅스커널] 스케줄링/디버깅: ftrace: 스케줄링 실행 시 콜스택 파악하기

Guillermo Austin Kim|2019년 9월 15일

sched_switch와 sched_wakeup 이벤트는 각각 프로세스 스케줄링과 프로세스를 깨우는 동작을 트레이싱합니다. 이번에는 스케줄링이 실행할 때 콜스택을 점검해 보겠습니다. 커널에선 2가지 타입 스케줄링을 지원합니다. [그림 10.48] 2가지 스케줄링 종류과 동작 방식 스케줄링 종류 별로 어떤 콜스택인지 점검합시다. 먼저 ftrace 설정을 위한 다음 코드를 소개합니다.1 #!/bin/bash2 3 echo 0 > /sys/kernel/debug/tracing/tracing_on4 sleep 15 echo "tracing_off"67 echo 0 > /sys/kernel/debug/tracing/events/enable8 sleep 19 echo "events disabled"1

[리눅스커널] 스케줄링: 스케줄링/디버깅: ftrace: sched_switch와 sched_wakeup 이벤트 소개

Guillermo Austin Kim|2019년 9월 15일

리눅스 커널 ftrace 에서 sched_switch와 sched_wakeup 이벤트를 지원합니다. 각각 이벤트에 대해 소개하고 메시지를 분석하는 방법을 살펴보겠습니다. 리눅스 커널의 프로세스 동작을 처음 접하는 분들이 겪는 어려움이 있습니다. 실제 리눅스 시스템에서 얼마나 자주 프로세스가 스케줄링 되는지 확인할 수 없다는 것입니다. 그 이유는 간단합니다.  코드를 분석한 내용을 실제 리눅스 시스템에서 확인하지 않기 때문입니다. 그래서 임베디드 리눅스를 개발할 때 모듈이나 드라이버 코드가 실행할 때 어떤 프로세스가 어떻게 스케줄링 되는지 확인하기도 어렵습니다. 리눅스 커널에서는 이런 의문을 해소시킬 수 있는 디버깅 기능을 지원합니다. 바로 ftrace입니다. ftrace 에는 프로세스

[리눅스커널] 스케줄링: 선점 스케줄링(Preemptive Scheduling)이란 무엇일까?

Guillermo Austin Kim|2019년 9월 15일

선점 스케줄링은 다음과 같이 정의내릴 수 있습니다.  CPU에서 실행 중인 프로세스를 비우고 새로운 프로세스를 CPU에서 실행시킴 선점 스케줄링에 대한 이해를 돕기 위해 야구에서 투수 교체를 하는 과정을 예를 들겠습니다. 마운드에 A란 투수가 있다고 가정합시다. A란 투수는 열심히 공을 던지고 있습니다. 감독은 투수가 마운드에서 제대로 공을 던지고 있는지 계속 관찰합니다. 제구는 좋은지 구속은 제대로 나오고 있는지 점검합니다. 그런데 시간이 흘러 B, C와 D란 투수가 자신이 공을 던지고 싶다는 의사와 함께 불펜에서 몸을 풀기 시작했습니다. B, C와 D란 투수도 A와 같은 기량의 투수입니다. 감독은 A와 B, C, D 투수를 비교합니다. 만약 B, C, D 투수 중에 A보다 잘 던진다고(

[리눅스커널] 스케줄링: 런큐에 등록된 프로세스 자료구조 확인하기

Guillermo Austin Kim|2019년 9월 14일

이번 소절에서는 런큐 자료구조를 소개합니다. 런큐에 Enqueue한 프로세스 리스트 확인하기 일반 프로세스가 런큐에 Enqueue를 하면 런큐 구조체 struct rq 필드 중 연결리스트인 cfs_tasks에 자신의 태스크 디스크립터 주소(&se->group_node)를 등록합니다. 프로세스 태스크 디스크립터인 struct task_struct 구조체 &se->group_node 필드 주소를 struct rq 런큐 구조체 cfs_tasks 연결 리스트 필드에 저장하는 것입니다. 이 관계를 다음 그림을 보면서 살펴보겠습니다. [그림 10.25] 런큐에 Enqueue한 프로세스 연결 리스트 구조 여기서 한 가지 의문이 생깁니다.  어디서 프로세스 태스크 디스크립