운영체제라는 단어는 IT기기가 널리 보급된 우리들에게는 친숙한 단어이다. 윈도우, 맥, 리눅스, 안드로이드... 이런것들을 운영체제 라고 한다. 앞의 예시에서 알 수 있듯 운영체제는 어떠한 하드웨어 위에 기본 바탕으로 설치되는 소프트웨어이다. 사용자는 설치된 운영체제 위에서 원하는 어플리케이션을 설치하고, 사용하게 된다.
즉, 운영체제는 어떤 하드웨어를 제어하기 위한 기능을 제공해 주는 역할을 한다.
운영체제는 핵심 코어인 커널과 기타 라이브러리/API로 이루어져 있다.
커널은 하드웨어에 직접 접근을 할 수 있고, 데이터를 읽고 쓰는 작업등을 직접 수행한다.
그리고 커널 외에 커널의 동작을 도와주는 기능들을 가진 라이브러리들이 있다. 그 중 하나는 쉘이다.
쉘은 사용자가 커널을 조작할 수 있도록 기능을 제공한다. 종류는 CLI와 GUI 방식이 있고, CLI는 명령어를 입력하여 조작하는 방식, GUI는 화면에 마우스로 조작하는 방식이다. 유명한 쉘로는 리눅스 bash가 있다.
그렇다면 쉘은 어떻게 커널을 조작할 수 있을까? 바로 커널이 외부에 조작당할 수 있도록 인터페이스를 제공해 주기 때문이다. 이 인터페이스를 시스템 콜이라고 부른다.
쉘이든 기타 다른 응용프로그램이든, 이 시스템콜을 구현하여 원하는 기능을 구현한다.
만약 자바에서 파일시스템에 데이터를 저장할 경우 JDK에서 시스템 저정과 관련된 시스템 콜을 호출하는 것이다. 하지만 이 시스템 콜은 운영체제 마다 다르다. 그렇기 때문에 여러 응용 프로그램들은 운영체제 별로 다른 설치파일을 제공하는 것이다.
시스템은 위와 같은 두가지 모드를 가진다. 바로 접근 권한 때문이다. 커널은 하드웨어를 직접 접근할 수 있기 때문에 모든 유저가 접근을 할 수 있으면 안된다. 그렇기 때문에 커널 모드를 따로 만들어 두어 해당 모드일 때만 커널에 접근할 수 있도록 하는 것이다.
시스템 콜을 구현한 API를 접근할 때는 커널모드로 전환되어 실행된다. 예를 들어 프로그램이 실행되면 사용자 모드로 실행이 되다가 해당 기능을 사용할 때 잠시 커널모드로 전환되었다가 다시 사용자 모드로 돌아간다.
이런 모드에 따른 접근 권한 범위는 누가 관리를 하는 걸까? 바로 CPU가 관리한다. CPU는 level에 따라 접근 범위를 정해 두고, 해당 level에 따라 접근을 통제하는 기능을 한다.
운영체제는 아래와 같은 역할을 한다.
1. 시스템 자원 관리
2. 사용자와 하드웨어 간의 커뮤니케이션
3. 응용 프로그램 제어
하드웨어(cpu, memory, I/O) 등의 자원(resource)들을 관리한다.
인터페이스를 제공하여 사용자가 하드웨어를 제어할 수 있도록 한다.
응용 프로그램을 효율적으로 제어할 수 있도록 한다(App 실행, 접근 권한 관리, 프로세스 관리 등)