OS의 커널 모드에서 제공되는 서비스(특권 명령)에 대해, 응용 프로그램의 요청에 따라 커널에 접근 및 OS가 특권 명령을 대신 수행하도록 요청하는 것
각 시스템 콜에 번호가 할당되며, 시스템 콜 인터페이스는 시스템 콜 번호와 시스템 콜 핸들러 함수 주소를 저장하는 시스템 콜 테이블을 유지한다.
운영체제는 시스템 콜 테이블 인덱스에 따라 각 인덱스가 가리키는 주소에 저장된 루틴을 수행한다.
작업 완료 시 CPU 인터럽트를 발생시킨다.
OS에는 2개의 독립된 동작 모드인 User Mode(사용자 모드)와 Kernel Mode(커널 모드)가 존재한다.
각 모드는 Mode Bit으로 관리된다. (Mode Bit: 0 = Kernel Mode / 1 = User Mode)
Interrupt/Trap이 발생하면 하드웨어는 Mode Bit을 0으로 변경하고 커널 모드로 전환한다.
open() 시스템 콜 호출 시 운영체제의 처리 과정을 나타낸 그림이다.
응용 프로그램이 시스템 콜을 요청하면 커널 모드로 진입한다. (커널이 제어권 획득)
각 시스템 콜 함수에게 할당된 고유 번호와 해당 시스템 콜의 처리 루틴을 정의한 시스템 콜 테이블이 커널 내부에 존재한다.
요청 받은 시스템 콜에 대응하는 번호를 찾고, 번호에 맞는 서비스 루틴을 호출한다.
서비스 루틴 처리가 완료되면 커널 모드 -> 사용자 모드로 전환한다.
시스템 콜이 발생할 때 추가적인 정보가 필요한 경우가 있다. 이 때 필요한 정보를 담은 파라미터를 OS에 전달하는 방법으로 크게 3가지가 있다.
CPU 레지스터에 전달 : 파라미터 자체를 CPU 레지스터에 저장한다. 단, CPU 내의 레지스터 개수보다 파라미터 개수가 더 많은 경우 사용할 수 없다.
메모리의 주소 전달 : 시스템 콜이 발생할 때 응용 프로그램 안에 별도의 메모리 공간을 할당하고 파라미터를 저장한 후, 그 주소를 레지스터에 저장한다.
스택을 통해 전달 : 응용 프로그램이 전달하려는 파라미터를 스택에 push하고, OS가 pop으로 해당 파라미터를 전달받는다.
1) 프로세스 제어 (Process Control)
2) 파일 조작 (File Manipulation)
3) 장치 관리 (Device Management)
4) 정보 유지 (Information Maintenance)
5) 통신 (Communication)
6) 보호 (Protection)
#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를 모두 실행
위 코드의 Parent Process의 케이스(else)에 아래 코드 추가
int wait_for = wait(NULL);