--- # '리눅스 기초(1) 리눅스 아키텍쳐 ## 리눅스 시스템의 계층 구조 리눅스는 크게 4개의 주요 계층으로 구성되어 있습니다: ```plain text ┌─────────────────────────────────┐ │ 사용자 애플리케이션 │ ← 사용자 프로그램들 ├─────────────────────────────────┤ │ 시스템 라이브러리 │ ← glibc, 시스템 콜 래퍼 ├─────────────────────────────────┤ │ 커널 공간 (Kernel) │ ← 핵심 운영체제 ├─────────────────────────────────┤ │ 하드웨어 계층 │ ← CPU, 메모리, 디스크 등 └─────────────────────────────────┘ ``` ## 1. 하드웨어 계층 (Hardware Layer) 가장 아래쪽에 위치한 물리적 하드웨어 구성요소들입니다: - **CPU (Central Processing Unit)**: 명령어 실행 - **메모리 (RAM)**: 데이터와 프로그램 임시 저장 - **저장장치**: HDD, SSD 등 영구 저장 - **입출력 장치**: 키보드, 마우스, 네트워크 카드 등 - **버스**: 하드웨어 구성요소 간 데이터 전송 통로 ## 2. 커널 (Kernel) - 리눅스의 핵심 커널은 리눅스 운영체제의 심장부로, 하드웨어와 소프트웨어 사이의 다리 역할을 합니다. ### 주요 커널 구성요소 ### 프로세스 관리 (Process Management) ```bash # 현재 실행 중인 프로세스 확인 ps aux # 프로세스 트리 구조 확인 pstree # 특정 프로세스 정보 확인 cat /proc/[PID]/status ``` - **프로세스 스케줄링**: CPU 시간을 프로세스들에게 할당 - **프로세스 생성/종료**: fork(), exec(), exit() 시스템 콜 처리 - **멀티태스킹**: 여러 프로세스의 동시 실행 관리 ### 메모리 관리 (Memory Management) ```bash # 메모리 사용량 확인 free -h # 가상 메모리 정보 확인 cat /proc/meminfo # 프로세스별 메모리 사용량 cat /proc/[PID]/smaps ``` - **가상 메모리**: 물리 메모리보다 큰 주소 공간 제공 - **페이징**: 메모리를 페이지 단위로 관리 - **스왑**: 디스크를 임시 메모리로 활용 ### 파일 시스템 (File System) ```bash # 마운트된 파일시스템 확인 mount | column -t # 파일시스템 사용량 확인 df -h # inode 정보 확인 ls -li ``` - **VFS (Virtual File System)**: 다양한 파일시스템에 대한 공통 인터페이스 - **ext4, btrfs, xfs**: 실제 파일시스템 구현체들 - **파일 권한 및 소유권 관리** ### 장치 드라이버 (Device Drivers) ```bash # 로드된 커널 모듈 확인 lsmod # 하드웨어 정보 확인 lshw lspci lsusb # 커널 메시지 확인 dmesg | tail ``` - **하드웨어 추상화**: 하드웨어를 소프트웨어로 제어할 수 있게 변환 - **모듈**: 동적으로 로드/언로드 가능한 드라이버 - **디바이스 파일**: `/dev` 디렉토리의 장치 파일들 ### 네트워크 스택 (Network Stack) ```bash # 네트워크 인터페이스 확인 ip addr show # 네트워크 연결 상태 netstat -tuln # 라우팅 테이블 확인 ip route show ``` - **TCP/IP 프로토콜 스택**: 네트워크 통신 프로토콜 구현 - **소켓**: 네트워크 통신을 위한 인터페이스 - **방화벽**: iptables, netfilter를 통한 패킷 필터링 ## 3. 시스템 라이브러리 (System Libraries) 사용자 프로그램과 커널 사이의 중간 계층입니다. ### glibc (GNU C Library) ```bash # glibc 버전 확인 ldd --version # 프로그램의 라이브러리 의존성 확인 ldd /bin/ls ``` - **시스템 콜 래퍼**: 커널 시스템 콜을 C 함수로 감싸서 제공 - **표준 C 라이브러리 함수들**: printf, malloc, fopen 등 - **POSIX 호환성**: 유닉스 표준 API 제공 ### 기타 시스템 라이브러리들 - **libm**: 수학 함수 라이브러리 - **libpthread**: 스레드 라이브러리 - **libssl**: 암호화 라이브러리 - **libX11**: X Window System 라이브러리 ## 4. 사용자 공간 (User Space) 사용자가 직접 실행하는 애플리케이션들이 동작하는 영역입니다. ### 시스템 유틸리티 ```bash # 시스템 정보 확인 도구들 uname -a # 시스템 정보 uptime # 시스템 가동 시간 whoami # 현재 사용자 id # 사용자 ID 정보 ``` ### 셸 (Shell) ```bash # 현재 사용 중인 셸 확인 echo $SHELL # 사용 가능한 셸 목록 cat /etc/shells # 셸 프로세스 정보 ps -p $$ ``` - **bash, zsh, fish**: 다양한 셸 종류 - **명령어 해석**: 사용자 입력을 커널이 이해할 수 있는 형태로 변환 - **스크립팅**: 자동화된 작업 실행 ### 데스크탑 환경 - **X11/Wayland**: 그래픽 디스플레이 서버 - **GNOME, KDE, XFCE**: 데스크탑 환경 - **윈도우 매니저**: 창 관리 시스템 ## 리눅스 부팅 과정에서 보는 아키텍처 리눅스 시스템이 부팅되는 과정을 통해 각 계층이 어떻게 초기화되는지 살펴보겠습니다: ```plain text 1. BIOS/UEFI → 하드웨어 초기화 2. 부트로더 (GRUB) → 커널 로드 3. 커널 초기화 → 하드웨어 감지, 드라이버 로드 4. init 프로세스 → 시스템 서비스 시작 5. 로그인 관리자 → 사용자 세션 시작 ``` ```bash # 부팅 메시지 확인 dmesg | head -20 # 시스템 서비스 상태 확인 (systemd) systemctl status # 부팅 시간 분석 systemd-analyze blame ``` ## 가상 파일시스템들 리눅스에는 실제 파일이 아닌 커널 정보를 파일 형태로 제공하는 특별한 파일시스템들이 있습니다: ### /proc 파일시스템 ```bash # 프로세스 정보 ls /proc/[PID]/ # 시스템 정보 cat /proc/cpuinfo cat /proc/meminfo cat /proc/version ``` ### /sys 파일시스템 ```bash # 하드웨어 정보 ls /sys/class/ ls /sys/devices/ # CPU 정보 cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor ``` ### /dev 파일시스템 ```bash # 디바이스 파일들 ls -la /dev/ # 블록 디바이스 ls /dev/sd* # 문자 디바이스 ls /dev/tty* ``` ## 커널 공간 vs 사용자 공간 리눅스에서 가장 중요한 구분은 커널 공간과 사용자 공간의 분리입니다: ### 커널 공간 (Kernel Space) - **권한**: 하드웨어에 직접 접근 가능 - **메모리**: 물리 메모리에 직접 매핑 - **실행 모드**: 특권 모드 (Ring 0) - **보호**: 사용자 프로그램에서 직접 접근 불가 ### 사용자 공간 (User Space) - **권한**: 제한된 권한, 시스템 콜을 통해서만 커널 기능 사용 - **메모리**: 가상 메모리 주소 공간 - **실행 모드**: 사용자 모드 (Ring 3) - **보호**: 다른 프로세스나 커널에 영향을 주지 못함 ## 시스템 콜 (System Calls) 사용자 공간과 커널 공간을 연결하는 인터페이스입니다: ```bash # 프로그램이 사용하는 시스템 콜 추적 strace ls # 시스템 콜 통계 strace -c ls # 특정 시스템 콜만 추적 strace -e trace=open,read,write cat /etc/hostname ``` ### 주요 시스템 콜 카테고리 - **파일 조작**: open(), read(), write(), close() - **프로세스 관리**: fork(), exec(), wait(), exit() - **메모리 관리**: mmap(), brk(), sbrk() - **네트워크**: socket(), bind(), listen(), accept() ## 리눅스 아키텍처의 장점 ### 모듈성 - 각 구성요소가 독립적으로 개발/유지보수 가능
'리눅스 기초(1) 리눅스 아키텍쳐
2026년 04월 12일