데스크톱 컴퓨터, 노트북, 스마트폰에는 모두 운영체제가 설치되어 있다.
대표적인 운영체제: 윈도우, macOS, 리눅스, 안드로이드, iOS
컴퓨터 부품들은 운영체제라는 특별한 프로그램의 지휘하에 작동한다. 컴퓨터 부품들을 관리하고, 개발한 프로그램들이 올바르게 실행되도록 돕는다.
모든 프로그램은 하드웨어를 필요로 한다.
프로그램 실행에 필요한 요소들을 시스템 자원, 혹은 줄여서 자원이라고 한다. (ex. CPU, 메모리, 보조기억장치, 입출력장치)
즉, 모든 프로그램은 실행되기 위해 반드시 자원이 필요하다.
실행할 프로그램에 필요한 자원을 할당하고, 프로그램이 올바르게 실행되도록 돕는 특별한 프로그램이 운영체제이다.
운영체제는 다른 프로그램을 위한 프로그램이므로 다른 프로그램과 마찬가지로 메모리에 적재되어야 한다. 운영체제는 특별한 프로그램이므로 항상 컴퓨터 부팅시 메모리내 커널 영역이라는 공간에 따로 적재되어 실행된다. 커널영역을 제외한 나머지 영역, 사용자가 이용하는 응용 프로그램이 적재되는 영역을 사용자 영역이라고 한다.
즉, 운영체제는 커널 영역에 적재되어 사용자 영역에 적재된 프로그램들에 자원을 할당하고 이들이 올바르게 실행되도록 돕는다.
운영체제는 응용 프로그램에 자원을 효율적으로 배분하고, 실행할 프로그램들이 지켜야 할 규칙을 만들어 컴퓨터 시스템 전체를 관리
운영체제는 관리할 자원별로 기능이 나누어져 있다. ➡️ 어느 한 부분에서는 CPU를, 어느 한 부분에서는 메모리를, 어느 한 부분에서는 하드 디스크를 관리한다.
운영체제가 하드웨어를 조작하고 관리하는 기능들을 제공하기 때문에 개발자는 하드웨어를 조작하는 코드를 직접 작성할 필요 없이 운영체제의 도움을 받아 간편하게 개발이 가능하다.
운영체제를 깊이 이해하면 운영체제에게 제대로 명령할 수 있게 된다. ➡️하드웨어와 프로그램을 더 깊이 이해할 수 있다. (문제해결의 실마리를 찾을 수 있다.)
운영체제는 현존하는 프로그램 중 규모가 가장 큰 프로그램 중 하나이다. 대표적인 운영체제인 리눅스를 구성하는 소스 코드는 천만줄이 넘는다. 운영체제가 다양하다. ➡️ 운영체제 서비스 또한 매우 다양하다.
운여에제가 응용 프로그램에 제공하는 서비스 종류는 다양하지만, 그중에서도 가장 핵심적인 서비스들이 있다.
운영체제의 핵심 서비스를 담당하는 부분을 커널이라고 한다.
커널은 마치 사람의 심장, 혹은 자동차의 엔진과도 같다. 어떤 커널을 사용하는지에 따라 실행하고 개발하는 프로그램이 하드웨어를 이용하는 양상이 달라지고, 결과적으로 컴퓨터 전체의 성능도 달라진다. (운영체제를 지칭할 때 특별히 언급하지 않는 한 커널을 지칭한다)
커널은 운영체제의 핵심 기능을 담당
운영체제가 제공하는 서비스 중 커널에 포함되지 않는 서비스에는 대표적으로 사용자 인터페이스가 있다. 사용자 인터페이스는 UI:User Interface
는 윈도우의 바탕화면과 같이 사용자가 컴퓨터와 상호작용할 수 있는 통로이다.
GUI: Graphical User Interface
: 윈도우 바탕화면이나 스마트폰의 화면처럼 그래픽을 기반으로 컴퓨터와 상호작용할 수 있는 인터페이스CLI: Command Line Interface
: 명령어를 기반으로 컴퓨터와 상호작용할 수 있는 인터페이스사용자 인터페이스는 운영체제가 제공하는 서비스이지만, 이는 그저 컴퓨터와 상호작용하기 위한 통로일 뿐 커널에 속한 기능은 아니다
운영체제는 사용자가 실행하는 응용 프로그램이 하드웨어 자원에 직접 접근하는 것을 방지하여 자원을 보호한다. => 그렇지 않는다면 응용 프로그램의 실수가 컴퓨터 전체에 악영향을 미칠 수 있다.
운영체제는 오직 자신만을 이용하여 자원에 접근할 수 있도록 제어한다. (문지기 역할)
이러한 운영체제의 문지기 역할은 이중 모드
로써 구현된다.
이중 모드란 CPU가 명령어를 실행하는 모드를 크게 사용자 모드와 커널 모드로 구분하는 방식이다. CPU는 명령어를 사용자 모드로써 실행할 수 있고, 커널 모드로써 실행할 수 있다.
User Mode
)Kernel Mode
)이중 모드는 CPU가 명령어를 실행하는 모드를 커널 모드와 사용자 모드로 구분하는 방식이다.
사용자 모드로 실행되는 프로그램이 자원에 접근하는 운영체제 서비스를 제공받으려면 운영체제에 요청을 보내 커널 모드로 전환되어야 한다. 이때 운영체제 서비스를 제공받기 위한 요청을 시스템 호출 System call (시스템 콜)
이라고 한다. 사용자 모드로 실행되는 프로그램은 시스템 호출을 통해 커널 모드로 전환하여 운영체제 서비스를 제공받을 수 있다.
시스템 호출은 운영체제 서비스를 제공받기 위해 커널 모드로 전환하는 방법이다.
시스템 호출은 일종의 인터럽트이다. 정확히는 소프트웨어적인 인터럽트이다. 인터럽트는 입출력 장치에 의해 발생하기도 하지만 인터럽트를 발생시키는 특정 명령어에 의해 발생하기도 하는데, 이를 소프트웨어 인터럽트라고 한다.
프로세스 관리, 자원 접근 및 할당, 파일 시스템 관리
실행 중인 프로그램을 프로세스라고 한다. 컴퓨터를 사용하는 동안 메모리 안에서는 새로운 프로세스들이 마구 생성되고, 사용되지 않는 프로세스는 메모리에서 삭제된다.
일반적으로 하나의 CPU는 한 번에 하나의 프로세스만 실행할 수 있기에 CPU는 이 프로세스들을 조금씩 번갈아 가며 실행한다. (한 프로세스를 실행하다가 다른 프로세스로 실행을 전환하고, 그 프로세스를 실행하다가 또 다른 프로세스로 실행을 전환하는 것을 반복한다.) ➡️ 이때, 각 프로세스는 상태도 사용하고자 하는 자원도 다르다.
운영체제는 다양한 프로세스를 관리하고 실행할 수 있어야 한다.
모든 프로세스는 실행을 위해 자원을 필요로 한다. 그리고 운영체제는 프로세스들이 사용할 자원에 접근하고 조작함으로써 프로세스에 필요한 자원을 할당해 준다.
일반적으로 메모리에는 여러 프로세스가 적재되고, 하나의 CPU는 한 번에 하나의 프로세스만 실행 할 수 있다. 그래서 하나의 프로세스가 CPU를 이용하고 있다면 다른 프로세스는 기다려야 한다.
메모리에 적재된 프로세스들은 크기도, 적재되는 주소도 다르다. (같은 프로세스라 할지라도 실행시마다 적재 주소 달라짐) 운영체제는 새로운 프로세스 적재시마다 어느 주소에 적재해야 할지를 결정해야 한다.
인터럽트 서비스 루틴은 운영체제가 제공하는 기능으로 커널 영역에 있다. 입출력장치가 발생시키는 하드웨어 인터럽트도 마찬가지이다. 운영체제는 인터럽트 서비스 루틴(인터럽트를 처리하는 프로그램)을 제공함으로써 입출력 작업을 수행한다.
파일 시스템 File System
: 파일들을 한데 묶어 디렉터리(폴더)로 관리 하는 등의 시스템
하이퍼바이저 모드: 가상머신 상에서 작동하는 응용 프로그램들은 하이퍼바이저 모드로써 가상머신에 설치된 운영체제로부터 운영체제 서비스를 받을 수 있다.
종류 | 시스템 호출 | 설명 |
---|---|---|
프로세스 관리 | fork() | 새 자식 프로세스 생성 |
execve() | 프로세스 실행(메모리 공간을 새로운 프로그램의 내용으로 덮어씌움) | |
exit() | 프로세스 종료 | |
waitpid() | 자식 프로세스가 종료할 때 까지 대기 | |
파일 관리 | open() | 파일 열기 |
close() | 파일 닫기 | |
read() | 파일 읽기 | |
write() | 파일 쓰기 | |
stat() | 파일 정보 획득 | |
디렉터리 관리 | chdir() | 작업 디렉터리 변경 |
mkdir() | 디렉터리 생성 | |
rmdir() | 비어 있는 디렉터리삭제 | |
파일 시스템 관리 | mount() | 파일 시스템 마운트 |
umount() | 파일 시스템 마운트 해제 |
파일 시스템 마운트: 리눅스에서 여러가지 하드웨어 장치들을 사용하기 위해 리눅스라는 운영체제에 인식시켜야 하는데 이를 간으하게 해주는 것이 마운트 작업이다. 하드디스크 추가작업, 또는 DVD, CD-ROM 등과 같은 장치들은 시스템 부팅 후에 수동으로 마운트라는 작업을 해서 사용하는 경우가 종종 있다. 그리고 특정장치는 사용후에 반드시 마운트 해제를 해주어야 한다.