이번 포스팅에서는 System Call과 Library Call에 대해 다루어 보겠습니다.
System Call과 Library Call의 주요 차이점은 System Call은 커널에 대한 Resource Access 요청이고,

Library Call은 프로그래밍 라이브러리에 정의 된 함수를 사용하라는 요청입니다.

운영 체제는 응용 프로그램이 하드웨어 리소스에 접근 할 수 있도록하는 Interface입니다. 

운영 체제는 메모리 관리, 프로세스 관리, 데이터 보안 등과 같은 컴퓨터 시스템의 주요 작업을 수행합니다. 

커널은 이러한 운영 체제의 핵심입니다.

System Call 및 Library Call은 운영 체제와 관련된 두 가지 용어입니다. 

커널은 System Call을 제공하는 반면 프로그래밍 라이브러리는 Library Call을 제공합니다. 

■ System Call
컴퓨터 시스템에는 Kernel Mode와 User Mode의 두 가지 모드가 있습니다. 

Kernel Mode에서 프로그램은 메모리 및 하드웨어 리소스에 직접 액세스 할 수 있습니다. 

User Mode에서 프로그램은 메모리 및 하드웨어 리소스에 직접 액세스 할 수 없습니다. 

 

대부분의 프로그램은 User Mode에서 실행됩니다. 

프로그램에 메모리나 하드웨어 리소스가 필요한 경우 System Call을 사용하여 커널에 요청을 보냅니다. 

그런 다음 모드가 User Mode에서 Kernel Mode로 전환되고, 작업이 끝나면 모드가 Kernel Mode에서 User Mode로 다시 바뀝니다. 

이러한 모드 전환을 Context Switching이라고 합니다.

UNIX 시스템에서 두 가지 System Call 예를 들어 보겠습니다.
- fork() : 기존 프로세스를 유지하면서 새 프로세스를 작성하는 데 사용됩니다.

               특정 프로세스가 fork()를 호출하면 프로세스의 사본이 작성됩니다.

               따라서 두 가지 프로세스가 있습니다.

               하나는 Parent 프로세스이고 작성된 새 프로세스는 Child 프로세스입니다.

- exec() : 새 프로세스를 작성하고 종료 프로세스를 새 프로세스로 바꿉니다.

                따라서 exec()를 호출하면 새 프로세스 만 존재합니다.

                즉, System Call을 수행 한 프로세스가 파괴됩니다.

 

- System Call 종류


■ Library Call
Library Call은 프로그래밍 라이브러리에서 제공하는 기능을 사용하도록 요청합니다.

프로그래머가 특정 Library Call을 사용하는 경우 먼저 관련 라이브러리를 가져와야 합니다.

C 프로그래밍에서 프로그래머는 프로그램에 헤더 파일을 포함시켜 라이브러리 함수를 호출 할 수 있고,

전처리기 지시문 (#include)을 사용하여 헤더 파일을 포함시켜 사용할 수 있습니다.

헤더 파일에 예를 들면, stdio.h 헤더 파일에는 입력 및 출력 조작을 수행하는 다양한 기능이 포함되어 있습니다.

fopen()은 파일을 여는데 사용되는 반면, fclose()는 파일을 닫는데 사용됩니다.

printf() 기능은 형식화 된 출력을 표준 출력 장치로 보낼 수 있고, scanf() 기능은 표준 입력 장치에서 형식화 된 입력할 수 있습니다.

또한 "math.h"헤더 파일에는 수학 연산을 수행하는 기능이 포함되어 있습니다. 

"time.h"헤더 파일에는 시간 및 데이터 계산을 수행하는 기능이 있습니다. 

"string.h"헤더 파일에는 문자열 조작을 수행하는 기능이 있습니다.

■ System Call과 Library Call 차이
- System Call은 자원에 Access하기하기 위해 커널 모드로 들어가기 위해 프로그램이 커널에 요청한 반면,

Library Call은 프로그램이 프로그래밍 라이브러리에 정의 된 기능에 Access하기 위한 요청입니다.

- UNIX / LINUX의 Manul은 명령어 man(manual)을 통해서 제공되고 있으며, manual의 영역에 따라 Section 번호를 제공합니다. 

System Call은 Section 2번을 사용하고, Library Call은 Section 3번을 사용합니다.

 

- 비교 자료

 

■ read() / write() 및 fread() / fwrite() 비교
Library Call을 사용하더라도 내부적으로 System Call을 사용합니다.

fread() / fwrite()의 경우 내부적으로 Buffer에 데이터을 쌓았다가 일정 크기 이상이 되면 read() / write()를 실행합니다. 

 

read() / write() 같은 System Call을 사용하는 것보다 fread() / fwrite() 같이 Library Call을 사용함으로써,

System Call의 호출 빈도가 확연하게 줄어드는 것을 알 수 있습니다.