시스템 콜
사용자 프로세스가 커널의 기능(파일 I/O, 프로세스 생성 등)을 안전하게 사용하기 위해 운영체제에 요청하는 프로그래밍 인터페이스입니다.
왜 필요한가?
운영체제는 사용자 모드(User Mode)와 커널 모드(Kernel Mode)를 분리하여 시스템을 보호합니다. 일반 프로세스는 하드웨어나 커널 자원에 직접 접근할 수 없으므로, 시스템 콜을 통해 커널에 작업을 위임합니다.
동작 흐름
사용자 프로세스 → 시스템 콜 호출 → 트랩(Trap) 발생 → 커널 모드 전환
→ 커널이 요청 처리 → 결과 반환 → 사용자 모드 복귀
주요 분류
| 분류 | 예시 | 설명 |
|---|---|---|
| 프로세스 제어 | fork(), exec(), exit() | 프로세스 생성·실행·종료 |
| 파일 관리 | open(), read(), write(), close() | 파일 읽기·쓰기·열기·닫기 |
| 장치 관리 | ioctl(), read(), write() | 디바이스 제어 |
| 정보 유지 | getpid(), time() | 시스템 정보 조회 |
| 통신 | socket(), send(), recv() | 프로세스 간 통신(IPC) |
Java에서의 시스템 콜
Java는 JVM 위에서 동작하므로 시스템 콜을 직접 호출하지 않지만, 내부적으로 시스템 콜이 발생합니다.
// Java의 파일 읽기 → 내부적으로 open(), read() 시스템 콜 호출
FileInputStream fis = new FileInputStream("/tmp/test.txt");
int data = fis.read(); // read() 시스템 콜
fis.close(); // close() 시스템 콜
// 프로세스 생성 → 내부적으로 fork() + exec() 시스템 콜 호출
Process p = Runtime.getRuntime().exec("ls -al");
사용자 모드 vs 커널 모드
| 항목 | 사용자 모드 | 커널 모드 |
|---|---|---|
| 권한 | 제한된 명령어만 실행 | 모든 명령어 실행 가능 |
| 메모리 접근 | 자신의 주소 공간만 | 전체 메모리 접근 가능 |
| 모드 비트 | 1 | 0 |
| 전환 계기 | 시스템 콜, 인터럽트, 예외 | - |