- [CS] 커널(Kernel) & 시스템 콜(System Call) & 인터럽트(Interrupt)2022년 12월 04일 00시 27분 07초에 업로드 된 글입니다.작성자: nickhealthy
커널(Kernel)과 인터페이스(Interface)
커널(Kernel)
커널(Kernel)은 프로세스 관리, 메모리 관리, 저장장치 관리와 같은 운영체제의 핵심적인 기능을 모아놓은 것으로, 자동차에 비유하자면 엔진에 해당된다. 자동차는 종류가 다양하지만 성능은 엔진이 좌우하는데, 이와 마찬가지로 운영체제의 성능은 커널이 좌우한다. 커널이 존재하는 이유는 시스템을 보호하기 위해 존재한다.
만약 커널이 없다면 우리가 작성한 프로그램이 함부로 하드웨어 자원을 다 점유해서 사용하고, 그래서 다른 프로세스가 영향을 받게되고, 그러다보면 전체 시스템이 붕괴될 수 있는 여러 가지 위험한 부분들을 방지하기 위해 시스템에 전반된 부분이나 하드웨어에 관련된 부분은 커널이 관리하게 된다. 따라서 우리가 작성한 프로그램은 커널을 통해서 시스템의 기능이나 하드웨어를 사용하게 함으로써 시스템이 안정적으로 돌아갈 수 있도록 보호하기 위해 커널모드를 만들었다.
커널을 정리하자면 다음과 같다.
- 운영체제의 핵심 기능
- 시스템의 전반을 관리/감독하는 역할
- 하드웨어와 관련된 작업을 직접 수행하게 된다.
인터페이스(Interface)
운영체제에도 인터페이스가 있는데, 이는 커널에 사용자의 명령을 전달하고 실행 결과를 사용자에게 알려주는 역할을 한다.
운영체제는 크게 두 부분으로 나뉜다. 사용자와 응용 프로그램에 인접하여 커널에 명령을 전달하고 실행 결과를 사용자와 응용 프로그램에 돌려주는 인터페이스와, 운영체제의 핵심 기능을 모아놓은 커널이 그것이다.
시스템 콜(System Call)
시스템 콜(System Call)은 운영 체제의 커널이 제공하는 서비스에 대해, 응용 프로그램의 요청에 따라 커널에 접근하기 위한 인터페이스다. 즉, 프로그램이 OS 커널이 제공하는 서비스를 이용하고 싶을 때 시스템 콜을 통해 실행한다.
커널은 운영체제의 핵심 기능을 담당하면서, 사용자나 응용 프로그램으로부터 컴퓨터 자원을 보호하기 위해 자원에 직접 접근하는 것을 차단한다. 따라서 컴퓨터 자원을 이용하려면 시스템 콜이라는 인터페이스를 이용하여 접근해야 한다.
위의 내용을 쉽게 요약하자면 운영체제가 제공하는 서비스를 사용자가 이용할 수 있도록 해주는 것이다.
시스템 콜의 구조
운영체제는 크게 사용자 모드(User Mode)와 커널 모드(Kernel Mode)로 나뉘어 구동된다.
사용자 모드(User Mode)는 응용 프로그램을 실행하고, 컴퓨터 자원(하드웨어)에는 직접 접근이 불가하다. System Call 호출 시 일시적으로 커널 모드로 전환되며 커널 영역의 기능을 사용자 모드가 접근하게 도와준다.
커널 모드(Kernel Mode)는 인터럽트나 시스템 콜을 커널이 직접 처리한다. 모든 시스템 메모리에 접근 가능하며, CPU 명령 실행이 가능하다(커널 코드). 운영체제에서 프로그램이 구동되는데 있어 파일을 읽어 오거나, 파일을 쓰거나, 혹은 화면에 메시지를 출력하는 등 많은 부분이 커널 모드를 사용한다.
System Call은 이러한 커널 영역의 기능을 사용자 모드가 사용 가능하게, 즉 프로세스가 System Call을 통해 컴퓨터 자원(하드웨어)에 접근해서 필요한 기능을 사용할 수 있게 해준다. 통상적으로 시스템 콜은 여러 종류의 기능으로 나뉘어져 있다.
아래의 이미지는 open() System call을 호출 했을 때 운영체제에서 어떻게 처리되는지를 보여준다. open() 함수 뿐 아니라 현재 프로세스의 종료할 때 사용하는 exit(), 자식 프로세스의 생성할 때 fork(), 파일을 지정자로부터 읽기,쓰기 할 때 read()/write() 함수 등이 존재한다.
사용자 모드에서 커널 모드로 전환되었을 때, 커널 모드는 방금 전까지 실행중이었던 프로그램의 현재 CPU 상태를 저장한다. 나중에 다시 프로그램을 실행하게 되었을 때도 이전 상태를 기억하고 멈췄던 부분부터 프로그램을 실행할 수 있기 때문이다. 모든 처리가 완료되면 중단됐던 프로그램의 CPU 상태를 복원한다. 중단됐던 프로그램을 다시 이어서 이전에 저장했던 프로그램의 CPU 상태를 복원하는 것이다.
시스템 콜이 필요한 이유
사용자가 응용 프로그램으로 운영체제의 치명적인 데이터를 수정/삭제하는 권한을 막기 위해서다. 즉, 시스템을 보호하기 위해 시스템 콜이 필요하다. 직접적인 하드웨어 요청이나 기타 시스템 요청은 OS가 제공하는 System Call을 통해 호출하도록 제공한다. 만약 유저 레벨의 응용 프로그램이 System Call을 호출하여 사용하면 해당 프로그램은 커널모드로 잠시 전환되는 작업을 거치게 된다.
시스템 콜의 종류
- 프로세스/스레드 관련
- 파일 I/O 관련
- 소켓 관련
- 장치(device) 관련
- 프로세스 통신 관련
이외에도 다양한 시스템 콜이 존재한다.
시스템 콜은 각각에 대응하는 커널 코드가 있다. 따라서 시스템 콜이 발생하게 되면 해당 커널 코드가 커널 모드에서 실행하게 된다.
프로그래밍 언어와 시스템 콜의 관계
하드웨어 혹은 시스템 관련 기능은 어떤 프로그램이라도 반드시 시스템 콜을 통해서만 사용이 가능하다. 하지만 프로그래머가 개발할 때 직접 OS 시스템 콜을 사용한 적이 없다. 그럼에도 불구하고 프로그래머는 파일 I/O, 네트워크 I/O, 프로세스/스레드 등 관련 작업을 잘 해왔다. 이게 어떻게 가능한 것일까?
답은 개발자가 사용하는 프로그래밍 언어들이 시스템 콜을 포장(wrapping)하여 간접적으로 사용할 수 있도록 제공했기 때문이다. 따라서 개발자는 프로그래밍 언어를 통해서 간접적으로 시스템 콜도 사용할 수 있게 되는 것이다.
시스템 호출을 정리하자면 다음과 같다.
- 시스템 콜은 커널이 제공하는 시스템 자원의 사용과 연관된 함수이다.
- 응용 프로그램이 하드웨어 자원에 접근하거나 운영체제가 제공하는 서비스를 이용하려 할 때는 시스템 콜을 사용해야 한다.
- 운영체제는 커널이 제공하는 서비스를 시스템 콜로 제한하고, 다른 방법으로 커널에 들어오지 못하게 막음으로써 컴퓨터 자원을 보호한다.
- 시스템 콜은 커널이 제공하는 서비스를 이용하기 위한 인터페이스이며, 사용자가 자발적으로 커널 영역에 진입할 수 있는 유일한 수단이다.
인터럽트(Interrupt)
시스템에서 발생한 다양한 종류의 이벤트 혹은 그런 이벤트를 알리는 메커니즘
사전적 의미로는 '끼어들다', '중단시키다' 정도의 의미를 가진 말로 프로그램을 실행하는 도중에 예기치 않은 상황이 발생할 경우 현재 실행중인 작업을 중단하고 발생된 상황을 처리한 후 다시 실행중인 작업으로 복귀하는 것을 말한다.
인터럽트는 시스템의 오류, 시스템에서 어떤 작업을 끝맞췄을 때 등 언제든지 발생할 수 있다. 아래 인터럽트의 종류를 보면 어떤 느낌인지 감이 올 것 같다.
인터럽트의 종류
- 전원(power)에 문제가 생겼을 때
- I/O 작업이 완료되었을 때
- 시간이 다 됐을 때(timer 관련)
- 프로그램에서 0으로 나눴을 때
- 잘못된 메모리 공간에 접근을 시도할 때
이외에도 다양한 인터럽트가 존재한다.
내부 인터럽트(=소프트웨어 인터럽트)
CPU 내부에서 발생하는 인터럽트, 잘못된 명령 혹은 데이터를 사용할 때 발생한다. Trap이라고 불리기도 한다. 프로그램 내부의 명령어에 의하여 고정적인 위치에서 발생하게 된다.(프로그램 오류라는 것임)
위의 인터럽트 종류에서 '프로그램에서 0으로 나눴을 때', '잘못된 메모리 공간에 접근을 시도할 때' 등이 Trap에 해당된다.
인터럽트의 동작 방식
인터럽트가 발생하게 되면 CPU에서는 즉각적으로 인터럽트 처리를 위해 커널 코드를 커널 모드에서 실행하게 된다.
같은 말로 커널 모드에서 커널이 이 인터럽트를 처리하기 위해서 주도적으로 CPU에서 실행이 된다.
만약 프로그램이 실행중이였다면 인터럽트는 언제든지 발생할 수 있기 때문에, 인터럽트는 프로그램의 명령어 실행 중에 발생했을 것이다. 이제 이 인터럽트 처리를 위해서 커널이 통제권을 넘겨받아 관련 처리를 진행하게 된다.
Ref
다음글이 없습니다.이전글이 없습니다.댓글