다케우치 사토루 님의 "실습과 그림으로 배우는 리눅스 구조" 책을 정리한 포스팅 입니다.
1. 시스템 콜
- 사용자 프로그램이 커널의 기능을 사용하기 위해 요청하는 인터페이스
- 하드웨어 관련 작업을 요청함 (프로세스 생성, 파일 열기, 네트워크 통신, 메모리 할당 등)
- ⚠️ 사용자 프로그램은 직접 하드웨어를 접근할 수 없음 (커널 권한 필요)
종류
| 기능 | 시스템 콜 |
| 프로세스 실행 | execve() |
| 프로세스 생성 | fork() |
| 파일 열기 | open() |
| 파일 쓰기 | write() |
| 메모리 할당 | brk(), mmap() |
| 네트워크 | socket() |
발생 과정
- 사용자 프로그램이 시스템 콜 호출 (write(), open() 등)
- 내부에서 syscall 명령어 호출 (어셈블리어)
- 소프트웨어 인터럽트 발생
- CPU 모드 전환 (사용자 → 커널)
- 커널 작업 수행
- 사용자 모드로 복귀
wrapper 함수
- 고급 언어를 위해 시스템 콜을 감싸는 함수
- ✅ 시스템 콜은 실제로 어셈블리 명령어인 syscall로 호출해야 함
- ⚠️ CPU 아키텍쳐 의존적이므로 고급 언어에서 직접 작성이 어렵고, 이식성이 낮음
- ➡️ 고급 언어에서 쉽게 사용하도록 제공함
예시) pid()
더보기
#include <unistd.h>
#include <stdio.h>
int main() {
pid_t pid = fork();
if (pid == 0)
printf("Child process\n");
else
printf("Parent process\n");
}
- 내부 동작: fork() → glibc wrapper → syscall(SYS_fork)로 호출
3. 표준 C 라이브러리
glibc
- 시스템 콜 Wrapper 제공
4. OS가 제공하는 프로그램
- 운영체제는 커널 뿐만 아니라 여러 프로그램이 제공됨
| 구분 | 프로그램 | 역할 | 핵심 개념 |
| 부팅 시작 | init | 시스템 부팅 시 최초 실행 프로세스 (PID 1) | 전통적 초기화 시스템 |
| systemd | 현대 리눅스의 초기화 및 서비스 관리자 | 병렬 서비스 실행, 의존성 관리 | |
| 시스템 조정 | sysctl | 커널 파라미터 조회 및 변경 | /proc/sys 인터페이스 사용 |
| nice | 프로세스 우선순위 조정 | CPU 스케줄링 영향 | |
| sync | 메모리 버퍼 데이터를 디스크에 강제 기록 | 데이터 일관성 유지 | |
| 파일 조작 | touch | 빈 파일 생성 또는 타임스탬프 변경 | 파일 메타데이터 수정 |
| mkdir | 디렉토리 생성 | 파일 시스템 조작 | |
| 데이터 처리 | grep | 텍스트 검색 | 정규표현식 기반 필터링 |
| sort | 데이터 정렬 | 텍스트 정렬 알고리즘 | |
| uniq | 중복 행 제거 | 연속 중복 제거 | |
| 성능 측정 | sar | CPU, 메모리 등 시스템 자원 통계 수집 | 사용자/커널 모드 비율 확인 |
| iostat | 디스크 I/O 통계 확인 | I/O 병목 분석 | |
| 개발 도구 | gcc | C/C++ 컴파일러 | 소스 → 바이너리 변환 |
| perl | 스크립트 언어 실행 환경 | 텍스트 처리 자동화 |
'OS > Linux' 카테고리의 다른 글
| [ 리눅스 마스터 ] 6. 쉘 (0) | 2021.08.13 |
|---|---|
| [ 리눅스 마스터 ] 5. 파일 시스템 (0) | 2021.08.13 |
| [ 리눅스 마스터 ] 4. 부팅과 셧다운 (0) | 2021.08.13 |
| [리눅스 마스터] 3. 디렉터리 구조 및 역할 (0) | 2021.08.06 |
| [리눅스 마스터] 2. 리눅스 구조 (0) | 2021.08.06 |