운영체제 (Operating System)
시스템 자원을 관리한다. 여기서 시스템 자원은 컴퓨터의 하드웨어 부분을 말한다. 즉, OS는 CPU, Memory, IO Devices라는 PC의 3요소를 관리한다고 할 수 있다.
CPU: 각 프로그램에 얼만큼의 연산량을 할당할지를 담당해준다.
Memory: 프로그램을 어느 주소에 저장할지, 어느 정도의 메모리를 확보해줘야하는지를 결정해준다.
저장매체(HDD, SSD): 어떻게, 어디에 저장할지를 정해준다.
키보드, 마우스 등 IO Devices: 들어오는 입력과, 화면이나 다른 수단으로 출력되는 것을 알맞게 변환해준다.
사용자와 컴퓨터간의 상호작용을 지원한다. 우리가 직접 전기신호를 보내줘도 좋겠지만...? OS가 있다면 그냥 몇 번 딸깍딸깍해서 해결할 수 있다.
응용 프로그램을 알아서 제어해준다. 해당 프로그램이 PC의 치명적인 부분을 건드리지 않도록 권한을 제한할 수 있으며, 반대로 프로그램을 사용하는 사용자를 제한할수도 있다(로그인 등).
이 중에서도 제어 기능이 참으로 중요하다. 응용 프로그램은 아무나 만들 수 있기 때문에, 어떤 문제든 발생할 수 있기 때문이다. 말 그대로 실행만 시켰을 뿐인데 무한 루프에 빠져서 PC가 응답을 멈추던가, 저장매체의 모든 파일이 지워지던가, CPU 할당량이 매우 높게 설정되어있어 다른 프로그램에 쓸 자원까지 전부 끌어써서 의도치 않은 자원 낭비를 유발할 수도 있는 일이다. OS는 이런 트롤짓을 어느 정도 예방해준다(사용자가 경고를 무시하고 그냥 실행시켜버리면 어쩔 수 없긴 하다).
커널 (Kernel)
커널은 OS의 가장 핵심적인 부분을 담당하는 소프트웨어이다. 이것에 다른 프로그램을 붙여서 만드는 것이 OS라고 할 수 있다.
예를 들어 안드로이드 OS는 안드로이드라는 커널이 따로 있는 게 아니라, 리눅스 커널에 안드로이드 관련 Application을 붙여서 만든 OS다.
쉘 (Shell)
쉘이란 사용자가 해당 OS의 기능과 서비스를 조작할 수 있도록 인터페이스를 제공하는 응용 프로그램을 뜻한다.
터미널을 통해 명령어를 입력하는 CLI(Command Line Interface), 눈에 직접 보이고 그걸 조작하는 GUI(Graphical User Interface)로 나뉜다. CLI는 명령어를 정확히 입력하지 않으면 제대로 된 조작을 할 수 없는데, 외워야 할 명령어는 많았기에 그렇게 좋은 인터페이스는 아니었다. 그렇기에 지금의 윈도우나 맥 같은 OS는 GUI, 즉 눈에 보이는 인터페이스를 제공한다.
리눅스의 경우 bash 쉘이 CLI이다.
시스템 콜 (System Call)
OS는 자신이 가진 기능을 사용할 수 있게끔 명령어나 함수를 제공한다. 이것을 기반으로, OS 위에서 작동하는 커널과 쉘은 OS와 직접 상호작용하며 컴퓨터를 굴릴 수 있다. 이러한 명령어와 함수를 가진 프로그램을 시스템 콜이라 한다. 즉, 쉘이나 응용 프로그램은 시스템 콜을 경유해야지만 OS와 상호작용 할 수 있게 된다.
하지만 대부분의 시스템 콜은 C, C++로 구성된다. 그럼 자바같은 언어로 만든 프로그램은 어떻게 C, C++로 만든 시스템 콜을 동작시킬까? 자바의 경우 JVM이 중간에서의 변환을 돕는다. 정확히는 JVM에서 동작하는 JNI(Java Native Interface)라는 녀석인데, 이것이 자바 언어로 작성된 프로그램이 C 기반의 시스템 콜을 사용할 수 있도록 돕는다. 이런 JNI 같은 녀석을 API(Application Programming Interface)라고 부른다.
API까지 추가되면 우리가 OS의 기능에 접근하기까지 다음과 같은 작업을 한다고 볼 수 있다.
사용자 입력->응용 프로그램이나 쉘이 자기 언어에 맞는 API에 접근->API를 통해 시스템 콜을 호출->시스템 콜에 맞춰 OS 기능 실행
이렇게 서로서로 떨어돌아가는 걸 알았으니 OS가 어떻게 만들어지는지도 얼추 알 수 있게 됐다.
OS 만들기
OS를 만들고 싶다면 다음과 같은 과정이 필요하다고 할 수 있다.
1. 커널을 개발한다.
2. 해당 커널과 상호작용 할 수 있는 시스템 콜을 개발한다.
3. 시스템 콜을 사용할 수 있는 컴퓨터 언어 라이브러리(API)를 개발한다.
4. API를 기반으로 Shell와 응용 프로그램을 개발한다.
API가 OS에 접근할 수 있으니 컴퓨터를 박살낼 수도 있겠구나
그렇지는 않다... 프로그램에게 권한을 주지 않으면, 그 프로그램은 OS에게 치명적인 기능을 사용할 수 없게 된다. 안드로이드에서 몇몇 어플이 ~~권한 허용해달라는 팝업을 띄우는 게 이런 권한 때문이다(그렇기에 검증되지 않은 앱에게 파일 관리 권한을 맡기면 원치않는 포맷을 당할지도...?)
이렇게 권한으로 동작하는 시스템을 CPU에서 제공하는데, 이를 보호 링(Protection Rings)이라고 한다. 대부분의 응용 프로그램이 Ring 3을 침범할 수 없기에, 사용자는 안심(?)하고 프로그램을 실행할 수 있다.