[OS] System Call (시스템 콜)

Jeongyeon Park·2022년 12월 26일
0

OS 기본 개념

목록 보기
5/7

System Call (시스템 콜)


1. System Call 개념

1) System Call 이란?

OS의 커널 모드에서 제공되는 서비스(특권 명령)에 대해, 응용 프로그램의 요청에 따라 커널에 접근 및 OS가 특권 명령을 대신 수행하도록 요청하는 것

  • 각 시스템 콜에 번호가 할당되며, 시스템 콜 인터페이스는 시스템 콜 번호시스템 콜 핸들러 함수 주소를 저장하는 시스템 콜 테이블을 유지한다.

  • 운영체제는 시스템 콜 테이블 인덱스에 따라 각 인덱스가 가리키는 주소에 저장된 루틴을 수행한다.

  • 작업 완료 시 CPU 인터럽트를 발생시킨다.

OS에는 2개의 독립된 동작 모드인 User Mode(사용자 모드)와 Kernel Mode(커널 모드)가 존재한다.

각 모드는 Mode Bit으로 관리된다. (Mode Bit: 0 = Kernel Mode / 1 = User Mode)

Interrupt/Trap이 발생하면 하드웨어는 Mode Bit을 0으로 변경하고 커널 모드로 전환한다.

2) System Call 처리 과정 (open() 시스템 콜)


open() 시스템 콜 호출 시 운영체제의 처리 과정을 나타낸 그림이다.

  • 응용 프로그램이 시스템 콜을 요청하면 커널 모드로 진입한다. (커널이 제어권 획득)

  • 각 시스템 콜 함수에게 할당된 고유 번호와 해당 시스템 콜의 처리 루틴을 정의한 시스템 콜 테이블이 커널 내부에 존재한다.

  • 요청 받은 시스템 콜에 대응하는 번호를 찾고, 번호에 맞는 서비스 루틴을 호출한다.

  • 서비스 루틴 처리가 완료되면 커널 모드 -> 사용자 모드로 전환한다.

3) OS에 파라미터를 전달하는 방법

시스템 콜이 발생할 때 추가적인 정보가 필요한 경우가 있다. 이 때 필요한 정보를 담은 파라미터를 OS에 전달하는 방법으로 크게 3가지가 있다.

  • CPU 레지스터에 전달 : 파라미터 자체를 CPU 레지스터에 저장한다. 단, CPU 내의 레지스터 개수보다 파라미터 개수가 더 많은 경우 사용할 수 없다.

  • 메모리의 주소 전달 : 시스템 콜이 발생할 때 응용 프로그램 안에 별도의 메모리 공간을 할당하고 파라미터를 저장한 후, 그 주소를 레지스터에 저장한다.

  • 스택을 통해 전달 : 응용 프로그램이 전달하려는 파라미터를 스택에 push하고, OS가 pop으로 해당 파라미터를 전달받는다.

2. System Call 유형

System Call의 유형 6가지

1) 프로세스 제어 (Process Control)

  • 프로세스 생성(Create Process) - fork()
  • 적재(Load), 실행(Execute), 종료(Exit), 중지(Abort)
  • 프로세스 속성 획득 및 설정(Get process attribute and set process attribute)
  • 시간 대기(Wait Time), 이벤트 대기(Wait Event)
  • 이벤트 알림(Signal Event)
  • 메모리 할당/해제 - malloc(), free()

2) 파일 조작 (File Manipulation)

  • 파일 생성(Create File) 및 삭제(Delete File)
  • 열기(Open), 닫기(Close)
  • 읽기(Read), 쓰기(Write), 위치 변경(Reposition)
  • 파일 속성 획득 및 설정(Get file attribute and set file attribute)

3) 장치 관리 (Device Management)

  • 하드웨어의 제어와 상태 정보 획득(ioctl)
  • 장치 요구(Request Device) / 방출(Release Device)
  • 읽기(Read), 쓰기(Write), 위치 변경(Reposition)
  • 장치 파일 속성 획득 및 설정(Get device attribute and set device attribute)
  • 장치의 논리적 부착(Attach) / 분리(Detach)

4) 정보 유지 (Information Maintenance)

  • getpid(), alarm(), sleep()
  • 시간&날짜 설정 및 획득(time), 시스템 데이터 설정 및 획득(date)
  • 프로세스 파일, 장치 속성 획득 및 설정

5) 통신 (Communication)

  • pipe(), shm_open(), mmap()
  • 통신 연결 생성 및 제거
  • 메시지 송수신
  • 통신 관련 상태 정보 전달
  • 원격 장치의 부착(attach) / 분리(detach)

6) 보호 (Protection)

  • chmod(), unmask(), chown()

3. System Call 관련 함수 및 예제 코드

1) fork() - 새로운 프로세스 생성

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(){
    // 현재 프로세스 (Parent Process)의 PID (PID >= 0)
    printf("PID : %d\n", (int) getpid());
    
    int child = fork(); // Child Process 생성
    
    if(child < 0)
        exit(1);
        
    else if(child == 0){ // Child Process
        printf("---Child Process---\n");
        printf("PID: %d\n", (int)getpid());
    }
    
    else{ // Parent Process
        printf("---Parent Process---\n");
        printf("PID: %d\n", (int)getpid());
        printf("Parent of %d\n", child);
    }
    
    return 0;
}

Parent Process와 거의 동일한 Child Process를 생성한 후 Parent Process와 Child Process를 모두 실행

2) wait() - Child Process가 종료될 때까지 대기

위 코드의 Parent Process의 케이스(else)에 아래 코드 추가

int wait_for = wait(NULL);


References

0개의 댓글