지금까지 내용들은 조금 라이트 했다고 생각한다. 사실 저 정도는 전공자가 아니어도 충분히 알 수 있으니까.
OS 부터는 CS 지식이 조금 필요 해 질 수 있다. 프로그램을 잘 짜려면 당연히 OS에 대해서도 잘 알아야 한다.
이번 포스팅에서는 OS의 구조와 동작 원리에 대해서 알아 보도록 하겠다.
크게 커널과 인터페이스로 나뉜다고 볼 수 있다. 커널을 통해 HW에서 입력 된 신호를 받아 올 수 있고 System call을 통해 인터페이스에 신호를 보내서 우리가 원하는 작업들이 시행 될 수 있다. 정말 짧게 요약하면 이렇다. 커널과 인터페이스의 역할은 다음과 같다.
과거에는 단일형 구조 커널을 주로 사용했다. 커널의 핵심 기능을 구현하는 모듈들이 따로 구분 없이 하나로 구성 되어있다. 이러한 구성은 모듈 간에 통신 비용이 적어서 효율적인 운영이 가능하지만 모든 모듈이 하나로 묶여있어서 버그나 오류 처리가 어렵다. 그리고 상호 의존성이 높기 때문에 작은 시스템 결함으로 인해 시스템 전체에 문제가 생길 수 있다. 또한 수정이 불가능하기 때문에 다양한 환경에 적용하기 쉽지 않다.
계층형 구조 커널은 모듈 간에 계층구조로 이루어져있다. 같은 기능을 하는 모듈끼리 모아 하나의 계층을 구현하고, 계층 간 통신을 통해 운영체제가 작동한다. 비슷한 기능들 끼리 모여있기 때문에 오류가 나더라도 수정이 쉽다.
인터페이스라는 단어 뜻만 생각 해 보면, 두 장치 사이의 접점이라고 할 수 있다. 사용자와 기기 사이의 접점이 인터페이스고 사용자는 이 인터페이스를 통해 기기를 작동 시킨다. 즉 사용자가 기기를 작동시키는 데 도움을 주는 시스템을 말한다.
위의 그림에서는 GUI라고 나와 있는데 Graphic User Interface라고도 한다. 윈도우즈를 쓰는 사람이라면 Window Shell 이라 부르는 GUI 상에서 작업을 할 것이다. (이게 공식 명칭인지는 잘 모르겠다.) Ubuntu 유저라면 Gnome 환경에서 작업을 할 것이다. CLI 환경이라면 Bash Shell, Power Shell, Zsh (Z Shell) 등을 활용 할 것이다.
운영체제의 종류에 따라 다르겠지만 리눅스를 예로 든다면 운영체제는 위의 사진과 마찬가지로 HW 드라이버, 커널, System call 이 세가지가 OS의 영역이다. GUI는 사실 공식적으로 정해졌다기보단 Ubuntu 같은 경우엔 기본적으로 Gnome 이 설치 되어 있으니 쓰는거지 바꾸려면 바꿀 수 있는걸로 알고 있다.
커널은 사용자나 응용 프로그램이 컴퓨터 자원에 직접 접근하는것을 차단한다. System call은 커널과 사용자 인터페이스 간의 인터페이스라고 생각 하면 된다. System Call을 통해 커널의 자원을 호출하면 커널이 제공하는 방식으로 직접 접근을 차단함으로써 문제가 생길 수 있는 상황을 차단한다.
커널과 HW 사이의 인터페이스다. 인터페이스가 있는 이유를 생각해보면 Driver 또한 존재하는 이유가 마찬가지라고 할 수 있다. 요즘은 하드웨어를 설치하면 적당한 드라이버를 알아서 찾아서 설치하곤 하는데 XP 시절이나 그 이전만 가더라도 (필자는 97년생이다. 생각보다 컴퓨터와 함께 한 세월이 오래되었다.) HW를 사면 드라이버를 설치할 수 있도록 작은 CD가 동봉되서 오는 경우가 많았다. 지금도 마우스와 같은 물건을 사면 CD 같은 게 딸려오는 경우가 가끔 있다.
ROM(Read Only Memory)에는 POST와 Boot Loader가 저장되어 있다. POST(Power On Self-Test)는 전원이 켜지면 제일 먼저 실행되어 컴퓨터에 이상이 있는 지 체크를 한다. Boot Loader는 HDD나 SSD에 저장되어있는 OS 프로그램을 가져와서 RAM에게 넘긴다.
컴퓨터가 켜지면 OS를 실행하고 Interrupt를 기다린다. Interrupt는 사용자가 무언가 입력하는 이벤트라 생각하면 된다. Interrupt가 발생하면 OS는 Interrupt를 발생 시킨 메모리 주소를 기억하고, Interrupt가 끝나면 해당 주소로 돌아가 명령어를 실행하거나 대기상태로 돌아간다.
이처럼 운영체제는 Interrupt나 Event가 발생하면 적절히 CPU나 I/O, 메모리 자원을 분배하여 그 요청을 수행하는 식으로 작동한다.
크기 HW Interrupt, SW Interrupt로 나눌 수 있는데 HW Interrupt는 I/O, 메모리, CPU와 관련 된 Interrupt, SW Interrupt는 프로그램의 Error, 운영체제 서비스들에 대한 요청인 System Call이다.
CPU 하나는 하나의 작업만 처리 할 수 있다. 하지만 처리해야 할 작업은 너무나 많다. 그러므로 멀티 프로그래밍이라는 개념이 나왔다. 입출력이 수행되고 있다면, 다른 작업에 CPU를 할당해서 처리하고 반대로 CPU가 작업을 하고 있다면, 입출력 장치들을 대기 상태로 만들어서 입출력이 필요한 작업에 입출력 리소스를 할당하는 개념이다.
각각의 작업들에 자원 할당 시간을 정해줘서 그 시간이 지나면 다른 작업에 자원을 넘겨주는 개념이다. 시간을 각 작업에 할당하는 것을 스케쥴링이라고 부른다. 그래서 겉으로 보면 여러 작업이 동시에 수행되는 것 처럼 보이는 것이다.
지금까지 운영체제의 기초적인 구조, 작동원리, 개념들에 대해 알아보았다. 다음 포스팅은 프로세스 관리에 대한 내용으로 써 보겠다.