운영체제 구조
운영체제(Operating System, OS)는 응용 프로그램(Application program)과 컴퓨터 하드웨어 간의 관계를 중재하고 관리한다. 응용 프로그램의 요청을 하드웨어 자원을 추상화하여 제공함으로써 처리하고, 여러 응용 프로그램이 제한된 하드웨어 자원을 적절히 나눠 사용할 수 있도록 관리하는 역할을 한다.
또한, 사용자가 운영체제 기능과 서비스를 조작할 수 있도록 인터페이스를 제공함으로써, 내부 구조를 정확히 알지 못해도 응용 프로그램을 사용해 특정 행동을 수행할 수 있도록 한다. OS는 쉘(Shell)이라는 사용자 인터페이스를 제공하며, 사용자는 이를 이용해 파일 관리, 작업 관리 등 다양한 기능을 수행한다.
*'쉘'이라는 이름은 OS의 최외곽 레이어라는 의미로 붙여진 이름이다.
운영체제는 응용 프로그램에게도 인터페이스를 제공하는데, 이때의 인터페이스를 API(Application Programming Inteface)라고 하며, 특정 코드를 통해 운영체제의 어떤 동작을 수행할 수 있도록 함수를 제공하는 것이다.
사실상 사용자 인터페이스인 쉘 또한 응용 프로그램의 일종이기 때문에, 쉘도 운영체제와 소통하기 위해서는 API를 사용한다.
시스템 콜
이처럼 외부에서 운영체제의 각 기능을 사용하기 위해 특정 시스템을 호출하게 되는데 이러한 명령 또는 이를 위한 함수를 시스템 콜(System Call)이라고 한다. 결국 API도 이러한 시스템 콜을 호출하는 형식으로 만들어지는 경우가 대부분이다. 즉, 시스템 콜은 운영체제 기능을 호출하는 함수이고, API는 유저와 좀 더 가까운 위치에서 다양한 언어를 이용하여 운영체제 기능 호출을 하는, 시스템 콜에 덧씌워진 함수(인터페이스)이다. 여담으로, 리눅스는 C언어로 만들어져 있기 때문에 C언어에서는 별도의 API 없이 바로 시스템 콜을 호출할 수도 있다.
위 그림에서는 OS, 시스템 콜, API와 쉘을 모두 분리해서 표기하였지만, 사실상 운영체제라는 용어는 쉘 인터페이스까지를 모두 아우르는 개념이다. 좀 더 정확히 이야기를 하자면 위 그림에서 OS로 표시된 부분은 하드웨어를 관리하는, 운영체제의 핵심파트, 커널(kernel)이라고 할 수 있다.
커널
커널은 컴퓨터가 켜져 있는 동안 운영체제 내에서 상시 동작하는 시스템 프로그램(System program)으로, 메모리 관리 및 디스크 관리, 프로세스 관리 등 하드웨어와 근접한 곳에서 서비스를 제공한다.
현대의 컴퓨터는 기본적으로 하드웨어를 추상화하여 관리하는데, 이러한 특징 덕에 제조사별로 상이한 물리적 특성을 고려하지 않고도 프로그램을 수행할 수 있다. 한편으로는, 이러한 특성 탓에 하드웨어 제어권과 프로그램 제어권은 전적으로 운영체제에 의해서만 관리된다.
이 때문에 특권 명령(Privileged Instruction)을 수행하거나 하드웨어에 대한 접근 권한이 필요한 경우에는 커널에 직접 접근하여 작업을 진행해야 하는데, 이러한 접근을 커널 모드(kernel mode)라고 하고, 그 반대, 즉 일반적인 접근을 사용자 모드(user mode)라고 한다.
응용 프로그램이 하드웨어를 이용하기 위해서는 커널 모드를 이용해야 하며, 이를 위해서는 반드시 시스템 콜을 사용해야 한다. 이러한 시스템 콜은 운영체제가 제공하며 프로그래밍 언어들은 이러한 시스템 콜을 기반으로 API를 작성하게 된다. 이렇게 제공된 API를 이용해서 응용 프로그램은 운영체제에게 기능 사용을 요청하는 것이고, 운영체제는 시스템 콜을 호출함으로써 커널 모드로 전환하여 작업을 수행하게 되는 것이다.
이때 응용 프로그램이 시스템 콜을 거치지 않고 강제로 자원을 이용하는 등 전체 컴퓨터 시스템을 해칠 수 있는 동작을 방어할 수 있어야 하는데, 이를 위한 구조를 Protection Rings라고 하며 위 그림에서 Ring 0을 커널 모드, Ring 3을 사용자 모드라고 한다.
프로그램에 의해 API가 호출되고, API에 의해 시스템 콜이 호출되는 과정을 도식화한 예시는 다음과 같다.
위 과정을 좀 더 자세히 살펴보면 다음과 같다.
응용 프로그램이 실행되어 운영체제 기능이 필요한 API인 open() 함수를 실행할 경우 시스템 콜이 호출되어 사용자 모드에서 커널 모드로 전환되고 OS 내부에서 명령이 실행된다. 이때 시스템 콜은 헤더 파일 형태로 제공되며, C언어 등에선 이를 직접 응용 프로그램 내에 선언하여 사용한다.
시스템 콜 매개변수 전달
OS나 시스템 콜의 종류에 따라 전달해야 하는 매개변수(parameter)가 여러 개일 수 있다. 이처럼 OS 측에서 시스템 콜을 호출하기 위해 매개변수를 전달하는 것을 매개변수 전달(parameter passing)이라고 하며, 이는 기본적으로 프로세스의 레지스터(register)를 통해 수행된다.
하지만, 레지스터의 물리적 개수보다 많은 매개변수가 전달되어야 할 경우 이 방식을 사용할 수 없다는 문제점이 있어 일반적으로는 다음 두 가지 방법을 사용하여 매개변수를 전달하게 된다.
첫 번째는 Memory, Block 혹은 Table을 이용하는 Block 방식이다. 전달되어야 하는 매개변수가 Block에 저장되고, 그 주소 자체를 매개변수로 하여 전달하는 방식으로, Linux 운영체제에서 주로 사용된다.
두 번째는 Stack 방식으로, 이름에서 알 수 있듯이 각 매개변수가 별도의 Stack에 저장되고 OS에 의해 Push와 Pop이 수행된다. 즉, 각 매개변수를 Stack에 push 하여 저장한 후 필요할 때마다 pop 하는 방식으로 동작하는 것이다.
더 알아보기: 응용 프로그램 v.s 시스템 프로그램
응용 프로그램이란 사용자의 필요에 따라 다양한 작업을 수행할 수 있도록 개발된 소프트웨어 프로그램을 의미한다. 응용 프로그램은 자체적으로 실행될 수 없으며 동작을 위해 시스템 프로그램 및 런타임 등의 관련 지원 환경을 필요로 한다.
반면 시스템 프로그램은 컴퓨터 하드웨어 위에 위치하여 다양한 응용 프로그램을 실행할 수 있도록 설계된 컴퓨터 프로그램으로, 컴퓨터 시스템이 시작될 때 자체적으로 실행되며 시스템이 켜져 있는 한 계속 실행되는 프로그램이다. 이는 컴퓨터 하드웨어와 응용 프로그램 사이 중간 계층으로, 시스템 콜 대신 실질적으로 유저와 소통하며 응용 프로그램을 설치하고 운영할 수 있는 환경을 제공하고 유지한다. 시스템 프로그램은 하드웨어와 시스템 구성 요소 사이를 조정하므로 저수준 소프트웨어(low-level software)라고도 한다. 운영체제의 커널이 가장 일반적인 시스템 프로그램으로, 이 외에도 펌웨어, BIOS 등이 존재한다.
응용 프로그램과 시스템 프로그램은 서로 다른 목적으로 개발되었지만 둘 다 기본적으로 컴퓨터 프로그램이다. 시스템 프로그램이 없으면 응용 프로그램을 실행할 수 없고 응용 프로그램이 없으면 시스템 프로그램은 사용자의 요구에 따른 동작을 원활히 수행할 수 없게 된다.
'컴퓨터 공학 기본 > 운영체제 (OS)' 카테고리의 다른 글
01. 운영체제 (0) | 2023.04.15 |
---|---|
03. 운영체제의 역사 (1970~2000) (0) | 2023.04.15 |
02. 운영체제의 역사 (1950~1960) (0) | 2023.04.15 |
댓글