이 글은 혼자 공부하는 컴퓨터 구조+운영체제 교재와 강의를 참고하여 정리한 글입니다. 오타나, 잘못된 내용이 있으면 언제든지 알려주세요! 감사합니다.😊
운영체제의 큰 그림
운영체제를 알아야 하는 이유
컴퓨터, 노트북, 스마트폰에는 모두 운영체제가 설치되어 있다.
- 예) Window, macOS, Linux, iOS, android 등등...
컴퓨터 부품들은 전기만 공급하면 마법처럼 알아서 작동하는 것이 아니다. 운영체제라는 특별한 프로그램의 지휘하에 작동한다.
그렇다면 운영체제란 무엇일까?
운영체제란
- 프로그램 실행에 마땅히 필요한 요소들을 가리켜 시스템 자원, 혹은 자원이라고 한다.
- 컴퓨터의 네 가지 핵심 부품들인 CPU, 메모리, 보조기억장치, 입출력장치가 포함된다.
- 운영체제는 실행할 프로그램에 필요한 자원을 할당하고, 프로그램이 올바르게 실행되도록 돕는 특별한 프로그램이다.
- 운영체제는 프로그램이다. 따라서 다른 프로그램과 마찬가지로 운영체제 역시 메모리에 적재되어야 한다.
- 운영체제는 매우 특별한 프로그램이기 때문에 항상 컴퓨터가 부팅될 때 메모리 내 커널 영역(kernel space)이라는 공간에 따로 적재되어 실행된다.
- 커널 영역을 제외한 나머지 영역, 사용자가 이용하는 응용 프로그램이 적재되는 영역을 사용자 영역(user space)이라고 한다.
- 응용 프로그램(application software)은 사용자가 특정 목적을 위해 사용하는 일반적인 프로그램이다.
- 예) 메모장, 웹 브라우저, 게임 등과 같은 프로그램
- 워드 프로세서, 인터넷 브라우저, 메모장을 실행 중이라고 가정하면, 최소 세 개의 응용 프로그램이 사용자 영역에 적재되어 있는 것이다.
그런데 워드 프로세서, 인터넷 브라우저, 메모장 이 세 가지 프로그램들을 누가 메모리 주소가 겹치지 않도록 메모리에 적재했을까?
바로 운영체제이다.
- 운영체제는 실행할 프로그램을 메모리에 적재하고, 더 이상 실행되지 않는 프로그램을 메모리에서 삭제해 지속적으로 메모리 자원을 관리한다.
또한 워드 프로세서, 인터넷 브라우저, 메모장 이 세 가지 프로그램들이 실행되려면 반드시 CPU가 필요하다. 어떤 프로그램부터 먼저 CPU를 사용하게 할까? 그리고 얼마나 오랫동안 CPU를 이용하게 할까? 이 문제 또한 운영체제가 해결한다.
- CPU는 여러 개의 프로그램을 빠르게 번갈아 가면서 동시에 실행하게 되는데 운영체제는 어떤 프로그램을 먼저 실행할지, 어떤 프로그램을 얼마나 오랫동안 CPU를 이용해서 실행할 것인지를 결정한다.
- 운영체제는 최대한 공정하게 여러 프로그램에 CPU 자원을 할당한다.
- 예) 워드 프로세서와 메모장이 동시에 동일한 프린터를 이용하려는 상황을 생각해 보자.
- 운영체제는 동시에 두 개의 프로그램이 프린터를 사용하지 못하도록 막는다.
- 하나의 프로그램이 프린터를 이용하는 동안 다른 프로그램은 기다리게 만들어 프린터 자원을 관리한다.
- 운영체제는 응용 프로그램과 하드웨어 사이에서 응용 프로그램에 필요한 자원을 할당하고, 응용 프로그램이 올바르게 실행되도록 관리하는 역할을 한다.
- 운영체제는 응용 프로그램과 하드웨어 사이에 위치해 그 사이를 연결하는 연결다리와도 같은 프로그램이다.
- 하드웨어와 아주 맞닿아있는 프로그램이라고도 볼 수 있다.
- 운영체제는 정부에 비유되기도 한다.
- 정부는 나라의 자원을 효율적으로 배분하고, 규칙을 만들어 나라 전체를 관리한다. 또한 역할별로 여러 부서가 나뉘어 있다.
- 운영체제도 응용프로그램에 자원을 효율적으로 배분하고, 실행할 프로그램들이 지켜야 할 규칙을 만들어 컴퓨터 시스템 전체를 관리한다. 또한 관리할 자원별로 기능이 나누어져 있다.
- 운영체제의 어느 한 부분에서는 CPU를, 어느 한 부분에서는 메모리를, 어느 한 부분에서는 하드 디스크를 관리한다.
운영체제를 알아야 하는 이유
운영체제 없이 프로그램을 개발하는 것은 상상만 해도 끔찍하다.
왜냐하면 운영체제가 없다면 하드웨어를 조작하는 코드를 개발자가 모두 직접 작성해야 하기 때문이다.
다음 예시를 보자.
- 1과 2를 더한 결과를 모니터에 출력하는 간단한 프로그램이 있다.
- 프로그램을 메모리에 적재하는 코드
- CPU로 하여금 1과 2를 더하게 하는 코드
- 모니터에 계산 결과를 출력하는 코드
- 이 세 가지를 개발자가 모두 직접 작성해야 한다.
운영체제가 하드웨어를 조작하고 관리하는 기능들을 제공하기 때문에 개발자는 하드웨어를 조작하는 코드를 직접 작성할 필요 없이 운영체제의 도움을 받아 간편하게 개발할 수 있다. (운영체제한테 부탁하면 된다)
그렇다면 운영체제한테 부탁만 하면 되는데 우리는 왜 운영체제를 알아야 할까?
운영체제는 사용자를 위한 프로그램이 아니다. 즉, 운영체제는 프로그램을 위한 프로그램이다.
따라서 프로그램을 만드는 개발자는 운영체제를 알아야 한다. (내가 개발한 프로그램은 운영체제에게 어떤 도움을 받을까?)
- 우리가 만든 프로그램은 결국 하드웨어가 실행하고, 그 하드웨어를 조작하는 프로그램이 운영체제이다.
- 즉, 운영체제는 우리의 프로그램이 하드웨어 상에서 어떻게 작동되는지를 우리보다 먼저 더 자세히 알고 있다.
- 운영체제는 하드웨어가 아닌 프로그램이기 때문에 대화할 수 있다.
- '현재 하드웨어의 상태는 어떤지', '우리의 코드가 어떻게 실행되었는지', '하드웨어 상에서 어떤 문제가 있었는지' 등을 우리에게 상세히 알려 줄 수 있고, 우리는 이러한 정보를 통해 문제 해결의 실마리를 찾을 수 있다.
즉, 운영체제를 깊이 이해하면 운영체제가 우리에게 어떤 말을 하는지 제대로 이해할 수 있고, 우리는 운영체제에게 제대로 명령할 수 있다. 그리고 하드웨어와 프로그램을 더 깊이 이해할 수 있다.
운영체제의 대표적인 대화 예시는 오류 메시지이다.
- 대다수의 오류 메시지의 근원은 운영체제이다.
- 운영체제는 오류 메시지를 통해 우리와 직접적으로 대화할 수 있다.
- 즉, 운영체제를 깊이 알면 오류 메시지에 대한 이해도 깊어지고 문제 해결 능력도 높아진다.
운영체제의 심장, 커널
운영체제는 현존하는 프로그램 중 규모가 가장 큰 프로그램 중 하나이다.
세상에는 정말 다양한 운영체제가 존재한다. Window, macOs, Linux, android, iOS 등등..
그래서 운영체제가 응용 프로그램에 제공하는 기능들, 운 영체제 서비스 또한 매우 다양하다.
운영체제가 응용 프로그램에 제공하는 서비스 종류는 다양하지만, 그중에서도 가장 핵심적인 서비스들이 있다.
- 예시) 스마트폰을 생각해 보자. 전화, 문자, 인터넷 기능처럼 가장 핵심적인 서비스
- 운영체제도 자원에 접근하고 조작하는 기능, 프로그램이 올바르고 안전하게 실행되게 하는 기능 등이 운영체제의 핵심 서비스에 속한다.
- 운영체제의 핵심 서비스를 담당하는 부분을 커널(kernel)이라고 한다. (자동차의 엔진, 사람의 심장)
- 운영체제가 설치된 모든 기기에는 커널이 있고, 어떤 커널을 사용하는지에 따라 우리가 실행하고 개발하는 프로그램이 하드웨어를 이용하는 양상이 달라지고, 결과적으로 컴퓨터 전체의 성능도 달라질 수 있다.
운영체제에는 속하는데 커널에는 속하지 않는 기능이 있을까?
있다. 대표적으로 사용자 인터페이스, 유저 인터페이스(UI; User Interface)이다.
- 유저 인터페이스는 윈도우의 바탕화면과 같이 사용자가 컴퓨터와 상호작용할 수 있는 통로이다.
- 사용자와 컴퓨터 간의 통로일 뿐 운영체제의 핵심 기능(커널)은 아니다.
- 운영체제가 제공하는 사용자 인터페이스의 종류에는 두 가지가 있다.
- 그래픽 유저 인터페이스(GUI; Graphical User Interface), 윈도우 바탕화면처럼 그래픽을 기반으로 컴퓨터와 상호작용할 수 있는 인터페이스
- 커맨드 라인 인터페이스(CLI; Command Line Interface), 명령어를 기반으로 컴퓨터와 상호작용할 수 있는 인터페이스
이중 모드와 시스템 호출
사용자가 실행하는 프로그램(메모장, 게임 등등)은 자원(메모리, CPU, SSD 등등)에 직접 접근할 수 있을까? 접근해도 될까?
접근하면 안 된다. 자원에 직접 접근은 위험하기 때문이다. 만약 응용프로그램이 자원에 마음대로 접근하고 조작할 수 있다면 자원이 무질서하게 관리될 것이고, 응용 프로그램이 조그만 실수 해도 컴퓨터 전체에 큰 악영향을 끼칠 수 있다.
따라서, 운영체제는 응용 프로그램들이 자원에 접근하려고 할 때 오직 자신을 통해서만 접근하도록 하여 자원을 보호한다.
- 운영체제는 자원 접근을 대행하는 일종의 문지기 역할로 볼 수 있다.
- 응용 프로그램이 자원에 접근하기 위해서는 운영체제에게 도움을 요청해야 한다. 즉, 운영체제의 코드를 실행하려고 한다.
- 응용프로그램의 요청을 받은 운영체제는 응용 프로그램 대신 자원에 접근하여 요청한 작업을 수행한다.
응용 프로그램이 실행 과정에서 하드 디스크에 접근하는 경우를 생각해 보자.
- 응용 프로그램이 실행 과정에서 하드 디스크에 접근하여 데이터를 저장하려면 운영체제에 도움을 요청해야 한다.
- 운영체제는 커널 영역 내의 하드 디스크에 데이터를 저장하는 코드를 실행하여 응용 프로그램의 작업을 대신 수행해 준다.
이러한 문지기 역할은 이중 모드로써 구현된다.
이중모드(dual mode)
- 이중 모드는 CPU가 명령어를 실행하는 모드를 크게 사용자 모드와 커널 모드로 구분하는 방식이다.
- 사용자 모드(user mode)
- 사용자 모드는 운영체제 서비스를 제공받을 수 없는 실행 모드이다.
- 즉, 커널 영역의 코드를 실행할 수 없는 모드이다.
- 사용자 모드로 실행되는 응용 프로그램은 자원에 접근할 수 없다.
- 커널 모드(kernel mode)
- 커널 모드는 운영체제 서비스를 제공받을 수 있는 실행 모드이다.
- 즉, 커널 영역의 코드를 실행할 수 있는 모드이다.
- 커널 모드로 실행되는 응용 프로그램은 자원 접근을 비롯한 모든 명령어를 실행 가능하다.
참고: CPU가 사용자 모드로 실행 중인지, 커널 모드로 실행 중인지는 플래그 레지스터 속 슈퍼바이저 플래그를 보면 알 수 있다.
그렇다면 언제 커널 모드로 바뀌고, 언제 사용자 모드로 바뀔까?
시스템 호출을 하면 커널 모드로 전환이 된다.
시스템 호출(system call)
- 시스템 호출은 운영체제 서비스를 제공받기 위해 운영체제에 요청을 보내 커널 모드로 전환하는 방법이다.
- 시스템 호출도 일종의 소프트웨어적인 인터럽트이다.
- 인터럽트는 입출력장치에 의해 발생하기도 하지만 인터럽트를 발생시키는 특정 명령어에 의해 발생하는데 이를 소프트웨어 인터럽트라고 한다.
- 시스템 호출이 처리되는 방식은 하드웨어 인터럽트 처리 방식과 유사하다.
- 시스템 호출을 발생시키는 명령어가 실행되면 CPU는 지금까지의 작업을 백업한다.
- 커널 영역 내에 시스템 호출을 수행하는 코드(인터럽트 서비스 루틴)를 실행한다.
- 다시 기존에 실행하던 응용 프로그램으로 복귀하여 실행을 계속한다.
- 응용 프로그램이 하드 디스크에 데이터를 저장한다고 가정하자.
- 하드 디스크에 데이터를 저장하는 시스템 호출을 발생시켜 커널 모드로 전환한다.
- 운영체제 내의 '하드 디스크에 데이터를 저장하는 코드'를 실행함으로써 하드 디스크에 접근할 수 있다.
- 하드디스크에 접근이 끝났다면 다시 사용자 모드로 복귀하여 실행을 계속한다.
- 일반적으로 응용 프로그램은 실행 과정에서 운영체제 서비스들 매우 자주 이용한다.
- 그 과정에서 자주 시스템 호출을 발생시키고 사용자 모드와 커널 모드를 오가며 실행된다.
유닉스, 리눅스 등의 운영체제에서 사용하는 시스템 호출의 종류
운영체제의 핵심 서비스
운영체제의 핵심 서비스는 크게 세 가지로 볼 수 있다.
즉, 프로그램은 운영체제로부터 다양한 기능들을 제공받을 수 있지만, 핵심적인 기능으로써 크게 세 가지 도움을 받으면서 실행될 수 있다.
- 프로세스 관리
- 자원 접근 및 할당
- 파일 시스템 관리
프로세스 관리
- 프로세스(process)는 실행 중인 프로그램이다.
- 수많은 프로세스들이 동시에 실행되고 있다.
- '동시에 실행된다'는 내부적으로 보면 '아주 아주 빠르게 번갈아가며 실행된다'와 같다.
- 일반적으로 하나의 CPU는 한 번에 하나의 프로세스만 실행할 수 있다.
- 따라서 CPU는 한 프로세스를 실행하다가 다른 프로세스로 실행을 전환하고, 그 프로세스를 실행하다가 또 다른 프로세스로 실행을 전환하는 것을 반복한다.
각 프로세스는 상태, 사용하고 하는 자원도 다양하다. 예를 들어 입출력장치를 주로 사용하는 프로세스도 있고, CPU만 사용하는 프로세스도 있을 것이다. 또 당장 실행할 수 있는 프로세스와, 당장 실행이 불가능한 프로세스가 있을 것이다.
그래서 운영체제는 다양한 프로세스를 일목요연하게 관리하고 실행할 수 있어야 한다.
- 운영체제는 동시다발적으로 생성/실행/삭제되는 다양한 프로세스를 일목요연하게 관리할 수 있어야 한다.
자원 접근 및 할당
운영체제가 CPU, 메모리, 입출력장치를 어떻게 관리하고 어떤 기능을 제공할까?
- CPU
- CPU 스케줄링
- 메모리
- 페이지, 스와핑
- 입출력장치
- 인터럽트 서비스 루틴
파일 시스템 관리
- 관련된 정보를 파일이라는 단위로 저장 장치에 보관한다.
- 파일들을 묶어 폴더, 디렉터리 단위로 저장장치에 보관한다.
'Computer Science > 운영체제' 카테고리의 다른 글
[운영체제] 교착 상태 (0) | 2023.05.25 |
---|---|
[운영체제] 프로세스 동기화 (0) | 2023.05.13 |
[운영체제] CPU 스케줄링 (2) | 2023.05.03 |
[운영체제] 파이썬으로 프로세스와 스레드 다루기 (0) | 2023.05.02 |
[운영체제] 프로세스와 스레드 (0) | 2023.05.02 |