이번 포스터에서는 운영체제의 구조에 대해 간단하게 알아보자.


운영체제의 구조


운영체제는 우리가 흔히 아는 ‘소프트웨어’ 중 하나이지만, 그 목적이 컴퓨터를 사용하는데 도움을 주는 소프트웨어이다. 따라서 당연히 있는 것처럼 느껴지고 무엇을 하는지 잘 와닿지 않지만, 많은 역할이 있다.


운영체제, 응용 프로그램, 컴퓨터 하드웨어의 관계

사진1. 운영체제 구조
출처 : https://ko.wikipedia.org/wiki/운영체제


운영체제를 도서관으로 비유하면 이해가 참 쉽다. 운영체체가 도서관이면 응용 프로그램은 시민이 되고, 컴퓨터 하드웨어(리소스)는 이 된다. 시민(응용 프로그램)도서관(운영체제)에 원하는 책(자원, 하드웨어)을 요청한다. 도서관은 적절한 을 찾아서 시민에게 빌려준다. 의 사용기한이 다하면 도서관에서 을 회수해간다.

  • 운영체제는 응용 프로그램이 요청하는 메모리를 허가하고 분배한다.
  • 운영체제는 응용 프로그램이 요청하는 CPU 시간을 제공한다.
  • 운영체제는 응용 프로그램이 요청하는 IO Devices 사용을 허가/제어한다.


인터페이스(Interface) 제공

운영체제는 다양한 인터페이스를 제공하는데, 사용자응응 프로그램에 대해 각각 필요한 인터페이스를 제공한다.

1. 사용자 Interface

  • 쉘(Shell) : 사용자가 운영체제 기능과 서비스를 조작할 수 있도록 인터페이스 제공
  • 쉘은 CLI(터미널)과 GUI(마우스) 환경 두 종류로 분류하여 제공한다.
  • 물론 쉘도 하나의 응용프로그램이다.

2. 응용 프로그램 Interface

  • 응용프로그램과 대화할 수 있는 의사소통 수단인 API를 제공한다.
  • API 안에는 시스템콜(System Call)이라는 함수가 들어있다.
  • 실제로 운영체제에 요청을 할 때는 시스템 콜을 이용한다.


시스템 콜(System Call)

시스템 콜 또는 시스템 호출 인터페이스라고 불리는 함수의 모음이다. 사람이 API를 작성할 때 실제로 운영체제의 각 기능을 이용하기 위해 시스템 콜 함수를 호출하는 방식을 사용한다. 표준적인 시스템 콜 함수를 정의하고 있는 문서가 있다. 유닉스 기반의 OS의 경우 POSIX API을 사용하고 윈도우의 경우 윈도우 API가 있다.


사진2. 운영체제 구조(System Call)
출처 : 패스트캠퍼스


API시스템 콜이 약간 혼동될 수 있는데, 시스템 콜은 웅영체제의 기능을 호출하는 함수이고, API의 경우 각 언어별로 시스템 콜을 사용해 운영체제의 기능을 사용하는 인터페이스 함수를 말한다.


이처럼 운영체제는 컴퓨터에서 매우 중요한 역할을 한다. 대부분의 컴퓨터 자원을 관리하고 제어하기 때문에 잘못 다루게 되면 컴퓨터 큰 손상을 입힐 수 있다. 따라서 컴퓨터 소스를 관리할 수 있는 운영체제의 기능을 이용하기 위해서는 권한이 필요한데, 이것을 Protection Rings라고 부른다.


사진3. 운영체제 구조(Protect Rings))
출처 : 패스트캠퍼스


Protection Rings

CPU와 같이 컴퓨터 자원에 함부로 접근하지 못하도록 운영체제가 Protection Rings를 제공한다. 따라서 보통 CPU Protection Rings이라고 부른다. 각 Ring별로 접근 권한이 잇는데, 크게 2가지 권한만 알고 있으면 될 것 같다. 다양한 구조가 있지만, 크게 사용자(User) 모드커널(kernel) 모드가 있다. 마치 주민등록본은 사무소 또는 민원24와 같은 정부 사이트에서 신청서를 작성해야만 발급이 되는 원리가 같다고 보면 된다. 반드시 사용자 모드 또는 커널 모드를 거쳐야만 리소스에 접근이 가능하다.


응용 프로그램이 하드웨어 자원을 사용하려면 반드시 시스템 콜을 거쳐야 한다. 왜냐하면 응용 프로그램의 요청은 사용자 모드에서 실행되는 것이고, 결국 운영체제를 거쳐야하기 때문이다. 운영체제가 CPU에 접근할 때는 커널 모드로 변환이 이루어지고, 최종적으로 CPU에 접근하게 된다. 응용 프로그램이 직접 CPU에 접근하는 것은 불가능하다. 또한 이런 시스템이 잘 구현될 수 있도록 OS를 개발해야한다.


지금까지 OS의 구조에 대해 알아보았다. 만약 우리가 시스템 개발자라면, 이 내용보다는 더 깊숙한 부분까지 알고 있어야하지만, 응용 프로그래머이기 때문에 이 정도의 지식으로도 충분하다고 생각한다. 단어가 나와서 설명을 하면 응용 프로그래머는 high-level 프로그래밍 언얼을 이용해 다양한 API를 개발하는 직군이고, 시스템 프로그래머는 위에서 다룬 내용인 Shell, OS, system Call 등의 함수를 개발하는 직군이다.


읽어주셔서 감사합니다.(댓글과 수정사항은 언제나 환영입니다!)