> For the complete documentation index, see [llms.txt](https://kukingclass.gitbook.io/computerscience/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://kukingclass.gitbook.io/computerscience/operating-system/undefined-3.md).

# 시스템 콜(System Call)

***

### 시스템콜

* 프로세스(유저모드)가 운영체제(커널모드)의 기능을 요청하는 것
* 기본적으로 프로세스들간의 호출도 제한되어 있어 프로세스간 통신을 활용하는 것처럼 프로세스가 커널 내부의 함수를 호출하려면 시스템콜을 활용

***

#### 시스템콜 실행

![image](https://user-images.githubusercontent.com/64067641/189519644-182ac70d-f4d2-481f-96af-e19fa1466c83.png)

* 유저모드에서 실행되는 프로세스가 커널모드에 대한 접근이 필요할 때, 시스템콜이 커널에 요청해서 커널모드에서 처리하고 그 결과를 유저모드로 전달
* 여러 종류의 시스템콜이 있고 각각 번호가 할당되어 시스템콜테이블로 유지
* 프로세스가 하드웨어에 접근하여 필요한 기능을 사용하게 함

***

### 파라미터 전달 방법

* 레지스터를 통한 주소 전달
  * 레지스터에 저장하여 전달
  * CPU 내 레지스터의 개수보다 파라미터가 많아지면 메모리에 저장하고 메모리 주소를 전달
* 스택
  * 매개변수의 개수나 길이에 제한이 없음

***

### 동기식 호출과 비동기식 호출

* 동기식
  * 입출력을 시작시키고 끝날 때까지 대기
  * 그동안 다른 프로세스가 CPU 사용
  * 대부분의 시스템콜이 동기식 호츌
* 비동기식
  * 입출력을 시작시키고 바로 다음 라인 수행
  * 입출력 동안에도 CPU 사용
  * 입출력 종료를 알려주는 방법 필요

***

### 시스템콜 종류

* 프로세스 제어
* 파일 조작
* 장치 조작
* 정보 관리
* 통신
* 보호

***

***

### fork

* fork() 실행 시 동일한 프로세스를 하나 생성
* 부모 프로세스와 자식 프로세스의 차이는 fork()의 리턴값(부모는 자식 프로세스의 pid값, 자식은 0)
* fork() 이후 부모와 자식의 실행 순서는 보장되지 않음

***

### wait

* 프로세스의 종료를 기다림으로 실행 순서를 제어 가능하게 함

***

### exec

* 프로세스의 코드 내용을 지정된 파일의 내용으로 덮어씀
* exec() 이후 기존의 코드 내용 대신 새로운 내용 실행
* fork는 새로운 프로세스를 만들어도 반복 작업만 가능하지만 exec 사용함으로써 다양한 작업을 가능하게 함
