# 운영체제 서비스와 시스템 콜
## OS 서비스 분류
운영체제는 사용자와 하드웨어의 상호작용을 위해 다양한 서비스들 제공해야 합니다. 이러한 서비스들은 아래와 같은 정도로 분류 할 수 있습니다.
+ 프로세스 관리
+ 메모리 관리
+ 파일 관리
+ 보안 및 보호
+ 에러검출
+ 통신
+ etc..
![Imgur](https://i.imgur.com/a5Eedfm.png)
## 시스템 콜과 API
OS는 다양한 서비스들을 수행하기 위해 하드웨어를 직접적으로 관리 합니다. 이와 반면, 응용프로그램은 OS가 제공하는 인터페이스를 통해서만 자원을 사용할 수 있습니다. OS가 제공하는 이러한 인터페이스를 시스템콜(System Call) 라고 합니다.
이러한 시스템 콜은 직접 사용하기에 많은 어려움이 있습니다. 때문에 프로그래밍 언어들은 시스템콜을 편리하게 사용하기 위한 수단으로 API를 제공합니다. API란 Application Programming Interface로 응용프로그램을 쉽게 만들기 위한 도구입니다. 이러한 API와 시스템콜이 제공되기 때문에 많은 개발자들은 더욱 쉽게(?) 프로그래밍을 할 수 있게 되었습니다.
![Imgur](https://i.imgur.com/YINBipo.png)
## 시스템 콜의 종류와 실행 예
다시 돌아와서, 시스템 콜은 아래와 같이 크게 여섯가지로 분류 됩니다. (각 분류 별 함수들은 UNIX 시스템에서의 시스템콜 예제입니다)
1. 프로세스 제어(Process Control)
- fork()
- exit()
- wait()
2. 파일 조작(File Manipulation)
- open()
- read()
- write()
- close()
3. 장지 조작(Device Manipulation)
- ioctl()
- read()
- write()
4. 정보 유지(Information Maintenance)
- getpid()
- alarm()
- sleep()
5. 통신(Commnication)
- pipe()
- shm_open()
- mmap()
6. 보호(Protection)
- chmod()
- umask()
- chown()
C언어를 사용한 간단한 프로그램을 예로 시스템 콜의 호출과정을 추정해봅시다.
```
#include <stdio.h>
int main()
{
...
printf("Hello World!");
...
return 0;
}
```
`printf()`함수의 실행은 user mode에서 수행되어 stdio 라이브러리를 호출합니다. stdio 라이브러리는 시스템콜인 `write()`함수를 호출하고, 실행의 흐름은 kernel mode로 전환됩니다. 커널은 호출을 실행하여 모니터에 문자열을 출력하고 실행의 흐름은 다시 user mode로 돌아와 printf() 함수의 다음 단계를 진행합니다.
![Imgur](https://i.imgur.com/UH0DDZt.png)
앞으로 이러한 시스템콜과 운영체제의 다양한 동작들을 각 장을 통하여 연습해보도록 하겠습니다.
## 확인하기
+ OS가 제공하는 핵심 서비스들은 어떠한 것들이 있나요?
+ 시스템 콜이란?
+ API란?