임베디드기사 실기 09 — 커널 프로그래밍 ① (시스템 콜·pthread·뮤텍스/세마포어/스핀락·교착상태)
임베디드기사 실기 09 — 커널 프로그래밍 ① (시스템 콜·pthread·뮤텍스/세마포어/스핀락·교착상태)
출제기준 3-2: 임베디드 커널 프로그래밍하기 (전반부)
뮤텍스 vs 세마포어는 2015와 2023에 똑같이 나왔고, 스핀락은 2025에 새로 등장했어요.
"소유권"이라는 단어 하나가 핵심입니다!
📎 필기 시리즈의 프로세스·스레드·동기화 편과 함께 보면 좋아요. (링크 추가 예정)
실기 출제 포인트 ⭐⭐⭐
| 키워드 | 핵심 내용 | 빈도 | 기출 |
| 시스템 콜 | 사용자 프로그램 ↔ 커널 인터페이스, 분류 | ⭐⭐⭐ | 2016 Q1, 2019 Q6, 2024 Q15 |
| 세마포어 | 정수 변수 S, P(wait)/V(signal) | ⭐⭐⭐ | 2018 Q12, 2022 Q4 |
| 뮤텍스 | 소유권 있음, 잠근 스레드만 해제 | ⭐⭐⭐ | 2015 Q7, 2016 Q9, 2023 Q14 |
| 스핀락 | busy waiting, 짧은 임계구역 | ⭐ | 2025 Q20 |
| 교착상태 | 4가지 발생 조건 | ⭐⭐ | 2017 Q15, 2024 Q6 |
| pthread API | create / join / detach / exit | ⭐⭐ | 2018 Q18 |
| 임계구역·상호배제 | 용어 정의 | ⭐⭐ | 2018 Q12 |
키워드 박스 — 답안에 반드시 들어가야 할 단어
시스템 콜 : 커널과 사용자 애플리케이션 사이의 인터페이스
뮤텍스 : 소유 가능, 소유주가 해제 책임 (Lock을 건 스레드만 Unlock)
세마포어 : 소유 불가(소유 개념 없음), 정수 S, P 연산(대기)/V 연산(신호)
스핀락 : Busy-waiting, Context Switching 없음, 짧은 대기에 유리
교착상태 : 상호 배제 / 점유와 대기 / 비선점 / 환형 대기
pthread_create : POSIX 스레드 생성 함수
시스템 콜 (System Call) ⭐⭐⭐
기출 (2016 Q1 = 2024 Q15 동일) 리눅스 계층구조 중 Kernel과 User Application 사이에 위치하는, 운영체제가 제공하는 인터페이스는?
→ System Call (시스템 콜)
User Application
↓ (시스템 콜 인터페이스)
System Call Handler
↓
Kernel
↓
Hardware
시스템 콜 분류
기출 (2019 Q6) 시스템 콜 서비스 중 (프로세스) 생성, 삭제 등을 수행하는 것은?
→ 프로세스 제어 (Process Control)
| 분류 | 역할 | 대표 시스템 콜 |
| 프로세스 제어 | 생성·종료·대기·로드 | fork(), exec(), exit(), wait(), kill() |
| 파일 조작 | 생성·삭제·열기·닫기·읽기·쓰기 | open(), close(), read(), write(), unlink() |
| 장치 관리 | 장치 요청·해제·제어 | ioctl() |
| 정보 유지 | 시간·프로세스 정보 조회 | getpid() 등 |
| 통신 | 프로세스 간 통신 | pipe(), socket() 등 |
⚠️ 함정: "생성·삭제"라는 단어가 파일 생성/삭제와 헷갈릴 수 있어요.
문제가 프로세스 생성·삭제를 말하는지, 파일 조작을 말하는지 먼저 확인!
스레드 생성 — pthread ⭐⭐
기출 (2018 Q18) POSIX 표준 환경에서 스레드를 생성할 때 사용하는 함수는?
→ pthread_create
#include <pthread.h>
void *worker(void *arg)
{
/* 스레드가 할 일 */
return NULL;
}
int main(void)
{
pthread_t tid;
pthread_create(&tid, NULL, worker, NULL); // 스레드 생성
pthread_join(tid, NULL); // 종료 대기
return 0;
}
// 컴파일: gcc -pthread main.c -o app
| 함수 | 기능 |
pthread_create |
스레드 생성 |
pthread_join |
스레드 종료를 기다림 |
pthread_detach |
스레드를 분리 (종료 시 자원 자동 회수) |
pthread_exit |
스레드 종료 |
pthread_cancel |
다른 스레드에 취소 요청 |
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
void *(*start_routine)(void *), void *arg);
// thread: 스레드 ID 저장 / attr: 속성(NULL=기본) / start_routine: 실행 함수 / arg: 전달 인자
동기화 기본 용어 ⭐⭐
기출 (2018 Q12) 스레드 간 동기화 기법 빈칸 A, B, C를 채우시오.
둘 이상의 스레드가 동시에 접근해서는 안 되는 공유 자원은 ( A )이다. 한 순간 공유 자원에 대해 하나의 프로세스만 접근하는 방법은 ( B )이다. 상호배제 기법 중 대기를 의미하는 P 연산과 진입을 의미하는 V 연산을 사용하는 것은 ( C )이다.
→ (A) 임계구역(Critical Section) / (B) 상호배제(Mutual Exclusion) / (C) 세마포어(Semaphore)
| 용어 | 정의 |
| 경쟁 상태 (Race Condition) | 여러 프로세스가 동시에 같은 데이터에 접근할 때 접근 순서에 따라 결과가 달라지는 현상 |
| 임계구역 (Critical Section) | 경쟁 상태가 발생할 수 있는 코드 영역 |
| 상호배제 (Mutual Exclusion) | 한 프로세스가 공유 자원을 쓰는 동안 다른 프로세스가 못 쓰게 제어 |
세마포어와 뮤텍스 ⭐⭐⭐
세마포어 (Semaphore)
기출 (2022 Q4) 상호 배제 기법 중 하나이며, 정수 값을 변수로 초기화하고 두 개의 연산으로만 접근 가능한 특수한 변수를 이용하는 것은?
→ 세마포어
세마포어 = 정수 변수 S (동시 접근 가능한 개수)
P(S) : S가 0보다 크면 S를 1 감소(진입), 아니면 대기 (wait)
V(S) : S를 1 증가시키고 대기 중인 프로세스를 깨움 (signal)
뮤텍스 (Mutex)
기출 (2016 Q9) 스레드 간 상호배제 구간을 정의하기 위한 동기화 객체는?
→ 뮤텍스 (Mutex, Mutual Exclusion)
#include <pthread.h>
pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_lock(&lock); // 임계구역 진입 전 Lock 획득
/* 공유 자원 접근 */
pthread_mutex_unlock(&lock); // 임계구역을 나올 때 Lock 반환 (Lock을 건 스레드가 해제)
뮤텍스 vs 세마포어 ⭐⭐⭐ (2015 Q7 = 2023 Q14 동일)
기출 뮤텍스와 세마포어의 차이점은?
모범 답안: 뮤텍스는 소유할 수 있고 소유주가 그에 대한 책임(잠근 스레드가 해제)을 가진다. 세마포어는 소유할 수 없고, 최대 허용치만큼 여러 스레드·프로세스의 접근을 허용하며 커널이 관리한다.
| 구분 | 뮤텍스 | 세마포어 |
| 소유권 | 있음 (Lock 건 스레드가 Unlock) | 없음 |
| 값 | 0/1 (잠김/풀림) | 정수 S (여러 개 허용 가능) |
| 용도 | 상호배제 (한 번에 하나) | 접근 허용 개수 제어, 순서 동기화 |
| 접근 | 객체(Key)를 소유한 쪽만 | 최대 허용치만큼 동시 접근 |
⚠️ 함정
- 서술형은 "소유 가능 여부"가 채점 포인트 → 반드시 소유권 문장을 쓰기
- 세마포어를 값이 1인 이진 세마포어로 쓰면 뮤텍스처럼 동작하지만, 소유권 개념은 없다
- 뮤텍스 = 상호배제 객체 / 세마포어 = 신호·개수 제어, 용도로도 구분
스핀락 (Spinlock) ⭐
기출 (2025 Q20) 빈칸 선택: 스핀락이란 특정 자원에 대한 접근을 제어하기 위한 동기화 기법으로 (Sleep / Busy-waiting) 형태로 동작한다. 자원이 해제될 때까지 루프를 돌며 상태를 확인하기 때문에 Context Switching이 (발생하고 / 발생하지 않고), 대기 시간이 짧은 경우에 Mutex보다 오버헤드가 (크다 / 작다).
→ Busy-waiting / 발생하지 않고 / 작다
| 구분 | 스핀락 | 뮤텍스 |
| 대기 방식 | Busy-waiting (루프를 돌며 확인) | Sleep (대기 큐에서 잠듦) |
| 문맥 교환 | 발생하지 않음 | 발생 |
| 유리한 상황 | 대기 시간이 짧을 때 | 대기 시간이 길 때 |
| CPU 사용 | 대기 중에도 계속 사용 | 대기 중 CPU 양보 |
⚠️ 스핀락은 오래 기다리면 CPU를 낭비해요.
그래서 "짧은 임계구역"에서만 유리하다는 조건을 같이 기억하세요.
참고: 같은 동기화 계열인 Completion 변수(wait_for_completion / complete)는 7편에서 정리했어요.
교착상태 (Deadlock) ⭐⭐
기출 (2017 Q15) 교착상태가 발생할 수 있는 4가지 조건은?
→ 상호 배제 / 점유와 대기 / 비선점 / 환형 대기
| 조건 | 설명 |
| 상호 배제 (Mutual Exclusion) | 자원을 한 번에 한 프로세스만 사용 |
| 점유와 대기 (Hold and Wait) | 자원을 가진 채 다른 자원을 기다림 |
| 비선점 (No Preemption) | 다른 프로세스의 자원을 강제로 빼앗을 수 없음 |
| 환형 대기 (Circular Wait) | 프로세스들이 원형으로 서로의 자원을 기다림 |
기출 (2024 Q6) 프로세스가 어떤 자원을 할당받은 상태에서 다른 자원을 기다리는 상태는?
→ 점유 대기 (Hold and Wait)
교착상태는 4가지 조건이 "모두 동시에" 성립해야 발생
→ 하나라도 깨면 예방 가능
예) 모든 스레드가 락을 항상 같은 순서로 획득 → 환형 대기 조건 제거
⚠️ 함정: 4가지 중 하나만 써도 부분 점수일 수 있어요.
4개를 모두 정확한 용어로 쓰고, "점유 대기"와 "환형 대기"를 구분하세요.
기출 문제 모음
Q. Kernel과 User Application 사이에 위치하는 운영체제 제공 인터페이스는? (2016·2024)
A. System Call
Q. 시스템 콜 서비스 중 프로세스 생성·삭제를 수행하는 분류는? (2019 Q6)
A. 프로세스 제어
Q. POSIX에서 스레드를 생성하는 함수는? (2018 Q18)
A. pthread_create
Q. 정수 변수와 P·V 연산만으로 접근하는 상호배제 기법은? (2022 Q4)
A. 세마포어
Q. 뮤텍스와 세마포어의 차이점은? (2015·2023)
A. 뮤텍스는 소유할 수 있고 소유주가 책임을 지며, 세마포어는 소유할 수 없다.
Q. 스핀락의 대기 방식은? (2025 Q20)
A. Busy-waiting (문맥 교환 없음, 짧은 대기에 유리)
Q. 교착상태의 4가지 조건은? (2017 Q15)
A. 상호 배제, 점유와 대기, 비선점, 환형 대기
💡 실무에서는?
- 시스템 콜 추적 — 서버 장애 분석에서
strace로 프로세스가 호출하는 시스템 콜을 따라가면 어디서 멈췄는지 바로 보여요. - 락 경합과 교착 — 애플리케이션이 멈췄을 때 스레드 덤프나
gdb로 락 대기 상태를 확인하는 게 교착상태 진단의 시작이에요. 락 획득 순서를 통일하는 것이 가장 흔한 예방책입니다. - 스핀락 vs 뮤텍스 — 커널 내부, 인터럽트 컨텍스트처럼 잠들 수 없는 곳에서는 스핀락이 쓰이고, 사용자 공간에서는 뮤텍스가 일반적입니다.
- 프로세스 관리 —
fork()/exec()로 프로세스가 만들어지는 흐름을 알면 좀비 프로세스나 리소스 누수를 이해하기 쉬워요.
핵심 정리
✅ 시스템 콜 = 커널과 사용자 프로그램 사이 인터페이스 / 분류: 프로세스 제어·파일 조작·장치 관리 …
✅ pthread_create(생성) / pthread_join(대기) / pthread_detach / pthread_exit
✅ 임계구역 = 경쟁 상태 발생 코드 영역 / 상호배제 = 한 번에 하나만 접근
✅ 세마포어 = 정수 S, P(wait)/V(signal), 소유권 없음
✅ 뮤텍스 = 소유권 있음, 잠근 쪽이 해제 → 뮤텍스 vs 세마포어 = "소유 가능 여부"
✅ 스핀락 = Busy-waiting, 문맥 교환 없음, 짧은 대기에 오버헤드 작음
✅ 교착상태 4조건 = 상호 배제 / 점유와 대기 / 비선점 / 환형 대기
다음 편에서는 커널 프로그래밍 ② 메모리·파일시스템·소켓(출제기준 3-2)으로 이어갑니다!
궁금한 점은 댓글로 남겨주세요!