✅ 1. 시스템 콜이란?
**시스템 콜(System Call)**은
사용자 프로그램(유저 모드)에서 운영체제의 기능(커널 모드)을 요청하기 위해 사용하는 인터페이스입니다.
📌 즉,
"운영체제에 뭔가를 해달라고 요청하는 함수 호출"
예: 파일 열기, 메모리 할당, 네트워크 사용, 프로세스 생성 등
✅ 2. 왜 시스템 콜이 필요한가?
- 일반 프로그램은 직접 하드웨어를 제어할 수 없음 (보안, 안정성 문제)
- 하드웨어 접근은 운영체제를 통해서만 가능
- 따라서 운영체제가 제공하는 함수들(시스템 콜)을 통해 우회 접근해야 함
📌 예를 들어:
int fd = open("file.txt", O_RDONLY); // 파일 열기 요청 (시스템 콜)
이 함수는 내부적으로 커널에게 "이 파일 좀 열어줘"라고 요청하는 것임
✅ 3. 시스템 콜의 구조
시스템 콜 호출은 다음의 단계를 거칩니다:
- 사용자 프로그램에서 시스템 콜 라이브러리 함수 호출
- 함수 내부에서 시스템 콜 번호와 인자를 레지스터에 설정
- 커널 모드로 전환 (trap, syscall, int 0x80 등)
- 운영체제 커널이 해당 시스템 콜을 수행
- 결과를 다시 사용자 프로그램에 반환
📌 요약 그림:
[User Program]
↓
[System Call Wrapper] ← open(), read(), write() ...
↓
[커널 진입 (mode switch)] ← syscall 또는 int 명령어
↓
[Kernel Function 실행]
↓
[결과 반환 후 유저 모드 복귀]
✅ 4. 대표적인 시스템 콜 예시 (Linux 기준)
기능 | 시스템콜 이름 |
파일 열기 | open() |
파일 읽기 | read() |
파일 쓰기 | write() |
파일 닫기 | close() |
프로세스 생성 | fork() |
프로세스 대기 | wait() |
메모리 할당 | mmap(), brk() |
실행 파일 실행 | execve() |
종료 | exit() |
시간 확인 | gettimeofday() |
✅ 5. 시스템 콜 예시 코드
#include <unistd.h>
#include <sys/syscall.h>
#include <stdio.h>
int main() {
long pid = syscall(SYS_getpid); // 직접 시스템 콜 호출
printf("My PID is %ld\n", pid);
}
✅ 이 코드는 리눅스에서 getpid() 시스템 콜을 호출해 현재 프로세스의 PID를 가져오는 예입니다.
✅ 6. 시스템 콜의 성능과 한계
- 시스템 콜은 모드 전환 (유저 → 커널) 때문에 비용이 큼 (context switch 발생)
- 너무 자주 호출하면 성능 저하 가능
→ 예: 작은 write()를 반복 호출할 때보다 버퍼에 모아서 한 번에 호출하는 게 빠름
✅ 7. 시스템 콜 확인하는 도구
🔹 strace (리눅스에서 시스템 콜 추적)
strace ./my_program
결과 예시:
open("file.txt", O_RDONLY) = 3
read(3, "Hello", 5) = 5
write(1, "Hello", 5) = 5
📌 이렇게 실제 프로그램이 어떤 시스템 콜을 사용하는지 추적 가능
✅ 8. 시스템 콜 vs 함수 호출
구분 | 일반 함수 호출 | 시스템 콜 |
실행 위치 | 사용자 공간 | 커널 공간 |
속도 | 빠름 | 느림 (모드 전환) |
목적 | 로직 수행 | OS 기능 요청 |
예시 | int add(int a, b) | read(fd, buf, size) |
🔥 정리
✅ 시스템 콜은
사용자 프로그램이 커널에게 요청을 보내는 공식적인 방법
- 유저 모드 → 커널 모드 전환 필요
- 파일 I/O, 프로세스, 메모리, 네트워크 등 모든 핵심 기능에 필수
- 성능상 비용 있으므로 적절히 사용해야 함
🚀 시스템 프로그래밍, OS, 보안, 리눅스 등 공부할 땐 반드시 알고 있어야 할 개념!
반응형
'프로그래밍' 카테고리의 다른 글
객체 지향 설계 - SOLID 원칙 (0) | 2025.03.28 |
---|