[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 |
블로그의 정보
공부중임
구설구설