-
(5) System CallCS 지식/○ OS(Operating System) 2021. 6. 15. 21:51
1. System Call 이란?
1-1) 정의
OS가 Application / 사용자에게 제공하는 interface
1-2) 사용 이유
OS가 프로세스 실행, 종료 / I/O 작업 등, 사용자가 함부로 사용하면 안되는 명령어들을
Privileged Instruction으로 분류하고 막아놓았다.이를 사용하기 위해서 OS가 제공하는 System Call API을 통해 System Call을 이용해야 함
[PI / Kernal mode에서 실행되는 System call의 종류 예시]
- 파일 읽어오기, 파일 쓰기, 화면 메세지 출력 등...
- fork, wait, exec...1-3) 수행 과정
1) 프로세스가 System Call을 호출하면 trap(내부 인터럽트)이 발생
- 참조
https://korshika.tistory.com/1382) User mode에서 Kernel mode 진입
3) 요청이 들어온 System Call 수행, return-from-trap발생시켜 user mode로 돌아감
[Interrupt와 Trap 비교]
Interrupt란? - Asynchronous
Interrupt란 프로그램 수행 중 CPU가 강제로 제어를 가져오는 것을 말한다. 주로 허용되지 않은 작업이 수행될 때 발생한다(비동기적). Interrupt가 발생하면 interrupt service routine(명령어)의 위치가 기록되어 있는 interrupt vector로 이동하여 해당하는 명령어를 찾아 수행한다.
Trap이란? - Synchronous
Trap은 Interrupt의 한 종류로서 명령의 수행 결과로 발생한다(동기적). 주로 System Call을 호출할 때나 Segmentation fault(할당되지 않은 메모리 참조)로 인해 발생한다. Trap이 발생하면 Trap Table로 이동하여 해당하는 명령을 수행한다.
1-4) 사용 명령어
System Call 명령 중 process 관련
> folk, wait, exec
> 다른 system call 유형 ▼더보기1 프로세스 제어(Process Control)
- 끝내기(end), 중지(abort)
- 적재(load), 실행(execute)
- 프로세스 생성(create process)
- 프로세스 속성 획득과 설정(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 장치 관리(Devide Management)
- 장치를 요구(request devices), 장치를 방출release device)
- 읽기, 쓰기, 위치 변경
- 장치 속성 획득, 장치 속성 설정
- 장치의 논리적 부착(attach) 또는 분리(detach)
4 정보 유지(Information Maintenance)
- 시간과 날짜의 설정과 획득(time)
- 시스템 데이터의 설정과 획득(date)
- 프로세스 파일, 장치 속성의 획득 및 설정
5 통신(Communication)
- 통신 연결의 생성, 제거
- 메시지의 송신, 수신
- 상태 정보 전달
- 원격 장치의 부착 및 분리
5 통신에 대해 부가적인 내용을 추가한다. 일반적인 통신 모델에는 메시지 전달과 공유 메모리 두가지 가 있다. 메시지 전달 모델에서는 두 프로세스의 통신에 정보 교환을 위한 메시지를 주고 받는다. 공유 메모리 모델에서는 다른 프로세스가 소유한 메모리에 접근을 위해 특정 시스템 콜을 호출한다. 일반적으로 운영체제는 서로 다른 프로세스간의 메모리 접근을 차단한다. 공유 메모리 기법을 사용하기 위해서는 통신하려는 프로세스들이 이러한 차단을 풀어주는데 동의해야한다.
- folk( )
- 새 프로세스 생성
- but 자식/부모 중 어떤 것이 먼저 실행될지 알 수 없음
- parent/ child 순서는 scheduler가 뭐를 먼저 수행하냐에 따름
- child의 fork 값은 0
#include <stdio.h> #include <stdlib.h> #include <unistd.h> int main(int argc, char *argv[]) { printf("pid : %d", (int) getpid()); // pid : 29146 int rc = fork(); // 주목 if (rc < 0) { exit(1); } // (1) fork 실패 else if (rc == 0) { // (2) child 인 경우 (fork 값이 0) printf("child (pid : %d)", (int) getpid()); } else { // (3) parent case printf("parent of %d (pid : %d)", rc, (int)getpid()); } } /* Parent의 fork()값 => child의 pid 값 Child의 fork()값 => 0 pid : 29146 child (pid : 29147) parent of 29147 (pid : 29146) */
- wait( )
- 자식 프로세스가 끝날 때 까지 대기
- int wc = wail(NULL)로 return을 기다리기 때문에 parent 먼저 실행되더라도 child의 생성 / 선수행을 보장
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/wait.h> int main(int argc, char *argv[]) { printf("pid : %d", (int) getpid()); // pid : 29146 int rc = fork(); // 주목 if (rc < 0) { exit(1); } // (1) fork 실패 else if (rc == 0) { // (2) child 인 경우 (fork 값이 0) printf("child (pid : %d)", (int) getpid()); } else { // (3) parent case int wc = wait(NULL) // 추가된 부분 printf("parent of %d (wc : %d / pid : %d)", wc, rc, (int)getpid()); } } /* pid : 29146 child (pid : 29147) parent of 29147 (wc : 29147 / pid : 29146) */
- exec( )
- 다른 프로그램을 실행 / 동일 프로세스 내용을 여러번 동작하려 할때 등
- child가 parent와 다른 동작을 하고 싶을 대는 exec 사용
참조
https://gyoogle.dev/blog/computer-science/operating-system/System%20Call.html
https://luckyyowu.tistory.com/133
반응형'CS 지식 > ○ OS(Operating System)' 카테고리의 다른 글
(7) IPC - Inter Process Communication (0) 2021.06.20 (6) PCB & Context Switching (0) 2021.06.16 (4) 인터럽트 (0) 2021.06.15 (3) 프로세스 주소 공간 (0) 2021.06.13 (2) 프로세스 & 스레드 (0) 2021.06.12