reference : [도서] 쉽게 배우는 운영체제


 

3.1 커널과 인터페이스

커널(kernel)은 프로세스 관리, 메모리 관리, 저장장치 관리와 같은 운영체제의 핵심 기능을 모아놓은 것으로 자동차에 비유하자면 엔진에 해당한다. 자동차의 성능을 엔진이 좌우하듯, 운영체제의 성능은 커널이 좌우한다.

스마트폰의 운영체제에도 커널이 있는데, 구글의 안드로이드는 커널이 공개되어 있지만 애플의 iOS는 안드로이드와 달리 커널을 공개하지 않고 자사 제품에만 탑재한다. 둘 다 유닉스 커널을 기반으로 한다.

자동차 계기판이 엔진의 상태를 알려주듯, 운영체제에도 상태를 알려주는 인터페이스가 있다. 

위의 그림처럼, 사용자와 응용프로그램에 인접하여 커널에 명령을 전달하고, 실행 결과를 사용자와 응용프로그램에 돌려주는 인터페이스와 운영체제의 핵심 기능을 모아둔 커널의 두 부분으로 크게 나뉜다. 운영체제는 커널과 인터페이스를 분리하여, 같은 커널이지만 다른 인터페이스를 가진 형태로 제작할 수 있고 그럴 때 사용자에게는 다른 운영체제처럼 보인다.

유닉스의 사용자 인터페이스는 셸(shell)이라고 하며, C셸(csh), T셸(tsh), 배시셸(bash) 등 여러 종류의 셀이 있다. 

 

3.2 시스템 호출과 디바이스 드라이버

3.2.1 시스템 호출

시스템 호출(system call)은 커널이 자신을 보호하기 위해 만든 인터페이스인데, 사용자나 응용 프로그램으로부터 컴퓨터 자원을 보호하기 위해 자원에 직접 접근하는 것을 차단한다. 따라서 시스템 호출이라는 인터페이스를 통해 사용자는 자원에 접근할 수 있다.

자원에 직접 접근하는 것과 시스템 호출을 통해 접근하는 것은 어떤 차이가 있을까?

  • 직접 접근 : 사용자가 직접 컴퓨터 자원에 접근하는 것으로, 좌측의 그림처럼 모든 것을 처리해야 하기 때문에 사용자의 취향대로 하기엔 좋지만, 커피머신(컴퓨터 자원)을 보호하기 어렵다.
  • 시스템 호출을 통한 접근 : 누군가에게 요청하여 작업결과만 받기 때문에, 커피머신(컴퓨터 자원)이 망가지는 일을 막을 수 있다. 일반적으로 이처럼 시스템 자원을 사용할 수 있도록 시스템 호출을 사용한다.

A 프로그램은 10, B 프로그램은 200을 저장하려고 하는 상황일때, 응용 프로그램 입장에서 두 접근방식의 차이점을 살펴보자. 

  • 직접 접근 : 각 응용프로그램이 마음에 드는 위치에 데이터를 저장하려 하기 때문에, 다른 사람의 데이터를 지우거나 내 데이터가 지워지는 일이 발생할 수 있다.
  • 시스템 호출을 통한 접근 : 커널이 제공하는 write() 함수를 통해 데이터를 저장해달라고 요청하기 때문에, 데이터의 저장 위치를 알 수 없지만 언제든 read() 함수로 시스템 호출을 이용하여 데이터를 가져올 수 있다. 

 

시스템 호출은 커널이 제공하는 서비스를 모아놓은 것이며 함수 형태로 제공된다. C언어의 printf() 함수도 시스템 호출 중 하나이다. 

