1. 커널과 인터페이스
커널Kernel은 프로세스 관리, 메모리 관리, 저장장치 관리와 같은 운영체제의 핵심적인 기능을 모아놓은 것이다.
자동차에 비유하자면 커널은 자동차의 엔진에 해당한다. 따라서 운영체의 성능은 커널이 담당한다고 생각하면 된다.
즉, OS의 핵심부분이고 항상 메모리에 적재되어 있다.
스마트폰 운영체제에도 커널이 있다. 유닉스 운영체제의 커널을 이용하여서 만든 구글의 안드로이드가 그 예이다. 유닉스 운영체제는 다양한 제조사가 이용하도록 커널 소스코드가 공개되어있다.
같은 커널을 이용하더라도 다른 인터페이스가 장착이 가능하다. 다른 인터페이스가 장착된다면 다른 운영체제로 보이게 된다.
우리가 사용하는 운영체제도 커널은 같은데 인터페이스가 달라서 다른 운영체제처럼 보이는 것이 많다.
예를 들면 유닉스의 사용자 인터페이스는 셸shell을 사용하는데 여기에는 C셸, T셸, 배시셸 등 여러 종류가 있다. 스티브 잡스의 매킨토시의 MacOS도 유닉스 커널을 사용한다. 사람들은 좋은 인터페이스의 컴퓨터를 사용하려는 경향이 있다.
(이를 이용한 사람이 바로 스티브 잡스이다.)
왜 인터페이스를 사용하는 것일까??
프로세스는 개발된 프로그래밍 언어가 모두 다르고, 시스템 콜(아래에서 설명하겠다)을 호출하는 방식이 모두 다르기 때문에 중간에 추상 계층이 필요하다.
운영체제와 커널의 차이는 무엇일까?
아래 그림에서도 볼 수 있듯이 커널은 운영체제에 포함되는 하나의 모듈의 개념이다.
운영체제는 커널을 포함해, 컴퓨터 시스템을 총괄하는 개념이다.
2. 시스템 호출과 디바이스 드라이버(커널 내부에 있는 것들이다)
1) 시스템 호출 System Call
시스템 콜은 커널이 자신을 보호하기 위해 만든 인터페이스이다. 커널은 사용자나 응용프로그램이 자원에 직접 접근하는 것을 차단한다.
자원을 이용하려면 시스템 호출이라는 인터페이스를 이용하여서 접근해야 한다. 프로세스가 OS 커널이 제공하는 서비스를 이용하고 싶을 때, 시스템 콜을 이용해서 실행한다.
직접 접근해야 더 편리할 거 같은데 왜 이렇게 할까?
직접 접근을 하면 사용자가 모든 것을 처리해야 한다. 그리고 보안도 취약해진다. 그래서 더 편리하고 안전한 시스템 호출이라는 방식을 사용한다. 예를 들어, C언어에서 printf 함수도 시스템 호출 함수의 한 종류이다.
시스템 콜이 호출되면 커널은 CPU에게 Interrupt를 발생하고, CPU는 다음 명령을 실행할 때 해당 내용을 체크하고, 해당 커널 코드를 실행하게 된다.
API와 SDK
API란 Application Programming Interface의 약자로 응용프로그램 인터페이스라고 한다. 응용프로그램이 자신과 관련된 프로그램을 만들 수 있도록 제공하는 인터페이스이다. 예를 들어 포토샵을 이용할 때, 포토샵 자체가 수백가지 필터를 모두 제공하지 않는다. 자신이 필요하면 포토샵은 필터를 개발하려는 사람들을 위해 다양한 프로그래밍 인터페이스를 제공한다.
UI가 사용자와 사용자가 다룰 대상을 연결한다면, API는 프로그램과 또 다른 프로그램을 연결해주는 일종의 다리라고 볼 수 있다.
SDK System Developer's Kit는 프로그램 개발자를 위해 API 및 API 사용 메뉴얼 뿐만 아니라 프로그램 개발에 필요한 코드편집기와 에뮬레이터(다른 프로그램이나 장치를 모방하는 컴퓨터 프로그램) 같은 개발용 응용 프로그램까지 하나로 묶어서 배포하는 개발 툴이다.
SDK를 활용하여 개발자는 이러한 시스템, 프로그래밍 언어에 따라 애플리케이션을 개발할 수 있다.
예를 들어 안드로이드 SDK인 Android Studio가 있다.
2) 드라이버
커널과 하드웨어의 인터페이스는 드라이버driver가 담당한다. 커널이 모든 하드웨어에 맞는 인터페이스를 다 개발하기는 어렵다. 커널은 입출력의 기본적인 부분만 제작하고 하드웨어의 특성을 반영한 소프트웨어를 하드웨어 제작자에게 받아 커널이 실행될 때 함께 실행되도록 한다.
이를 디바이스 드라이버 라고 한다.
예를 들어 그래픽카드나 프린터 같은 장치를 설치하고 해당 장치의 디바이스 드라이버를 설치해 주어야 한다.
3. 커널의 구성
커널의 기능은 프로세스 관리, 메모리 관리, 파일 시스템 관리, 입출력 관리, 프로세스간 통신 관리이다.
커널은 이러한 기능을 `어떻게` 구현하는가에 따라 단일형 구조 커널, 계층형 구조 커널, 마이크로 구조 커널로 구분된다.
1) 단일형 구조 커널 monolithic architecture
초창기 커널 구조로 커널의 핵심 기능을 구현하는 모듈들이 구분없이 하나로 구성된다.
ex) MS-DOS, VMS, 초기의 유닉스
프로그램 만들 때 main()에 모두 때려박은거라고 생각하면 된다. 프로그래밍에서처럼 모듈간의 통신 비용이 줄어들어 효율적으로 운영가능하다(속도가 빠름).
그런데 모든 모듈이 묶여잇어 버그나 오류 처리가 어렵다. 작은 결함이 크게 확산이 가능하다.
2) 계층형 구조 커널 layered architecture
비슷한 구조기능을 가진 모듈을 묶어서 하나의 계층으로 만든다. 디버깅 하기 쉽다
ex) 마이크로소프트의 윈도우 운영체제
3) 마이크로 구조 커널
커널이 계속 커져서 이제 오류가 잡기가 어려워졌다. 그래서 생긴 것이 마이크로 구조 커널이다.
프로세스 관리, 메모리 관리, 프로세스 간 통신 관리 등 가장 기본적인 기능을 제공하고 많은 부분이 사용자 영역에 구현되어 있다.
각 모듈은 세분화되어 존재하고 모듈 간의 정보교환은 프로세스 간 통신을 이용하여 이루어진다.
ex) 마하Mach -> 애플의 PC운영체제인 OS X와 모바일 iOS의 커널로 사용된다.
4. 가상 머신
맨 첨에 C언어로 유닉스 운영체제를 만들었는데, C언어는 호환성이 떨어진다.
윈도우 운영체제와 호환이 안되었던 것이다. 이걸 해결한 언어가 자바Java언어이다.
작동원리는 가상 머신virtual machine 을 만들고 그 위에서 작동하도록한다. 가상 머신은 운영체제와 응용 프로그램 사이에서 작동하는 프로그램이다.
ex) JVM (Java Virtual Machine)
'CS > 운영체제' 카테고리의 다른 글
병렬처리 (0) | 2020.10.26 |
---|---|
인터럽트 (0) | 2020.10.26 |
[운영체제] 컴퓨터 기본 구성 (0) | 2020.10.13 |
[운영체제] 운영체제의 역사 (0) | 2020.10.09 |
[운영체제] 운영체제란 무엇일까... (0) | 2020.10.07 |