용어 요약 (Glossary)
리눅스 커널 핵심 용어를 간결하게 정리한 용어집입니다. 알파벳/가나다 순으로 분류하여 빠르게 참조할 수 있습니다.
일반 (General)
ABI (Application Binary Interface)
컴파일된 바이너리가 커널 또는 라이브러리와 상호작용하는 인터페이스 규약. 레지스터 사용, 호출 규약, 구조체 레이아웃 등을 정의한다. 커널은 사용자 공간 ABI의 하위 호환성을 엄격히 유지한다.
ACPI (Advanced Configuration and Power Interface)
OS가 하드웨어 구성, 전원 관리, 열 관리 등을 제어할 수 있도록 하는 펌웨어 표준. DSDT/SSDT 테이블에 AML 바이트코드로 하드웨어 정보를 기술한다. → UEFI 심화
API (Application Programming Interface)
소스 코드 수준의 인터페이스 규약. 커널 내부 API(드라이버 작성용)와 사용자 공간 API(시스템 콜)로 구분된다. 커널 내부 API는 버전 간 변경될 수 있으나, 사용자 공간 API(syscall)는 절대 깨뜨리지 않는다.
Device Tree
하드웨어 구성 정보를 기술하는 데이터 구조. 주로 ARM/RISC-V에서 사용하며, .dts 소스를 dtc로 컴파일하여 .dtb 바이너리를 생성한다. 부트로더가 커널에 전달한다. → 디바이스 드라이버
GPL (GNU General Public License)
리눅스 커널이 채택한 오픈소스 라이선스 (GPLv2). 커널 소스를 수정·배포할 때 소스 코드를 공개해야 한다. MODULE_LICENSE("GPL")을 선언해야 GPL 전용 심볼을 사용할 수 있다.
Kconfig
커널 빌드 설정 시스템. Kconfig 파일에 설정 옵션을 정의하고 make menuconfig 등으로 .config를 생성한다. CONFIG_* 매크로로 조건부 컴파일을 제어한다. → 빌드 시스템
Kernel
운영체제의 핵심 구성 요소로, 하드웨어 자원 관리와 사용자 프로그램에 서비스를 제공하는 소프트웨어. 리눅스 커널은 모놀리식(monolithic) 구조이며, 모듈로 기능을 동적 확장할 수 있다. → 커널 아키텍처
Kernel Space / User Space
CPU 특권 모드로 분리된 두 가지 실행 환경. 커널 공간은 ring 0(x86) 또는 EL1(ARM64)에서 모든 하드웨어에 접근 가능하고, 사용자 공간은 ring 3/EL0에서 시스템 콜을 통해서만 커널 서비스를 요청한다.
LTS (Long Term Support)
장기 지원 커널 버전. 일반 커널이 약 2~3개월 지원되는 것과 달리 LTS는 2~6년간 보안·버그 수정 패치를 받는다. 임베디드·서버 환경에서 주로 채택한다.
Mainline
Linus Torvalds가 관리하는 공식 커널 소스 트리. 모든 커널 개발은 mainline에 통합(merge)되는 것을 목표로 한다. git.kernel.org에서 관리된다.
Makefile
Kbuild 시스템의 빌드 규칙 파일. 각 디렉토리의 Makefile에서 obj-y, obj-m 변수로 빌드 대상을 지정한다. → 빌드 시스템
Microkernel
최소한의 기능(IPC, 스케줄링, 메모리 관리)만 커널에 두고 나머지를 사용자 공간 서버로 분리하는 설계. Mach, L4, QNX 등이 해당한다. 리눅스는 모놀리식이지만 모듈 시스템으로 유연성을 제공한다.
Monolithic Kernel
모든 커널 서비스(드라이버, 파일시스템, 네트워크 등)가 하나의 주소 공간에서 실행되는 설계. 리눅스가 이 구조를 채택하고 있으며, 함수 호출로 통신하므로 마이크로커널 대비 성능이 유리하다.
Patch
소스 코드 변경 사항을 기술한 diff 형식의 파일. 커널 개발에서는 git format-patch로 패치를 생성하고 메일링 리스트에 제출한다. → 개발 도구
POSIX (Portable Operating System Interface)
IEEE가 정의한 유닉스 호환 OS 표준 인터페이스. 리눅스는 POSIX를 대부분 준수하지만 공식 인증을 받지는 않았다. 시스템 콜, 시그널, 스레드 API 등이 POSIX 기반이다.
System Call (시스템 콜)
사용자 공간 프로그램이 커널 서비스를 요청하는 인터페이스. x86_64에서 syscall 명령어로 진입하며, sys_call_table에서 핸들러를 찾아 실행한다. read(), write(), ioctl() 등이 대표적이다. → 커널 아키텍처
메모리 (Memory)
Copy-on-Write (COW)
fork() 시 부모·자식 프로세스가 동일한 물리 페이지를 공유하다가, 한쪽이 쓰기를 시도하면 그때서야 페이지를 복사하는 기법. 메모리 사용량과 fork 오버헤드를 크게 줄인다.
Huge Pages
기본 4KB보다 큰 페이지 크기(2MB, 1GB)를 사용하여 TLB 미스를 줄이는 기법. hugetlbfs로 명시적으로 사용하거나, THP(Transparent Huge Pages)로 자동 적용할 수 있다. → 메모리 관리
kmalloc / vmalloc
kmalloc()은 물리적으로 연속된 메모리를 할당(Slab 할당자 사용). vmalloc()은 가상 주소 공간에서만 연속인 메모리를 할당한다. DMA가 필요하면 kmalloc, 큰 버퍼가 필요하면 vmalloc을 사용한다. → 메모리 관리
Memory Barrier (메모리 배리어)
CPU의 메모리 접근 순서를 보장하는 명령어. SMP 환경에서 다른 CPU가 메모리 변경을 올바른 순서로 관찰하도록 강제한다. mb(), rmb(), wmb(), smp_mb() 등이 있다. → Atomic 연산
mmap
파일이나 디바이스를 프로세스의 가상 주소 공간에 매핑하는 시스템 콜. 파일 I/O 없이 메모리 접근으로 읽기/쓰기가 가능하며, 공유 메모리(IPC), 익명 매핑 등에도 사용된다.
NUMA (Non-Uniform Memory Access)
멀티소켓 시스템에서 CPU마다 로컬 메모리를 갖는 아키텍처. 로컬 노드 접근이 원격 노드보다 빠르므로 메모리 할당 정책이 성능에 큰 영향을 미친다. → NUMA 심화
OOM Killer
시스템 메모리가 완전히 고갈되었을 때 커널이 프로세스를 강제 종료하여 메모리를 회수하는 메커니즘. oom_score에 따라 종료 대상을 선정한다. /proc/<pid>/oom_score_adj로 우선순위를 조정할 수 있다.
Page (페이지)
가상 메모리의 최소 관리 단위. x86_64에서 기본 4KB. 커널은 struct page로 각 물리 페이지를 추적하며, Buddy Allocator로 할당·해제한다. → 메모리 관리
Page Table (페이지 테이블)
가상 주소를 물리 주소로 변환하는 다단계 매핑 테이블. x86_64는 4~5단계(PGD → P4D → PUD → PMD → PTE), ARM64는 최대 4단계를 사용한다. 커널은 프로세스마다 별도의 페이지 테이블을 관리한다.
Slab Allocator
동일 크기 객체를 효율적으로 할당·해제하는 캐시 기반 메모리 할당자. 내부 단편화를 줄이고 생성/소멸 비용을 낮춘다. 리눅스는 SLUB이 기본이며 SLAB, SLOB(제거됨)도 있었다. → 메모리 관리
TLB (Translation Lookaside Buffer)
페이지 테이블 조회 결과를 캐싱하는 CPU 하드웨어. TLB 미스가 발생하면 페이지 테이블 워크가 필요하므로 성능이 저하된다. 컨텍스트 스위칭 시 TLB 플러시가 발생할 수 있다.
Virtual Memory (가상 메모리)
각 프로세스에게 독립된 주소 공간을 제공하는 메모리 관리 기법. MMU가 가상 주소를 물리 주소로 변환하며, 이를 통해 메모리 보호, 페이지 스왑, 메모리 매핑 등이 가능하다. → 메모리 관리
ZONE_DMA / ZONE_NORMAL / ZONE_HIGHMEM
물리 메모리를 용도별로 나눈 영역. ZONE_DMA는 ISA DMA 제약(16MB 이하), ZONE_NORMAL은 커널이 직접 매핑하는 영역, ZONE_HIGHMEM은 32비트에서 896MB 이상 메모리(64비트에서는 불필요). → 메모리 관리
프로세스 / 스케줄링 (Process / Scheduling)
Context Switch (컨텍스트 스위칭)
CPU가 현재 실행 중인 태스크의 상태(레지스터, 스택 포인터 등)를 저장하고 다른 태스크의 상태를 복원하여 실행을 전환하는 과정. 오버헤드가 있으므로 최소화가 성능 최적화의 핵심이다. → 프로세스 관리
Nice / Priority
프로세스 스케줄링 우선순위. nice 값은 -20(최고)~19(최저)이며, CFS에서 vruntime 증가 속도에 영향을 준다. 실시간 프로세스는 별도의 rt_priority(1~99)를 사용한다.
PID / TGID
PID는 각 태스크(스레드)의 고유 식별자, TGID(Thread Group ID)는 스레드 그룹의 대표 PID(= 메인 스레드의 PID). 사용자 공간에서 getpid()는 TGID를, gettid()는 PID를 반환한다.
Preemption (선점)
실행 중인 태스크를 중단하고 더 높은 우선순위의 태스크를 실행하는 것. 커널 설정에 따라 PREEMPT_NONE(서버용), PREEMPT_VOLUNTARY, PREEMPT(데스크탑/RT)으로 선점 수준을 조절한다.
Process (프로세스)
실행 중인 프로그램의 인스턴스. 독립된 가상 주소 공간, 파일 디스크립터 테이블, 시그널 핸들러 등을 갖는다. fork()로 생성하고 exec()로 새 프로그램을 로드한다. → 프로세스 관리
Runqueue
CPU별로 실행 가능한 태스크를 관리하는 자료구조(struct rq). CFS의 경우 레드-블랙 트리로 태스크를 vruntime 순으로 정렬하여 다음 실행 태스크를 O(1)에 선택한다.
Scheduler (스케줄러) — CFS / EEVDF
어떤 태스크를 언제 CPU에서 실행할지 결정하는 커널 서브시스템. CFS(Completely Fair Scheduler)는 vruntime 기반 공정 스케줄링을 제공하며, 6.6부터 EEVDF(Earliest Eligible Virtual Deadline First)로 대체되었다. → 프로세스 관리
Signal (시그널)
프로세스에 비동기 이벤트를 통지하는 메커니즘. SIGKILL(강제 종료), SIGTERM(종료 요청), SIGSEGV(세그멘테이션 폴트) 등이 있다. kill() 시스템 콜 또는 커널 내부에서 전달된다.
Task (task_struct)
커널이 프로세스/스레드를 나타내는 핵심 자료구조. 스케줄링 정보, 메모리 디스크립터, 파일 테이블, 시그널 정보 등을 포함한다. 모든 태스크는 task_struct로 관리된다. → 프로세스 관리
Thread (스레드)
같은 주소 공간을 공유하는 실행 흐름. 리눅스에서는 clone() 시스템 콜로 생성하며, 프로세스와 동일하게 task_struct로 표현된다(1:1 스레딩 모델).
Wait Queue
특정 조건이 충족될 때까지 태스크를 대기(sleep)시키는 메커니즘. wait_event() / wake_up() 쌍으로 사용한다. I/O 완료 대기, 리소스 가용 대기 등에 널리 쓰인다.
동기화 (Synchronization)
Atomic Operations (원자적 연산)
CPU 수준에서 분할 불가능한 연산. atomic_t 타입과 atomic_add(), atomic_cmpxchg() 등의 함수로 잠금 없이 변수를 안전하게 조작한다. 참조 카운팅에 주로 사용된다. → Atomic 연산
Deadlock (교착 상태)
두 개 이상의 태스크가 서로가 가진 잠금을 기다리며 무한 대기에 빠지는 상태. 잠금 획득 순서를 일관되게 유지하면 예방할 수 있다. lockdep으로 런타임 감지가 가능하다. → 디버깅
Lock Contention
여러 CPU/스레드가 동일한 잠금을 획득하려 경쟁하는 상황. 높은 contention은 심각한 성능 저하를 유발한다. per-CPU 변수, RCU, 세분화된 잠금(fine-grained locking)으로 완화한다.
Memory Ordering
멀티프로세서 환경에서 메모리 연산의 관찰 순서를 제어하는 규칙. acquire/release 시맨틱, 메모리 배리어, READ_ONCE()/WRITE_ONCE()로 컴파일러·CPU 재정렬을 방지한다. → Atomic 연산
Mutex
상호 배제(mutual exclusion) 잠금. 경쟁 시 태스크를 sleep 시키므로 인터럽트 컨텍스트에서 사용 불가. spinlock보다 오래 유지하는 잠금에 적합하다. → 동기화 기법
Per-CPU Variables
CPU마다 별도 복사본을 유지하는 변수. 잠금 없이 접근 가능하므로 캐시 바운싱과 lock contention을 제거한다. DEFINE_PER_CPU(), get_cpu_var()로 사용한다.
RCU (Read-Copy-Update)
읽기 측이 잠금 없이 접근하고, 쓰기 측이 복사본을 수정한 뒤 grace period 후 이전 데이터를 해제하는 동기화 기법. 읽기 빈도가 높은 자료구조(라우팅 테이블, 프로세스 리스트)에 최적이다. → RCU 심화
RW Lock (Read-Write Lock)
다수의 읽기와 단일 쓰기를 구분하여 동시성을 높이는 잠금. 읽기가 많은 경우 성능이 좋지만, 쓰기 기아(starvation) 문제가 있다. 커널에서는 rwlock_t와 rwsem이 있다. → 동기화 기법
Semaphore
카운팅 기반 동기화 프리미티브. 지정된 수만큼 동시 접근을 허용한다. 커널에서는 대부분 mutex로 대체되었으며, 특수한 경우(제한된 리소스 풀)에만 사용한다. → 동기화 기법
Seqlock
시퀀스 카운터 기반 잠금으로, 쓰기 측이 카운터를 증가시키고 읽기 측이 카운터 변화를 감지하여 재시도하는 방식. 쓰기가 드물고 읽기가 빈번한 경우에 적합하다. jiffies 업데이트에 사용된다. → 동기화 기법
Spinlock
잠금을 획득할 때까지 CPU가 루프를 돌며 대기하는 잠금. 짧은 임계 영역에 적합하며, 인터럽트 컨텍스트에서도 사용 가능하다. spin_lock_irqsave()로 인터럽트와 함께 보호할 수 있다. → 동기화 기법
파일시스템 (Filesystem)
Block Device (블록 디바이스)
고정 크기 블록 단위로 데이터를 읽고 쓰는 디바이스. 하드 디스크, SSD, NVMe 등이 해당한다. 블록 I/O 레이어(struct bio)를 통해 요청이 처리된다.
Btrfs
B-tree 기반의 차세대 리눅스 파일시스템. COW, 스냅샷, 내장 RAID, 서브볼륨, 온라인 디프래그, 압축 등을 지원한다. 엔터프라이즈·데스크탑 모두에서 사용이 증가하고 있다.
Dentry
디렉토리 엔트리(Directory Entry)를 표현하는 VFS 객체. 파일 이름과 inode의 매핑을 캐싱하여 경로 해석(path lookup)을 가속한다. dcache에 LRU 방식으로 캐싱된다. → VFS
ext4
리눅스의 사실상 표준 파일시스템. 저널링, 익스텐트 기반 할당, 지연 할당(delayed allocation), 다중 블록 할당 등을 지원한다. 최대 1EB 볼륨, 16TB 파일 크기를 지원한다.
File Descriptor (파일 디스크립터)
프로세스가 열린 파일을 참조하는 정수 핸들. 프로세스별 files_struct의 fd 테이블에서 struct file을 가리킨다. 0(stdin), 1(stdout), 2(stderr)이 기본 할당된다.
Inode
파일의 메타데이터(권한, 크기, 타임스탬프, 데이터 블록 위치)를 저장하는 자료구조. 파일 이름은 dentry가, 실제 데이터 위치는 inode가 관리한다. → inode 구조
Page Cache
디스크에서 읽은 파일 데이터를 메모리에 캐싱하는 계층. 동일 파일의 반복 읽기 성능을 크게 향상시킨다. read()/write() 시 커널이 자동으로 관리한다.
procfs
/proc에 마운트되는 가상 파일시스템. 프로세스 정보(/proc/<pid>), 커널 매개변수(/proc/sys), 하드웨어 정보 등을 파일 형태로 노출한다. → procfs/sysfs
Superblock
마운트된 파일시스템의 전체 메타데이터(블록 크기, inode 수, 마운트 옵션 등)를 담는 VFS 객체. 각 마운트 포인트마다 하나의 struct super_block이 존재한다. → VFS
sysfs
/sys에 마운트되는 가상 파일시스템. 커널 객체(디바이스, 드라이버, 버스)의 속성을 파일로 노출한다. kobject 계층 구조를 반영한다. → procfs/sysfs
tmpfs
메모리(RAM) 기반의 임시 파일시스템. /tmp, /run 등에 사용되며, 디스크 I/O 없이 빠르다. 시스템 재부팅 시 데이터가 사라진다. swap을 사용할 수 있어 물리 메모리 이상을 저장 가능하다.
VFS (Virtual Filesystem Switch)
다양한 파일시스템(ext4, Btrfs, NFS 등)을 통합하는 추상화 계층. superblock, inode, dentry, file 네 가지 핵심 객체로 구성된다. 사용자 공간은 파일시스템 종류에 관계없이 동일한 API를 사용한다. → VFS
네트워킹 (Networking)
BPF / eBPF
커널 내에서 안전하게 실행되는 프로그래밍 프레임워크. 원래 패킷 필터링(Berkeley Packet Filter)에서 출발하여, 현재는 네트워킹, 보안, 트레이싱, 스케줄링 등 범용으로 확장되었다. verifier가 안전성을 보증한다. → BPF/XDP
iptables / nftables
Netfilter 프레임워크 기반의 패킷 필터링·NAT 도구. iptables는 레거시, nftables는 후속 도구로 통합된 문법과 더 나은 성능을 제공한다. → 네트워크 스택
Netfilter
커널 네트워크 스택의 훅(hook) 포인트에서 패킷을 가로채 처리하는 프레임워크. 방화벽, NAT, 패킷 맹글링 등에 사용된다. PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING 5개 훅을 제공한다. → 네트워크 스택
Network Namespace
네트워크 스택(인터페이스, 라우팅 테이블, 방화벽 규칙)을 격리하는 네임스페이스. 컨테이너 네트워킹의 기반이 된다. ip netns로 관리한다. → 네임스페이스
Routing Table
패킷의 목적지 주소에 따라 다음 홉(next hop)과 출력 인터페이스를 결정하는 테이블. FIB(Forwarding Information Base)로 구현되며, 정책 라우팅과 ECMP를 지원한다. → 라우팅
sk_buff
커널 네트워크 스택에서 패킷 데이터를 담는 핵심 자료구조. 헤더 조작을 위한 push/pull 연산, 비선형 데이터(frag_list, skb_shared_info)를 지원한다. → sk_buff 심화
Socket (소켓)
네트워크 통신의 끝점(endpoint). AF_INET(IPv4), AF_INET6(IPv6), AF_UNIX(로컬 IPC) 등의 주소 패밀리와 SOCK_STREAM(TCP), SOCK_DGRAM(UDP) 등의 타입으로 구분된다. → 네트워크 스택
TCP/IP Stack
리눅스 커널의 네트워크 프로토콜 스택. L2(이더넷) → L3(IP) → L4(TCP/UDP) 계층으로 패킷을 처리한다. NAPI로 수신 성능을 최적화하고, GRO/GSO로 세그멘테이션 오프로딩을 지원한다. → 네트워크 스택
XDP (eXpress Data Path)
네트워크 드라이버 수준에서 eBPF 프로그램으로 패킷을 초고속 처리하는 프레임워크. 소켓 버퍼 할당 전에 동작하여 DDoS 방어, 로드 밸런싱 등에 극도로 낮은 지연을 달성한다. → BPF/XDP
디바이스 (Devices)
Bus (PCI, USB, I2C, SPI)
디바이스와 CPU 사이의 통신 경로. 각 버스는 커널에서 struct bus_type으로 표현되며, 디바이스 열거(enumeration)와 드라이버 매칭을 담당한다. → 디바이스 드라이버
Character / Block / Network Device
커널 디바이스의 세 가지 분류. Character: 바이트 스트림 접근(터미널, 시리얼). Block: 블록 단위 접근(디스크). Network: 패킷 기반(NIC). 각각 다른 서브시스템으로 관리된다. → 디바이스 드라이버
Device Driver (디바이스 드라이버)
하드웨어 장치를 제어하는 커널 코드. 하드웨어 추상화를 제공하여 사용자 공간에서 표준 인터페이스(open, read, write, ioctl)로 장치에 접근할 수 있게 한다. → 디바이스 드라이버
DMA (Direct Memory Access)
CPU 개입 없이 디바이스가 직접 메모리에 읽기/쓰기하는 메커니즘. CPU 부하를 줄이고 데이터 전송 속도를 높인다. 커널은 DMA 매핑 API(dma_map_single() 등)를 제공한다. → 디바이스 드라이버
Firmware
하드웨어 디바이스에 로드되는 바이너리 코드. 커널은 request_firmware()로 /lib/firmware/에서 펌웨어를 로드하여 디바이스에 전달한다. Wi-Fi, GPU 등 많은 장치가 펌웨어를 필요로 한다.
IRQ (Interrupt Request)
하드웨어 디바이스가 CPU에 비동기 이벤트를 알리는 메커니즘. request_irq()로 핸들러를 등록하며, top half(즉시 처리)와 bottom half(지연 처리)로 나누어 처리한다. → 인터럽트
MMIO (Memory-Mapped I/O)
디바이스 레지스터를 메모리 주소 공간에 매핑하여 일반 메모리 읽기/쓰기 명령으로 접근하는 방식. ioremap()으로 물리 주소를 가상 주소에 매핑한 뒤 readl()/writel()로 접근한다.
Platform Device
PCI/USB 같은 자동 열거 버스에 연결되지 않는 SoC 내장 디바이스. Device Tree 또는 ACPI로 기술하며, platform_driver로 드라이버를 등록한다. → 디바이스 드라이버