시스템 콜, 시스템 호출(System Call)이란?
운영체제는 다양한 서비스를 수행하기 위해 하드웨어를 직접 관리한다. 반면 응용 프로그램은 운영체제가 제공하는 인터페이스를 통해서만 하드웨어와 통신할 수 있다. 운영체제가 제공하는 이러한 인터페이스를 '시스템 콜(System Call)'이라고 한다.
시스템 콜은 이러한 커널 영역의 기능을 사용자 모드가 사용 가능하게 한다. 즉, 프로세스가 하드웨어에 직접 접근해서 필요한 기능을 수행할 수 있게 해 준다. (즉, 응용프로그램은 시스템 콜을 사용해서 원하는 기능을 수행할 수 있음)
보통 직접적으로 시스템 콜을 사용하기보다는 API(라이브러리 함수)를 통해 제어한다.
위의 그림처럼 운영체제는 메모리에 프로그램 적재, I/O 처리, 파일시스템 처리 등 여러 서비스들을 제공하는데 사용자 프로세스는 이에 직접적인 접근이 아닌 시스템 콜 호출을 통해 서비스를 제어한다.
커널(Kernel)이란
컴퓨터의 전원을 켜면 운영체제는 이와 동시에 수행된다. 소프트웨어가 컴퓨터 시스템에서 수행되기 위해서는 메모리에 그 프로그램이 올라가 있어야 한다. (폰노이만 아키텍처) 마찬가지로 운영체제 자체도 소프트웨어로서 전원이 켜짐과 동시에 메모리에 올라가야 한다.
하지만 운영체제처럼 규모가 큰 프로그램이 전부 메모리에 올라가면 한정된 메모리 공간이 낭비될 것이기 때문에 운영체제 중 항상 필요한 부분만을 전원이 켜짐과 동시에 메모리에 올려놓고, 그렇지 않은 부분은 필요할 때 메모리에 올려서 사용하게 된다. 이때 메모리에 상주하는 부분을 커널(kernel)이라고 한다.
즉, 커널은 메모리에 상주하는 부분으로써 운영체제의 핵심적인 부분을 뜻한다.
(그래서 보통 '운영체제'라고 하면 kernel을 뜻한다.)
CPU 모드
CPU는 사용자 애플리케이션(User application)이 시스템을 손상시키는 것을 방지하기 위해서 두 가지 모드를 제공한다.
Mode bit로 해당 모드를 구분하며 0은 '커널 모드(kernel Mode)', 1은 '사용자 모드(user mode)'로 나뉘어서 구동된다. 프로그램이 구동되는 데 있어서 파일을 읽거나, 쓰거나, 혹은 화면에 메시지를 출력하는 등 많은 부분이 커널 모드를 사용한다.
- 사용자 모드(User Mode)
사용자 모드에서 사용자 애플리케이션 코드가 실행된다. 사용자가 접근할 수 있는 영역에 제한이 있기 때문에 해당 모드에서는 하드웨어(디스크, I/O등)에 접근할 수 없다.
이에 접근하기 위해서는 '시스템 콜(System Call)'을 사용해야 한다.
- 커널 모드(Kernel Mode)
운영체제가 CPU를 사용하는 모드이다. 시스템 콜을 통해 커널 모드로 전환되면 운영체제는 하드웨어를 제어하는 명령어(Privileged Instructions)를 실행한다. 사용자 모드에서 이를 실행하면 당연하게도 exception이 발생한다.
예제를 살펴보자
#include <stdio.h>
int main()
{
...
printf("Hello, world");
...
return 0;
}
printf() 함수는 사용자 모드에서 수행되어 stdio 라이브러리를 호출한다. stdio 라이브러리는 시스템 콜인 write() 메서드를 호출하고, 실행의 흐름은 커널 모드로 바뀐다. 커널은 호출을 실행하여 모니터에 문자열을 출력하고 실행의 흐름을 다시 사용자 모드에게 넘긴다. printf() 함수의 다음 단계를 마저 진행한다.
참조 사이트
'프로그래밍 > 운영체제' 카테고리의 다른 글
서비스(Service) vs 데몬(Daemon) (0) | 2024.03.25 |
---|---|
커널 오브젝트(Kernel Object)에 대해서 (2) | 2024.01.24 |
스레드(Thread)란 (6) | 2023.07.31 |
프로세스 제어 블록 (PCB, Process Control Block)란? (8) | 2023.07.20 |
프로그램의 실행 (6) | 2023.07.20 |
댓글