오늘 포스팅 내용은 시스템 콜에 관한 내용이다.
우리가 사용하는 PC에서 CPU는 사용자 애플리케이션(User Application)에 의한 시스템 손상을 방지하기 위해 2가지 CPU 모드를 제공한다.
CPU에 존재하는 Mode bit를 통해 CPU 모드를 구분하며 0은 커널 모드(Kernel Mode), 1은 사용자 모드(User Mode)를 나타낸다.
Kernel Mode는 Superviosr Mode라고도 불리우며 운영체제의 프로세스를 실행하고, User Mode는 사용자 프로세스를 실행한다.
사용자 모드(User Mode)
- 사용자 모드에서는 사용자 애플리케이션 프로세스가 실행된다. 사용자가 접근할 수 있는 영역이 제한되어 있기에 해당 모드에서는 시스템 자원(하드웨어)에 직접 접근할 수 없다
- 사용자 모드에서 시스템 자원의 접근을 위해 System Call을 사용한다
커널 모드(Kernel Mode)
- 운영체제가 CPU를 사용하는 모드이다
- System Call을 통해 커널 모드로 전환이 되면 운영체제는 하드웨어를 제어하는 명령어를 실행한다
- 커널 모드에서만 실행 가능한 Privileged Instructions은 사용자 모드에서 실행하면 exception이 발생한다.
시스템 콜(System Call)
- 운영체제의 커널 서비스를 사용하기 위한 프로그래밍 인터페이스
- 보통 System Call은 API를 통해 운영체제 서비스를 사용자 애플리케이션에 제공한다
- System Call은 Trap의 한 종류로 볼 수 있다(그 이유는 아래 그림에서 System Call이 처리되는 과정으로 설명할 수 있다)
- 아래의 그림은 System Call 중 하나인 read()를 처리하는 전반적인 과정이다
System Call 종류
- System Call은 프로세스 제어, 파일 관리, 디바이스 관리, 정보 유지, 통신, 보호 6가지 영역으로 분류할 수 있다.
- 프로세스 제어(Process Control)
- 프로세스 생성/제거
- 프로세스 종료, 대기, 중지
- 프로세스 적재, 실행
- 프로세스 속성 get/set
- 메모리 할당/해제
- 파일 관리(File Management)
- 파일 생성/제거
- 파일 열기/닫기, 읽기/쓰기, 위치 변경
- 파일 속성 get/set
- 디바이스 관리(Device Management)
- 장치 요청/해제
- 장치 읽기/쓰기, 위치 변경
- 장치 속성 get/set
- 논리적으로 장치 연결 또는 분리
- 정보 유지(Information Maintenance)
- 날짜 또는 시간 get/set
- 시스템 날짜 get/set
- 프로세스, 파일 또는 장치 속성 get/set
- 통신(Communication)
- 통신 연결 생성/제거
- 메세지 송신/수신
- 상태 정보 전송
- 원격 장치 연결/분리
- 보호(Protection)
- 권한 get/set
위의 그림은 Linux 기준 System Call 함수들이다 (Window는 함수명이 조금씩 다르다)
System Call & Library
System Call
- 시스템 자원을 사용자가 사용할 수 있도록 만들어 놓은 함수들이며 호출할 경우 커널 모드로 전환되어 실행된다. return type은 대부분 int 타입이고 정상적으로 수행이 되면 0 이상의 값을, 오류가 발생하면 -1을 반환한다
Library Call
- 문자열/입출력 등의 사용자가 많이 사용하는 기능들을 미리 함수로 만들어 놓은 것
- 라이브러리 호출 시에 내부적으로 시스템 콜이 발생하지만 라이브러리 호출 자체는 사용자 모드에서 실행된다
- 목적에 따라 다양한 종류의 return type을 갖으며 개발을 쉽게 하거나 시스템 콜의 호출을 최소화 하기 위해 제공된다
- 예를 들어 파일 입출력 시에 System Call 함수인 read()와 write()를 호출하면 호출할 때마다 커널 모드로 전환되어 바로 파일에 read/write가 된다. 반면에 라이브러리 함수인 fread(), fwrite()의 경우에는 buffer를 사용해 내부적으로 한 번만 read(), write()를 호출하기 때문에 시스템 자원의 효율적인 사용과 접근 횟수를 줄일 수 있다.
- 내부적으로 System Call을 감싸고 있다고 해서 wrapper 함수라고도 부른다
- Windows API, POSIX API, Java API 등이 존재한다
위의 그림을 가지고 최종적으로 Library와 System Call이 동작하는 방식을 설명하겠다
이로써 System Call에 대한 포스팅을 마치고 다음 포스팅은 PCB(Process Control Block)과 Context Switching에 관한 내용을 다룰 예정이다.
3.30 ~ 3.31은 지방에 일이 생겨 지방에 내려가는 관계로 포스팅은 없을 예정이다.