프로그래밍

시스템콜(System Call) 이란?

GONII 2025. 4. 4. 15:48

✅ 1. 시스템 콜이란?

**시스템 콜(System Call)**은
사용자 프로그램(유저 모드)에서 운영체제의 기능(커널 모드)을 요청하기 위해 사용하는 인터페이스입니다.

📌 즉,

"운영체제에 뭔가를 해달라고 요청하는 함수 호출"
예: 파일 열기, 메모리 할당, 네트워크 사용, 프로세스 생성 등


✅ 2. 왜 시스템 콜이 필요한가?

  • 일반 프로그램은 직접 하드웨어를 제어할 수 없음 (보안, 안정성 문제)
  • 하드웨어 접근은 운영체제를 통해서만 가능
  • 따라서 운영체제가 제공하는 함수들(시스템 콜)을 통해 우회 접근해야 함

📌 예를 들어:

int fd = open("file.txt", O_RDONLY);  // 파일 열기 요청 (시스템 콜)

이 함수는 내부적으로 커널에게 "이 파일 좀 열어줘"라고 요청하는 것임


✅ 3. 시스템 콜의 구조

시스템 콜 호출은 다음의 단계를 거칩니다:

  1. 사용자 프로그램에서 시스템 콜 라이브러리 함수 호출
  2. 함수 내부에서 시스템 콜 번호와 인자를 레지스터에 설정
  3. 커널 모드로 전환 (trap, syscall, int 0x80 등)
  4. 운영체제 커널이 해당 시스템 콜을 수행
  5. 결과를 다시 사용자 프로그램에 반환

📌 요약 그림:

[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