공부한거 정리하는 노트에요

[OS] 시스템 콜 (System Call)

by 구설구설
시스템 콜(System Call)은 운영체제 커널이 제공하는 서비스를 사용자 프로그램이 요청할 수 있도록 하는 인터페이스이다.

시스템 콜의 개념

응용 프로그램이 I/O 작업을 수행하고자 할 때, 커널에게 Privileged Instruction을 수행해 달라고 요청한다.

  • 커널은 요청이 응용 프로그램에 의해 허용된 작업인지 검증한다.
  • 요청이 승인되면, 커널은 응용 프로그램을 대신하여 Privileged Instruction을 수행한다.

 

설계 아이디어

프로세스는 시스템 콜이라는 특별한 명령어를 사용할 수 있다.

프로세스가 이 명령어를 실행하면 유저 모드에서 커널 모드로 전환되며, 커널은 프로세스가 요청한 Privileged Instruction을 실행한다.

예를 들어, C언어에서 ~printf()~ 명령어를 호출하면 내부적으로 커널의 ~write()~ 시스템 콜을 호출한다.

시스템 콜의 종류

fork

#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>

int main()
{
    int pid;

    if ((pid = fork()) == 0) {
        // 자식 프로세스
        printf("Child of %d is %d\n", getppid(), getpid());
    } else {
        // 부모 프로세스
        printf("I am %d. My child is %d\n", getpid(), pid);
    }

    return 0;
}

// 결과 1
// I am 12345. My child is 12346
// Child of 12345 is 12346

// 결과 2
// Child of 12345 is 12346
// I am 12345. My child is 12346

// 결과 1과 결과 2는 스케쥴러에 의해 결정된다.
  • ~fork~는 프로세스를 복제하여 새로운 프로세스를 생성한다.
  • 이로 인해 부모-자식 관계가 형성되며, 기존 프로세스는 부모, 새로 생성된 프로세스는 자식이 된다.
  • 한 프로세스에서 여러 번 ~fork~를 호출할 수 있다.
  • 자식 프로세스도 독립적인 프로세스이므로 자식 프로세스에서 추가적으로 ~fork~를 호출할 수 있다.

 

exec

  • ~exec~는 현재 프로세스를 완전히 새로운 프로세스로 초기화한다.
  • 새로운 프로세스를 실행하고자 할 때는 ~fork~와 ~exec~를 함께 사용할 수 있다.
    • Windows에서는 ~CreateProcess~ 시스템 콜이 ~fork~와 ~exec~의 기능을 결합하여 제공한다.

 

exit

  • ~exit~은 현재 프로세스의 실행을 종료한다.
  • 일반적으로 ~main()~ 함수의 반환 값으로 호출되는 것이 이상적이다.
  • 종료 상태를 나타내는 파라미터를 통해 종료가 정상적이었는지 전달할 수 있다.

 

kill

  • ~kill~은 특정 프로세스에 신호를 전달하여 동작을 제어한다.
  • 종료(~die~), 일시 중지(~sleep~) 등 추가적인 지시를 전달할 수 있다.

 

wait

  • ~wait~은 자식 프로세스의 상태 변화를 기다리는 데 사용된다.
  • 주로 자식 프로세스의 종료를 기다리는 용도로 사용하며, 종료된 자식 프로세스에 할당된 자원을 회수한다.
  • ~waitpid~를 사용하면 특정 자식 프로세스만을 대상으로 기다릴 수 있다.

'CS > OS' 카테고리의 다른 글

[OS] CPU 스케줄링  (0) 2024.12.15
[OS] 인터럽트 (Interrupt)  (0) 2024.12.12
[OS] 듀얼 모드 (Dual Mode, 이중 모드)  (0) 2024.12.12
[OS] 프로세스  (0) 2024.12.11
[OS] 운영체제란?  (0) 2024.12.11

블로그의 정보

공부중임

구설구설

활동하기