1급 시험은 명령어 암기가 아니라 "왜 이 명령어가 이렇게 동작하는가"를 커널 수준에서 묻는다. 그 출발점이 운영체제의 정의다.
open()·read()·write() 표준 인터페이스만 호출하면 운영체제가 실제 하드웨어를 다룬다.| 자원 | 관리 주체(커널 서브시스템) | 핵심 기능 |
|---|---|---|
| CPU | 프로세스 스케줄러 | 어느 프로세스를 언제 얼마나 실행할지 결정 |
| 메모리 | 메모리 관리자(MMU 활용) | 가상 메모리, 페이징, 스왑 |
| 저장장치 | 파일시스템 / 블록 I/O 계층 | 파일·디렉터리 추상화, 디스크 스케줄링 |
| 입출력 장치 | 디바이스 드라이버 | 키보드·네트워크·디스크 등 하드웨어 제어 |
| 네트워크 | 네트워크 스택(TCP/IP) | 패킷 송수신, 소켓 인터페이스 |
💡 개념: 운영체제의 4대 핵심 기능은 프로세스 관리, 메모리 관리, 파일 관리, 장치(I/O) 관리다. 여기에 사용자 인터페이스(셸/GUI)와 보안·권한 관리를 더해 6대 기능으로 보기도 한다. 1급 시험에서는 각 기능을 담당하는 커널 서브시스템과 묶어서 묻는 경우가 많다.
| 모드 | 링 | 권한 | 실행 주체 |
|---|---|---|---|
| 커널 모드(특권 모드) | Ring 0 | 모든 CPU 명령·메모리 영역 접근 가능 | 커널 코드 |
| 사용자 모드(비특권 모드) | Ring 3 | 제한된 명령만 실행 가능 | 일반 응용 프로그램 |
# strace로 프로그램이 호출하는 시스템 콜을 직접 관찰해보자
strace -c ls /tmp
# write, read, openat, close, mmap 등 시스템 콜 통계가 출력된다ls 같은 단순한 명령조차 수십 개의 시스템 콜(openat, read, write, close, stat 등)을 호출한다.🔍 더 깊이: 시스템 콜은 단순한 함수 호출이 아니다. CPU가 특권 수준을 Ring 3에서 Ring 0으로 올리는 하드웨어 이벤트다. 과거에는
int 0x80소프트웨어 인터럽트를 사용했지만, 현대 x86-64 리눅스는 더 빠른syscall명령어를 사용한다. 이 전환 비용 때문에 고성능 프로그램은 시스템 콜 횟수를 줄이려고 버퍼링을 활용한다.
커널 설계에는 크게 두 철학이 있고, 1급 시험에 자주 출제된다.
| 구분 | 모놀리식 커널 | 마이크로커널 |
|---|---|---|
| 구성 | 파일시스템·드라이버·네트워크 스택·스케줄러를 하나의 커널 공간(단일 주소 공간)에 넣음 | 커널은 최소한(IPC, 기본 스케줄링, 메모리 관리)만. 파일시스템·드라이버는 사용자 공간의 별도 서비스 |
| 통신 방식 | 함수 호출 | 서비스 간 메시지 전달(IPC) |
| 장점 | 빠르다 | 안정성·모듈성이 높다 |
| 단점 | 한 부분의 버그가 전체 커널을 죽임, 코드가 거대해짐 | IPC 오버헤드로 느릴 수 있음 |
| 대표 예 | 리눅스 | 미닉스(MINIX), GNU Hurd |
lsmod # 현재 적재된 커널 모듈 목록
modinfo e1000 # 특정 모듈의 정보 확인
sudo modprobe vfat # 모듈 적재(의존성 자동 해결)
sudo rmmod vfat # 모듈 제거
uname -r # 실행 중인 커널 버전 확인📚 유래/사례: 1992년, 미닉스의 저자 앤드루 타넨바움 교수와 리누스 토르발스 사이에 "모놀리식 커널은 구식이다 vs 마이크로커널은 너무 느리다"를 둘러싼 유명한 논쟁(Tanenbaum–Torvalds debate)이 Usenet에서 벌어졌다. 타넨바움은 "리눅스는 구식 설계"라고 비판했지만, 결과적으로 모놀리식 리눅스가 세상을 지배했다. 실용성이 학문적 우아함을 이긴 사례로 자주 인용된다.
ls -l을 입력하면 셸이 해석 → 적절한 프로그램을 찾아 실행 → 결과를 사용자에게 보여준다.| 셸 | 개발자/유래 | 특징 |
|---|---|---|
| sh (Bourne Shell) | Stephen Bourne (1977) | 최초의 유닉스 표준 셸, 스크립트의 원형 |
| csh (C Shell) | Bill Joy | C 언어 문법 차용, 히스토리·별칭 도입 |
| ksh (Korn Shell) | David Korn | sh 호환 + csh 기능 통합 |
| bash (Bourne Again Shell) | Brian Fox (GNU) | sh의 확장판, 리눅스 기본 셸 |
| zsh | Paul Falstad | bash 호환 + 강력한 자동완성 |
| tcsh | csh 확장 | csh + 명령행 편집 |
echo $SHELL # 현재 로그인 셸 확인
cat /etc/shells # 시스템에 등록된 사용 가능한 셸 목록
chsh -s /bin/zsh # 로그인 셸을 zsh로 변경 (/etc/passwd 갱신)
echo $0 # 현재 실행 중인 셸 이름/etc/passwd의 마지막 필드에 기록된다.user:x:1000:1000:User:/home/user:/bin/bash → 맨 끝 /bin/bash가 그 사용자의 로그인 셸.⚠️ 함정: 시험에서 "기본 셸을 변경하는 명령"으로
chsh를 묻는데, 이때 변경된 셸은/etc/shells에 등록된 셸이어야 한다. 또한chsh는 즉시 적용되지 않고 다음 로그인부터 반영된다. 현재 세션에서 즉시 다른 셸을 쓰려면 그냥 셸 이름(zsh)을 입력해 하위 셸을 실행하면 된다.
사용자가 ls를 입력하면 셸은 다음 단계를 거친다. 이 과정이 운영체제의 프로세스 생성 메커니즘을 그대로 보여준다.
*)·변수($HOME)·따옴표를 확장한다.execve() 시스템 콜로 자신의 메모리 이미지를 ls 프로그램으로 교체한다.fork-exec-wait 모델은 유닉스의 가장 우아한 설계 중 하나다 — "복제 후 교체"라는 두 단계로 모든 프로그램 실행이 이루어진다.🔍 더 깊이: 명령어 뒤에
&를 붙이면(sleep 100 &) 셸이wait()를 하지 않고 즉시 프롬프트를 돌려준다. 이것이 백그라운드 실행이다. 반대로wait를 하는 동안 부모가 죽으면 자식은 **고아 프로세스(orphan)**가 되어 init(PID 1)에게 입양된다. 자식이 죽었는데 부모가 종료 상태를 회수하지 않으면 **좀비 프로세스(zombie)**가 된다.
유닉스가 후대에 남긴 가장 큰 유산은 코드가 아니라 철학이다.
# 작은 도구들을 파이프(|)로 연결해 복잡한 작업을 수행
cat /etc/passwd | grep "/bin/bash" | wc -l
# passwd 출력 → bash 셸 사용자만 필터 → 줄 수 세기cat, grep, wc)는 한 가지 일만 하지만, 파이프로 엮으면 "bash 셸을 쓰는 사용자 수 세기"라는 새 작업이 만들어진다. 이것이 유닉스 철학의 정수다.📚 유래/사례: 유닉스(UNIX)라는 이름은 그 전신인 MULTICS(Multiplexed Information and Computing Service)를 비꼰 말장난이다. MULTICS가 너무 복잡하고 거대했던 데 대한 반작용으로, 단순함을 추구한다는 의미에서 "UNICS(Uniplexed)"라 불렀고 이것이 UNIX가 되었다. 단순함을 향한 의지가 이름에 새겨진 것이다.
"Hello everybody out there ... I'm doing a (free) operating system (just a hobby, won't be big and professional like gnu) ..."
💡 개념: 엄밀히 말하면 "리눅스"는 커널만을 가리킨다. 우리가 설치해서 쓰는 우분투·CentOS 같은 것은 리눅스 커널 + GNU 도구 + 패키지 관리자 + 응용 프로그램을 묶은 **배포판(distribution)**이다. 시험에서 "리눅스는 ( )이다"라는 빈칸에는 "커널"이 정답인 경우가 많다.
다음 시간에는 리눅스를 자유롭게 만든 라이선스와, 그 결과 갈라진 배포판 계열들을 살펴본다.
lsmod·modprobe로 다룬다.선택지를 클릭하면 정답·해설이 펼쳐집니다.
문제 1
운영체제에서 사용자 모드의 프로그램이 디스크 입출력이나 네트워크 통신 같은 특권 작업을 수행하기 위해 커널에 요청하는 메커니즘은 무엇인가?
문제 2
리눅스 커널의 설계 방식과 그 특징에 대한 설명으로 가장 옳은 것은?
문제 3
셸이 사용자가 입력한 명령어 `ls`를 실행할 때 거치는 유닉스의 표준 프로세스 생성 모델 순서로 옳은 것은?
문제 4
다음 중 리눅스의 기본 로그인 셸이며 그 이름이 "Bourne Again Shell"의 약자인 것은?
문제 5
"모든 것은 파일이다(Everything is a file)"라는 유닉스 철학에 대한 설명으로 옳지 않은 것은?
문제 6
리눅스의 역사에 대한 설명으로 옳은 것은?