참고 : 시스템 호출과 유사한 용어로 API (Applircation Programming Interface) 와 SDK (System Developer's Kit) 가 있다. API는 응용 프로그램이 자신과 연관된 프로그램을 만들 수 있도록 제공하는 인터페이스이다. 포토샵이라는 그래픽 프로그램에서는 수백가지의 모든 필터를 제공하지 않는다. 하지만, 필터를 개발하려는 사람들을 위해 다양한 프로그래밍 인터페이스를 제공하는데, 그것이 바로 API다. API는 시스템 호출보다 광범위한 개념이며, 운영체제의 API를 시스템 호출이라 정의할 수 있다.

SDK는 프로그램 개발자를 위해 API 및 API 사용 매뉴얼, 코드 편집기, 에뮬레이터 등의 응용 프로그램들을 하나로 묶어 배포하는 개발 툴을 말한다. 대표적인 예로 Android Studio가 있다.

요약 : 시스템 호출은 커널이 제공하는 시스템 자원의 사용과 연관된 함수이다. 응용 프로그램이 하드웨어 자원에 접근하거나 운영체제가 제공하는 서비스를 이용할 때는 시스템 호출을 사용해야 한다. 운영체제는 시스템 호출을 통해 컴퓨터 자원을 보호하며, 이는 사용자에게 커널 영역에 진입할 수 있도록 서비스를 제공하는 수단이다.

 

3.2.2 드라이버

응용프로그램, 커널의 인터페이스가 시스템 호출이었다면, 하드웨어의 인터페이스는 드라이버가 담당한다. 종류가 다양한 하드웨어를 모두 사용할 수 있는 환경을 제공하기 위해 커널이 모든 인터페이스를 개발하기는 어렵다. 그래서 커널은 입출력의 기본적인 부분만 제작하고 하드웨어의 특성을 반영한 소프트웨어를 하드웨어 제작자에게 받아 커널이 실행될 때 함께 실행되도록 하는데, 이 소프트웨어를 디바이스 드라이버라고 한다.

마우스, 키보드 등의 단순한 드라이버는 일반적으로 커널에 포함되어 있어 컴퓨터에 꽂기만 해도 작동하지만, 그래픽카드, 프린터 등의 크고 복잡한 드라이버는 사용자가 직접 설치해야 하는 경우가 있다.

시스템 호출 부분은 커널 앞부분을 모두 감싸고 있기 때문에 시스템 호출을 통해서만 커널에 접근할 수 있지만, 드라이버는 커널 전체를 감싸고 있지 않기 때문에 커널이 제공하는 드라이버도 있고 하드웨어 제작자가 제공하는 드라이버도 있다는 뜻이다. 즉, 하드웨어와 커널은 직접 연결되거나 간접적으로 (드라이버를 통해) 연결되기도 한다.

 

3.3 커널의 구성

핵심 기능  
프로세스 관리 프로세스에 CPU를 배분하고, 작업에 필요한 환경을 제공한다.
메모리 관리 프로세스에 작업 공간을 배치하고 실제 메모리보다 큰 가상공간을 제공한다.
파일 시스템 관리 뎅터를 저장하고 접근할 수 있는 인터페이스를 제공한다.
입출력 관리 필요한 입력과 출력 서비스를 제공한다.
프로세스 간 통신 관리 공동 작업을 위한 각 프로세스 간 통신 환경을 지원한다.

커널의 기능은 유기적으로 얽혀있고, 기능을 구현하는 방법에 따라 단일형, 계층형, 마이크로 구조로 구분된다.

 

3.3.1 단일형 구조 커널

 

단일형 구조 커널은 초창기의 운영체제 구조로, 커널의 핵심 기능을 구현하는 모듈들이 구분 없이 하나로 구성되어 있다. MS-DOS, VMS, 초기의 유닉스 운영체제가 여기에 속한다. 거의 다 초창기의 운영체제인데, 당시엔 기능을 구현하느라 모듈을 분리할만한 여력이 없었다. 이를 프로그래밍에 비유한다면 함수를 거의 사용하지 않고 main() 에 모든 기능을 구현한 것이다.

  • 장점 : 모듈간 분리가 거의 없어서, 모듈 간의 통신 비용이 줄어들어 효율적 운영이 가능하다. main() 에 모든 기능을 넣으면 함수 호출하는 오버헤드가 없어서 프로그램이 빨라지는 것과 같은 이치이다.
  • 단점 : 모듈이 하나로 묶어였기 때문에 버그나 오류를 처리하기 어렵고, 여러 기능이 서로 연결되어 있어 상호 의존성이 높아 작은 결함이 시스템 전체로 확산될 수 있다. 수정이 어렵기 때문에 다양한 환경의 시스템에 적용하기 어렵다. 현대의 운영체제는 매우 크고 복잡하기 때문에 단일형 구조를 구현하기가 어렵다.

 

3.3.2 계층형 구조 커널

단일형 구조에서 발전된 형태로, 비슷한 기능의 모듈을 묶어 하나의 계층을 만들고 계층간의 통신을 통해 운영체제를 구현하는 방식이다. 비슷한 기능을 모았기 때문에 단일형보다 쉽게 버그를 처리할 수 있으며 오류 발생 시 커널 전체가 아닌 해당 계층만 수정하면 되므로 디버깅하기도 쉽다. MS사의 윈도우를 비롯한 오늘날의 대부분의 운영체제는 이 구조로 이루어져 있다. 

 

3.3.3 마이크로 구조 커널

계층형 커널이 다양한 하드웨어와 사용자의 요구를 충족하기 위해 계속 커널과 기능을 추가하면서 크기가 커지고 하드웨어의 용량이 늘어남에 따라 오류도 잡기 어려워졌다. 이러한 접근 방식과 반대로 개발된 커널이 마이크로 구조(micro architecture) 커널이다. 

마이크로 구조 커널의 운영체제는 기본적인 기능만 제공한다. 다른 커널에 비해 많은 부분이 사용자 영역에 구현되어 있다. 커널은 메모리와 프로세스의 동기화 서비스를 제공하며 각 프로세스는 통신 모듈로 연결되어 있다. 따라서 각 모듈은 독립적으로 작동하기 때문에 하나의 모듈이 실패하더라도 전체 운영체제가 멈추지 않는다. 또한 커널이 가벼워서 CPU 용량이 작은 시스템에도 적용이 가능하다. 대표적으로 마하(Mach)가 있다.

 

3.4 가상머신

C언어는 어셈블리어의 기능을 가지고 있는데, 이 언어로 만든 운영체제가 유닉스이다. 하지만 C 언어는 유닉스와 다른 커널을 가진 운영체제와의 호환성이 떨어진다. 예를 들면 윈도우에서 C언어 코드가 작동하지 않기 때문에, 코드를 윈도우에 맞게 수정해야 한다. 또한 유닉스 버전이 다양해지면서 유닉스끼리 호환이 되지 않는 경우도 있다.

이러한 호환성 문제를 해결한 언어가 바로 자바이다. 자바는 대부분의 운영체제에서 작동한다. 그 이유는 자바가 작동할 때, 운영체제 위에 가상머신을 만들고 그 위에서 응용프로그램이 작동되기 때문이다. 자바는 유닉스와 윈도우에서 작동하는 가상머신을 만들어 배포하는데, 이를 자바 가상머신(Java Virtual Machine, JVM) 이라 부른다.

만약 두 개의 운영체제를 같이 설치하고 싶다고 하면, 하나의 운영체제에 가상머신을 설치하여 사용할 수 있다. 그렇게 되면 응용 프로그램이 가상머신 내에서 작동할 수 있다.

+ Recent posts