Guillermo Austin Kim

Sources

Posts

998 posts

[리눅스커널] 동기화: 스핀락과 뮤텍스 기법 차이점 알아보기

Guillermo Austin Kim|2019년 9월 14일

이번에는 스핀락과 뮤텍스의 자료구조와 함께 두 기법의 차이점을 살펴보겠습니다. 스핀락과 뮤텍스의 구현 방식의 차이점은 다음과 같습니다. 스핀락은 코드가 간결합니다. 다른 프로세스가 스핀락을 누군가 획득하고 있으면 밖에서 계속 기다리는 동작입니다. 뮤텍스는 스핀락에 비해 코드 복잡도가 높습니다. 다른 프로세스가 뮤텍스를 획득하면 휴면에 들어가고 깨어나는 추가 동작을 하기 때문입니다. 스핀락은 아키텍처에 의존적인 코드로 구현됐습니다. 대신 뮤텍스는 아키텍처에 의존적이지 않은 리눅스 커널 함수로 구현됐습니다. 이번에도 화장실에서 B 프로세스가 기다리는 상황을 그리면서 두 기법의 차이점을 알아보겠습니다. 자물쇠(락)가 잠겼는지 알아보는 방법 기법 특징스핀락: 스핀락 구조체 중 owner와 next 필드가

[리눅스커널] 동기화/디버깅: 뮤텍스(Mutex) owner 확인해보기

Guillermo Austin Kim|2019년 9월 14일

우리는 9.5 절에서 뮤텍스를 배웠습니다. 핵심 내용은 다음과 같습니다.  뮤텍스는 획득한 프로세스는 struct mutex 구조체 owner 필드에 자신의 태스크 디스크립터 주소를 저장한다. 이번 소절에는 실습으로 프로세스가 뮤텍스를 획득하고 해제하는 과정에서 struct mutex 구조체 owner 필드를 알아보겠습니다. 실습 패치 코드 작성해보기 먼저 패치 코드를 소개합니다.diff --git a/kernel/locking/mutex.c b/kernel/locking/mutex.c--- a/kernel/locking/mutex.c+++ b/kernel/locking/mutex.c@@ -233,12 +233,33 @@ static void __sched __mutex_lock_s

[리눅스커널] 동기화: 뮤텍스 fastpath 동작

Guillermo Austin Kim|2019년 9월 14일

fastpath는 뮤텍스를 다른 프로세스가 획득하지 않았을 때 뮤텍스를 획득하고 빠져 나오는 실행 흐름입니다. 다음 그림을 보면서 fastpath 실행 흐름에 대해 배워볼까요? [그림 9.13] 뮤텍스 fastpath 실행 흐름도 먼저 뮤텍스를 획득하는 단계 세부 동작을 설명하겠습니다. 뮤텍스를 획득하려면 mutex_lock() 함수를 호출해야 합니다. mutex_lock() 함수 내부 루틴에서 다음 순서로 동작합니다.struct mutex 구조체 owner 필드 점검 owner가 0x0이니 뮤텍스를 다른 프로세스가 획득하지 않은 상태로 판단뮤텍스 자료구조인 struct mutex 구조체 owner 필드는 뮤텍스를 획득한 프로세스의 태스크 디스크립터를 저장 태스크 디스크립터 주소가 0

[리눅스커널] 동기화: 뮤텍스의 기본 개념 소개하기

Guillermo Austin Kim|2019년 9월 14일

뮤텍스 소개 스핀락과 더불어 커널에서 가장 많이 쓰이는 락(Locking) 기법은 뮤텍스입니다. 뮤텍스는 휴면을 지원하며 프로세스 컨택스트에서 주로 쓰는 락(Locking) 기법입니다. 먼저 뮤텍스의 기본 개념과 동작 원리를 설명합니다. 이후 스핀락과 차이점을 알아보면서 뮤텍스의 특징을 살펴보고 뮤텍스 관련 커널 함수를 분석합니다. 뮤텍스(mutex)는 상호 배제(mutual exclusion)의 약자로 임계 영역에 한 개의 프로세스만 접근하는 동기화 기법입니다. 뮤텍스(mutex)는 사실 리눅스 커널에서만 쓰이는 락(Locking) 기법은 아닙니다. 뮤텍스는 운영 체제에서 쓰는 용어입니다. 뮤텍스는 '임계 구역에 2개 프로세스가 동시에 접근하지 못하도록 막는 기법'인데 서로 다른 운영체제마다 달

[리눅스커널] 스핀락(spinlock) 플러그인 함수: spin_lock_irqsave()/spin_unlock_irqrestore

Guillermo Austin Kim|2019년 9월 12일

리눅스 커널에서 spin_lock_irq() 함수 뿐만 아니라 spin_lock_irqsave() 함수로 임계 영역을 보호하는 기능을 지원합니다. 이번 소절에서는 spin_lock() 함수 기능을 확장한 스핀락 플러그인 함수를 소개합니다.  spin_lock_irqsave()  spin_unlock_irqrestore() 먼저 spin_lock_irqsave()/spin_unlock_restore() 함수를 리눅스 커널에서 지원하는 이유를 알아보고 세부 코드를 분석하겠습니다. spin_lock_irq() 함수를 써서 임계 영역 코드 구간을 보호하다 보니 다음과 같이 불편한 점이 생겼습니다.  spin_lock_irq() 함수를 호출한 후 인터럽트를 비활성화하다 보니 현재 인터럽트를 상태(활성화/