시스템 콜

기술노트

시스템 콜 (System Call)

시스템 콜(System Call)은 사용자 모드(User Mode)에서 실행되는 응용 프로그램이, 운영체제 커널(Kernel)이 제공하는 서비스를 이용하기 위한 공식적인 인터페이스(관문)입니다. 프로그램은 시스템 콜을 통해 파일 시스템, 장치 제어, 프로세스 관리 등 커널의 보호를 받는 자원에 접근하고 필요한 작업을 요청할 수 있습니다.


🛡️ 시스템 콜의 목적과 필요성

  • 자원 보호 (Resource Protection)

> * 운영체제는 시스템의 안정성을 위해 커널 모드(Kernel Mode)와 사용자 모드(User Mode)로 나누어 시스템을 보호합니다. > * 사용자 모드에서 실행되는 응용 프로그램이 파일 시스템, I/O 장치, 메모리 등 중요한 자원에 직접 접근하여 시스템을 손상시키는 것을 방지하고, 오직 시스템 콜이라는 통로를 통해서만 접근을 허용합니다.

  • 추상화된 인터페이스 제공 (Providing Abstraction)

> * 응용 프로그램에 하드웨어에 대한 복잡한 지식 없이도, 운영체제가 제공하는 일관되고 추상화된 인터페이스를 통해 자원을 사용할 수 있게 합니다. > * 예를 들어, 개발자는 `write()`라는 시스템 콜만 호출하면, 실제 데이터가 디스크에 어떻게 저장되는지 몰라도 파일 쓰기 작업을 수행할 수 있습니다.


⚙️ 시스템 콜의 동작 과정

1. 사용자 프로세스의 요청 : 사용자 프로세스가 파일 열기, 메모리 할당 등 커널의 서비스가 필요한 작업을 수행하려고 합니다. 2. 라이브러리 함수 호출 : 프로세스는 직접 시스템 콜을 호출하기보다, C 라이브러리(libc) 같은 고수준 API를 호출합니다. (e.g., `printf()`, `fopen()`) 3. 시스템 콜 호출 : 라이브러리 함수 내부에서 해당 시스템 콜(e.g., `write()`, `open()`)을 호출합니다. 이때, 시스템 콜 번호와 필요한 인자들이 레지스터에 저장됩니다. 4. 트랩 (Trap) 발생 : `TRAP`이라는 소프트웨어 인터럽트를 발생시켜, CPU의 제어권을 커널에 넘깁니다. 5. 커널 모드 전환 : CPU는 사용자 모드에서 커널 모드로 전환됩니다. 6. 시스템 콜 핸들러 실행 : 커널은 시스템 콜 테이블(System Call Table)에서 레지스터에 저장된 시스템 콜 번호에 해당하는 서비스 루틴(핸들러)을 찾아 실행합니다. 7. 사용자 모드 복귀 : 작업이 완료되면, CPU는 다시 사용자 모드로 전환되고, 시스템 콜의 결과가 사용자 프로세스에 반환됩니다.


💡 개발자 핵심 Point

  • 주요 시스템 콜 유형

> * 프로세스 제어 : `fork()`(프로세스 생성), `exec()`(프로그램 실행), `exit()`(프로세스 종료) > * 파일 관리 : `open()`, `read()`, `write()`, `close()` > * 장치 관리 : `ioctl()`, `read()`, `write()` > * 정보 유지 : `getpid()`(프로세스 ID 얻기), `alarm()`(알람 설정) > * 통신 : `pipe()`, `shmget()`(공유 메모리), `socket()`

  • 개발자가 직접 시스템 콜을 사용하는 경우는 드물며, 보통은 운영체제가 제공하는 API(e.g., POSIX API, Windows API)를 통해 간접적으로 사용합니다.
  • `strace`(Linux)나 `dtruss`(macOS) 같은 도구를 사용하면, 특정 프로세스가 어떤 시스템 콜을 호출하는지 실시간으로 추적할 수 있어 디버깅에 유용합니다.