[라즈베리파이] 스케줄링: 런큐란 무엇일까?
By Guillermo Austin Kim | 2019년 2월 3일 |
CPU를 점유하면서 실행하고 있는 프로세스는 딱 한 개인데 다수의 프로세스들은 실행 대기 상태에 있습니다. 커널은 스케줄링으로 여러 개의 실행 대기 프로세스 중에서 하나 프로세스를 선택합니다. 리눅스 시스템에서는 여러 개 프로세스들이 동시 다발적으로 실행 요청을 합니다. 따라서 여러 개의 실행 대기 상태에 있는 프로세스를 식별하고 관리할 수 있는 자료 구조가 필요합니다. 실행 대기 상태 프로세스와 CPU에서 실행 중인 프로세스를 관리하는 자료구조를 런큐라고 말합니다. 런큐가 여러 개 프로세스들로부터 실행 요청을 받아 관리를 해주니 스케줄러가 편하게 스케줄링을 할 수 있는 것입니다. 런큐는 per-cpu 타입 변수입니다. 즉, CPU 갯수만큼 주소 공간이 있다는 의미입니다.라즈베리파이는 CPU가 4개
[라즈베리파이] 워크큐(Workqueue) - 워크를 워크큐에 어떻게 큐잉할까?(2)
By Guillermo Austin Kim | 2018년 9월 9일 |
From: 워크를 워크큐에 어떻게 큐잉할까?(1)에서 계속... 이번에는 28줄 코드를 보겠습니다.28last_pool = get_work_pool(work);struct work_struct 구조체인 work 변수로 get_work_pool() 함수를 호출해서 struct worker_pool 구조체 주소를 last_pool 지역변수로 읽습니다. get_work_pool() 함수는 조금 후 분석할 예정입니다. 이 코드만 보면 이해하기 쉽지 않으니 다음 그림을 같이 보겠습니다. 워크를 실행한 적이 있으면 struct work_struct.data 란 멤버 변수에 풀워크 주소를 저장합니다. get_work_pool() 함수는 위 그림에서 [1],[2] 번호와 같이 동작하면서 워커풀 주소를 가져옵니다.
[라즈베리파이][리눅스커널] IRQ Thread는 언제 생성할까?[1] #CS
By Guillermo Austin Kim | 2018년 6월 19일 |
# 인터럽트 후반부 처리1 IRQ Thread(threaded IRQ) 란 2. 인터럽트 후반부 처리(Bottom Half) 소개3.IRQ Thread는 언제 생성할까?[1] IRQ Thread를 생성하기 위해서는 request_threaded_irq 을 호출하면 IRQ Thread가 생성된다고 설명해 드렸습니다. 사실 request_threaded_irq을 호출할 때 IRQ Thread가 생성되는 것은 아니고 다음 흐름에서 __kthread_create_on_node 함수가 실행할 때 생성됩니다. 우리는 커널 쓰레드를 생성할 때 kthread_create 함수를 호출한다고 배웠죠. IRQ Thread도 이 kthread_create 함수를 호출해서 생성합니다. 이로 I
[라즈베리파이] 동기화 - 커널 동기화 기법 소개
By Guillermo Austin Kim | 2018년 12월 20일 |
이전 시간에 Race가 발생하는 3가지 대표적인 상황을 확인했습니다. 이어서 이번에 커널 동기화 기법을 소개하고 그 특징을 알아봅니다. 이전에 소개했던 그림을 다시 보겠습니다. 임계 영역에 A와 B 프로세스가 접근하는 상황입니다. 두 커널 동기화 기법인 스핀락과 뮤텍스의 차이점을 비교하면서 동기화 기법에 대해 살펴보겠습니다. 스핀락과 뮤텍스의 가장 큰 차이점은 위 그림 [6] 번호 밑 박스에 표시돼 있습니다. 이미 락(Lock)을 다른 프로세스가 획득하고 있을 때 기다리는 방법입니다. 스핀락은 다른 일(스케줄링)을 안 하고 화장실 밖에서 계속 기다립니다. 이를 Busy-Wait라고 설명합니다. 뮤텍스는 자신을 대기열에 등록하고 자신을 UNINTERRUPTIBLE 상태로 바꾼 다음 휴면에