RAM은 휘발성 메모리이기 때문에 컴퓨터를 종료하면 저장된 내용들이 사라진다. 그렇기 때문에 컴퓨터는 프로그램(명령어의 집합)을 보조 기억 장치인 하드 디스크에 저장한다.
컴퓨터가 실행되면 하드 디스크에 저장된 프로그램들을 RAM으로 올려서 프로세서로 넘겨주어야 하는데, 이 작업은 어떻게 이루어질까?
- OS가 하드 디스크에서 메인 메모리로 올리는 역할을 한다.
요즘 RAM은 최소 8GB에서 시작한다. 즉, RAM에는 하나의 프로그램만 들어오는 것이 아니라 여러 프로그램이 올라오게 된다.
우리가 컴퓨터를 사용할 때 알 수 있듯이, 여러 프로그램을 동시에 실행하는 것이 가능하다. 프로세서는 하나인데 어떻게 여러 프로그램을 동시에 실행할 수 있을까?
- OS가 여러 프로그램을 동시에 실행할 수 있도록 관리해준다.
즉, OS는 컴퓨터 하드웨어를 관리하는 프로그램이다.
운영체제의 기능은 크게 자원 관리 기능과 기타 기능으로 나눕니다.
가장 먼저 자원 관리 기능은 하드웨어 자원을 각 사용자 애플리케이션에 적절히 분배해주는 것이다.
하드웨어 자원은 CPU, 메인메모리, 하드디스크, 키보드, 마우스, 프린터 등이 존재한다.
하드웨어 자원 관리 기능에서는 프로세스 관리, 메모리 관리, 보조기억장치 관리, 장치 관리(입출력 관리), 파일 관리로 분류된다.
자원은 사용자 애플리케이션이 요구하거나 운영체제 내의 규칙에 의해 적절히 분배하여 컴퓨터의 성능을 최대한 효율적으로 사용해야 한다.
운영체제 기타 기능에서는 시스템 보호, 네트워킹, 명령 해석기와 시스템 관리로 분류된다.
프로세스 관리는 운영체제 기능 중 가장 중요한 기능 중 하나이다. 프로세스와 프로그램은 기본적으로 구분된다. 프로세스는 실제 메인 메모리에서 실행 중인 프로그램을 말한다. 프로그램은 하드디스크와 같은 보조기억장치에서 아무런 동작을 하지 않는 상태이다.
이를 어떠한 요청에 의해 메인 메모리에 할당하여 CPU를 사용하면서 실행하게 되는데 이를 프로세스라고 부른다.
프로세스 관리의 주요 기능은 다음과 같다.
주기억장치 즉, 메인 메모리는 프로그램이 실행되기 위한 공간이다. CPU는 오직 메인 메모리에 있는 프로그램(프로세스)하고만 소통할 수 있다. 주기억장치 관리에서는 메인 메모리를 효율적으로 사용하도록 관리한다.
디스크는 물리적으로 track과 sector로 구성되어 있으며, 여기서 파일이라는 논리적 관점으로 데이터를 바라보고 관리하는 것이다
파일을 운영체제가 실행되는 컴퓨터에서 자주 볼 수 있는데, 이는 복잡한 과정으로 하드디스크에 저장되어 있는 것을 사용자가 편리하게 사용할 수 있도록 파일이라는 논리적 형태로 운영체제에서 관리하여 보여준다.
보조기억장치는 대표적으로 하드디스크, 플래시 메모리(주로 스마트폰에 사용)가 있다. 하드디스크를 예로 들면, 하드디스크에서 아무것도 저장되어 있지 않는 공간을 block이라 하는데, 보조기억장치 관리는 이를 관리하는 것이다.
입출력 장치에는 키보드, 마우스, 프린터, 스피커, 마이크 등이 있다. 입출력 장치 관리는 이와 같은 여러 입출력 장치를 사용하기 위해 존재한다.
시스템 콜은 유저 프로세스에서 운영체제 서비스를 필요로 할 때 이를 받기 위해 사용하는 호출이다.
위는 process 1에서 프로세스 관리에 시스템 콜을 요청한 모습이다. 프로세스가 실행하는 중간에 운영체제 서비스가 필요하면 시스템 콜을 통해 운영체제 안의 해당 코드로 점프할 수 있다.
추가적으로 시스템 보호, 네트워킹, 명령어 해석기, 시스템 관리 등의 기능도 한다.
운영체제에 있는 프로세스는 다른 사용자의 프로그램으로부터 보호되어야 한다.
따라서 여러 자원은 운영체제가 적절한 권한을 부여한 프로세스만 수행될 수 있도록 해야한다.
예를 들어, 기억장치 주소를 지정하는 하드웨어는 프로세스가 자신의 주소 영역에서만 실행되도록 보장하고, 타이머는 다른 프로세스가 양도한 제어를 받지 않은 프로세스가 프로세서의 제어권을 얻지 못하도록 보장해야 한다.
분산 시스템은 메모리나 클록을 공유하지 않는 프로세서의 집합이다.
프로세서는 자신의 지역 메모리와 고속으로 전송하는 버스, 전화선과 같은 여러가지 통신 매체를 통해 상호 통신하는 다른 프로세서를 가지고 있다. 시스템에 있는 프로세서는 다양한 방법으로 구성될 수 있는 통신 네트워크를 통해 연결된다.
사용자가 입력한 여러가지 명령은 제어 문장에 의해 운영체제에 전달되는데, 이 전달을 명령 해석기가 담당한다.
여기서 주의해야할 점은 명령 해석기는 사용자와 운영체제 간의 인터페이스 역할을 할 뿐이지 운영체제는 아니다.
예를 들어서, 마우스를 사용하는 윈도우나 매킨토시의 명령 해석기는 인터페이스다.
운영체제는 다양한 기준으로 구분지을 수 있다.
- 동시 사용자 수
- 동시에 실행할 수 있는 프로그램 수
- 작업 처리 방식(사용자가 느끼는 사용 환경)
현재 널리 쓰이는 운영체제 (ex) Windows, Linux, Unix)
동시에 2개 이상의 프로그램 처리 수행 가능
다중 작업이라 하더라도 CPU에서는 매순간 하나의 프로그램만 수행한다.
CPU에서 번갈아 수행되지만 CPU 처리 속도가 워낙 빨라서 여러 프로그램들이 동시에 수행되는 것처럼 보이는 것이다.
시분할 시스템
다중 프로그래밍 시스템
멀티 프로세서 시스템
동시에 여러 작업을 해야하는 만큼 좀 더 복잡함 (동기화, 동시수행을 추가로 관리해야해서)
어떻게 작업을 처리해 나가는지로도 운영체제를 구분할 수 있다. 사용자가 작업을 요청하면 처리 과정을 거쳐 결과물을 받게되는데, 결국 요청 이후 얼마나 기다려야 결과물이 나오는지 사용자가 느끼는, 체감할 수 있는 사용 환경에 따른 구분이라고 볼 수도 있다.
앞서 도입 부분에서 잠시 언급한 것과 같이 운영체제는 하드웨어를 보다 잘 관리하는 역할을 수행하고, 잘 관리하기 위해 이전 운영체제의 문제들을 개선하며 발전해왔다.
따라서 이 발전 과정에 따라서 운영체제의 종류를 다음과 같이 구분한다.
1) 순차처리 시스템
2) 배치 시스템
3) 시분할 시스템
4) 퍼스널 컴퓨팅
5) 병렬 처리 시스템
6) 분산 처리 시스템
7) 실시간 시스템
과거에는 따로 운영체제라는 개념은 없고, 그냥 기계어로 프로그램 작성부터 하드웨어 관리 등 결과를 출력하기 위해 필요한 모든 디테일한 작업을 일일이 사용자가 작성했다.
(ex. 천공카드 : 데이터를 표현하기 위해 규칙에 따라 구멍을 뚫어 사용하는 종이카드, 구멍을 뚫는지의 여부로 비트를 표현)
당연히 오래걸리고, 특히 앞 사용자와 뒷 사용자가 서로 매우 다른 작업을 수행해야 한다면 그 작업을 수행하기 위한 준비작업(세팅)에 걸리는 시간까지 오래 걸렸다. (= 시간이 오래걸린다.)
시간이 오래걸린다는 순차처리 시스템을 개선하기 위해 등장한 시스템이다. 배치 즉, 특정 단위 만큼 위 작업이 모일때까지 기다렸다가 모이면 그때 일괄적으로 작업을 수행해주는(누가? 중앙 - 전자계산소, 전산소) 일괄처리 시스템이다.
한꺼번에 실행하니 당연히 세팅 작업에 들어가는 시간을 줄일 수 있었다. 기존 방법보다 시스템 지향적(시스템이 처리하기에 더 좋은 방식인)이었고, 처리효율(throughput) 향상, 여러 사용자가 시스템 자원을 공유할 수 있다는 장점이 있다.
하지만 배치가 모일때까지 대기하는 시간으로 인해 생산성이 저하되는 문제가 생겼다. 다시말해 응답시간(작업을 제출해 결과물을 출력하기까지의 시간)이 오래걸렸다. (=대기시간 문제)
즉, 작업 요청을 모아서 한꺼번에(일괄로) 처리하는 방식이기 때문에 작업 요청을 모으는 동안 CPU가 할 일이 없기 때문에 자원이 낭비된다.
작업들이 대기하는 시간이 오래걸린다. 그럼 작업을 번갈아가면서 조금씩 수행하게 만들면 대기시간을 줄일 수 있다. 말그대로 시간을 쪼개(시분할) 각 작업에 할당하는 방식이 시분할 시스템이다.
일괄로 처리할때는 A작업, B작업, C작업 순으로 진행했는데 시분할 시스템에서는 A작업 일부, B작업 일부, C작업 일부, 다시 A작업 일부 … 이런 식으로 시간을 쪼개어 쓸 수 있다.
(사용자들이 각자 자신의 터미널(단말기)를 통해 시스템에 접속하고 input을 전달하면, 전산소에서 이를 처리한 뒤 개별 사용자에게 결과를 보냄)
일괄처리 방식보다 좀 더 사용자 지향적이며 단말기를 통한 대화형 시스템이라 생산성도 전보다 높아졌다. 당연히 대기시간도 단축할 수 있었다. 이렇게 여러 작업을 한꺼번에 할 수 있게 되었지만(자원의 효율적 활용) 이렇게 작동하게 하기 위해 운영체제는 기존 방법보다 복잡해진다. 예를 들어 파일 시스템이나 가상메모리 등을 관리해주는 작업이 필요했다. 또 단말기 접속 방식을 사용했기 때문에 통신 비용, 보안 문제가 있었고 동시 사용자의 수에 따라 시스템의 부하가 생겨 느려지는 문제가 생겼다.
여러 작업을 일정 시간 단위로 분할해서 처리하는 방식으로, 모든 운영체제에서 가장 많이 사용하는 작업 방식이다. 작업의 우선순위와 처리 순서는 이후 CPU 스케줄링따라 다르다.
사용자들이 OS를 공유하는 게 아니라, 혼자 독점해서 사용하는 방식이다. 퍼스널 컴퓨팅 방식을 사용하기 전에는 CPU 활용률을 최대화 하는 게 목적이었다.
하지만 퍼스널 컴퓨팅 방식의 도입으로 CPU 활용률은 그리 중요하지 않아졌다. 가동할 수 있는 CPU를 최대한 쓰는 것보다, 지금 내가 작업을 편하게 잘 쓸 수 있는지, 사용자 지원 기능이 훨씬 더 중요해지게 되었다.
따라서 혼자 운영체제를 독점하기 때문에 운영체제는 좀 더 단순해졌고, 사용자 편의를 개선하는 기능을 제공하는 쪽으로 발전하게 되었다. 혼자 사용하기에 빠르지만, 이전보다 컴퓨터 자체의 성능은 좀 더 낮다고도 볼 수 있다. (물론 CPU를 여러개 넣어서 성능을 개선할 수도 있다.)
바로 위에서 CPU를 여러개 넣어서 컴퓨터의 성능을 개선한다고 했는데, 이처럼 하나의 시스템에 여러개의 프로세스를 사용하는 시스템을 병렬처리 시스템이라한다. 병렬처리 시스템은 tightly-coupled system으로도 불리는데, 이는 메모리같은 다른 자원들과 tight 하게 묶여있기 때문이다. CPU는 여러개지만 메모리같은 자원은 아직 공유하는 상태이기 때문이다.
이 시스템을 사용하는 목적은 당연히 성능 향상과 신뢰성 향상(한 CPU가 고장나도 다른 CPU가 대신 그 작업을 수행할 수 있어서 성능은 떨어져도 시스템을 계속 돌아가게 할 수 있기 때문)인데, 프로세서가 여러개이다보니 이들 간 작업을 어떻게 배분할지의 역할도 추가적으로 지정해야 하므로 좀 더 복잡해진다.
뿐만 아니라, 현실적으로 CPU를 무제한으로 컴퓨터에 넣을 수도 없다. 이 모든 CPU를 감당할 공간적, 시스템적인 한계가 있기 때문이다. (성능 개선을 위해 무한정 CPU를 늘리는 것은 어렵다)
CPU를 늘리지 못한다면, 컴퓨터를 늘려볼 수 있다. 즉, 컴퓨터를 연결시키는 네트워크 기반의 병렬처리 시스템이 등장했다. 이 네트워크 기반의 병렬처리 시스템은 네트워크를 통해 컴퓨터들을 묶는 것으로, 통신을 이용하는 방법이기 때문에 개별 컴퓨터(=노드)들의 자원은 독립적으로 존재한다. (즉, 각 노드는 자신만의 OS가 있다.) 따라서 Loosely-coupled system으로 부르기도 한다.
물리적인 통신망을 이용하기 때문에 연결하기 쉽지만 관리는 어렵다. 따라서 이를 관리하는 분산운영체제를 통해 하나의 프로그램, 자원처럼 사용할 수 있다. (ex. 클러스터 시스템, 클라이언트 서버 시스템, P2P)
쉽게 컴퓨터를 늘릴 수 있고, 높은 성능과 신뢰성, 확장성이 장점이라면 구축 및 관리가 어렵다는게 단점이다. (컴퓨터를 모아놓고 죄다 선으로 연결하기 때문에 만약 문제가 발생한다거나 실수로 잘못 연결하는 등 관리가 쉽지 않다.)
실시간 시스템은 위의 시스템들과는 별개로, 무엇인가를 개선해 등장했다기보다 기존 방식과는 다른 작업처리 관점의 시스템이다. 작업처리에 제한 시간을 두는 시스템인데, 어떤 작업을 요청했을 때 사용자에게 무조건 답을 줘야만 하는 시스템이다.
주로 항공 관제, 반도체 공정 같이 각 작업의 시간 제한을 엄수해야 하는 시스템에서 사용하는 처리 방식이다. 정해진 시간 내에 결과를 보장해야 한다.
OS는 커널(Kernel : 핵)과 셸(Shell : 껍질)로 이루어져있다.
이처럼 Shell은 다양한 방법으로 입력된 사용자의 명령을 해석하여 그에 대한 아웃풋을 보여주는 역할을 한다.
흔히 우리가 Windows를 다룰 줄 안다는 의미는 Shell을 잘 다룬다는 의미로 해석할 수 있다.
실제로 사용자가 명령을 입력하면 다양한 하드웨어 리소스들을 효율적으로 사용하여 사용자가 원하는 프로그램을 실행해야 하는데 이런 과정은 전부 Kernel에서 진행된다.
대표적인 4가지 기능 : CPU 스케줄링, 메모리 관리, 입출력 관리, 파일관리
- CPU 스케줄링 : 어떤 프로세스에게 CPU 제어권을 줄 지
- 메모리 관리 : 한정된 메모리를 어떻게 관리할 지
- 파일 관리 : 디스크에 파일을 어떻게 보관할 지
- 입출력 관리 : 여러 다른 입출력 장치와 컴퓨터 간의 상호작용을 관리
여기서 API와 시스템 콜이란, 사용자가 응용프로그램 또는 쉘을 이용해 어떠한 명령을 한다고 가정하면, 이러한 명령은 시스템 콜을 통해 운영체제의 커널영역으로 들어가게된다. 이를 시스템 콜(System call) 이라고 한다.
다시 말해, 사용자 프로그램 단에서 운영체제의 기능을 이용하기 위해 호출하는 함수이다.
하지만 시스템 콜이란 이러한 과정을 담고있는 함수이기 때문에 사용이 번거롭다. 따라서 시스템 콜을 제공하는 어떠한 라이브러리 혹인 함수의 형태로 API를 응용프로그램에게 제공한다. 이렇게 되면 API를 통해 비교적 쉽게 OS의 기능을 이용할 수 있게 된다. 가령 우리가 자주쓰는 C언어의 printf문도 운영체제에 접근해, 모니터로 출력하기 위한 일종의 시스템 콜 API라고 할 수 있다.
하지만 이러한 API를 제공함에 있어 윈도우가 가지고 있는 API와 리눅스의 POSIX API등의 규격이 다르기에, 우리는 윈도우에서 돌아가는 프로그램을 리눅스에서는 사용할 수 없게 된다.
API란 더 넓은 뜻으로 사용되기도 하지만 여기서는 이렇게만 알아두고 넘어가도록 하자.
우리가 응용프로그램을 설치할 때를 생각해보면 설치 파일이 OS에 따라 구분되어 있는 것을 알 수 있다.
이는 응용프로그램은 OS 위에서 실행되기 때문에 Windows에서 설치한 프로그램은 Linux나 macOS에서는 실행이 불가능하다.
즉, OS는 Resource Manager로서 리소스를 응용프로그램에 할당하는 역할을 한다.
메인 메모리는 RAM과 ROM으로 나뉘어져있다.
ROM은 Read-Only-Memory의 약자로 RAM에 비해 용량이 굉장히 작다.
프로세서는 컴퓨터가 켜지자마자 ROM에서 코드를 가져와 실행한다.
ROM에는 2가지 코드가 들어있다.
OS가 RAM에 잘 적재되었다면, 이제 컴퓨터는 사용자가 실행하는 프로그램들을 실행할 준비가 된 것이다. 이 때 적재된 OS는 컴퓨터가 종료될 때까지 RAM에 적재되어있다.
이를 OS가 메인 메모리에 Resident(거주)한다고 한다.
정리
- 전원이 켜지기 전
- Boot Loader가 실행가능 상태로 존재, 주로 시스템에 내장된 ROM, 하드디스크, 네트워크 상의 다른 서버 등에 저장되어 있다.
- 전원이 켜진 후
- 바이오스(BIOS)로부터 제어권을 넘겨받는다.
- RAM을 사용할 수 있게 초기화하고 루트(root) 파일시스템을 준비한다.
- 필요한 하드웨어를 초기화한다.
- 특정 운영체제 커널을 RAM에 올린다.
- 제어권(실행권한)을 운영체제 커널에 넘겨준다.
컴퓨터 구조를 나타내는 그림이다. CPU는 메모리와만 작업하고, 메모리는 OS 및 user program의 데이터를 저장하고 있다. user process 간에는 인터럽트를 통해 CPU의 제어권을 넘겨받는다.
각각의 용어에 대해 간략하게 설명한다면,
특정 프로세스가 CPU를 너무 오랫동안 점유하는 것을 막기 위한 타이머이다. 타이머를 이용해 작업을 시간 단위로 측정하고, 정해진 bound가 지나면 OS에게 제어권이 넘어가도록 인터럽트를 발생시킨다. 위에서 언급한 시분할 시스템을 구현하기 위해 사용된다.
외부의 I/O 장치를 관리하기 위한 해당 기기 자체의 일종의 CPU이다. register, local buffer를 보유하고 있다.
I/O 장치 특성상, 입출력이 비정기적으로 자주 발생할 수 있다. CPU가 인터럽트를 자주 당하게 되면 원래 하던 작업을 제대로 완수하지 못하기 때문에, 이것을 방지하기 위한 보조 장치다. CPU의 중재 없이 Device Controller가 Buffer storage의 내용을 메모리에 직접 전송하는 것을 돕는다.
I/O 장치와 직접 상호작용할 수 없다. CPU와 비교했을 때, 권한 수준이나 메모리 접근 능력이 다르기 때문이다.
따라서 CPU를 통해서 I/O 장치에 접근해야 하는데, 이것을 위해 시스템 콜(System call)이라는 커널 인터페이스가 이용된다. 사용자 프로그램은 시스템 콜을 호출해서 I/O 작업을 할 수 있다.
입출력 연산이 CPU 명령 수행속도보다 현저히 느리기 때문이다. 입출력 처리를 기다리는 동안 CPU가 쉬니까 입출력이 완료되면 CPU에게 알리는 기능이다.
즉, CPU는 한번에 한 프로세스밖에 처리할 수 없기 때문에 어떤 일을 처리하는 도중에 우선 순위가 급한 일을 처리할 필요가 있을 때 대처할 수 있는 방안이 필요하기 때문에
I/O 하드웨어 같은 장치나 예외상황이 발생했을 때, 발생한 시점의 레지스터 및 PC를 저장한 뒤 CPU의 제어권을 ISR(인터럽트를 처리하는 커널 함수)에 넘기는 기능을 의미한다.
즉, CPU가 특정 기능을 수행하는 도중에 급하게 다른 일을 처리하고자 할 때 사용할 수 있는 기능이다.
processA 실행 중 디스크에서 어떤 데이터를 읽어오라는 명령을 받았다고 가정했을 때,
주기마다 인터럽트 요청 플래그를 차례로 비교하여 우선 순위가 가장 높은 장치를 찾아 이에 해당하는 ISR을 수행하는 방식
CPU와 인터럽트 요청 장치 사이에 장치 번호를 식별할 수 있는 버스를 직렬/병렬로 연결하여 요청 장치의 번호를 CPU에게 알려주는 방식
참고
- Context Switching
기존 작업을 인터럽트 작업을 수행한 후 다시 이어서 처리할 수 있도록 저장하는 절차- 중첩된 인터럽트
- 순차처리 : 인터럽트의 중요도가 같을 때
- 중첩처리 : 시급한 인터럽트가 먼저 들어온다. 중첩처리 되어지는 만큼 제어스택을 위로 쌓아둔다.
- 인터럽트 벡터
인터럽트 발생시 처리해야 할 인터럽트 핸들러의 주소를 인터럽트 별로 보관하고 있는 테이블- 인터럽트 서비스 루틴(=인터럽트 핸들러)
- 인터럽트가 발생했을 때 해주어야 할 작업을 정의한 기계어 코드
- 요청하는 장치와 발생 상황에 따라 종류 다양
- 운영체제 커널 내에 존재
- CPU 스케줄링, 메모리 관리루틴 등
- 컨트롤러(controller)
- 주변장치들이 탑재하고 있는 작은 CPU이다.
- 해당 장치에 대한 업무를 처리한다.
- 메인 CPU에 인터럽트를 발생시켜 보고한다.
이처럼 입출력이 발생할 때마다 인터럽트를 발생시킨다. 하지만 키보드 입력 및 마우스 이동 등의 입출력 조작은 굉장히 빈번히 일어나고, 그 발생 시기를 CPU가 알 수 없기 때문에 I/O 요청 후 제어권의 변경 유무에 따라 입출력 방식이 나뉜다.
시스템 콜과 인터럽트는 CPU의 제어권이 특정 프로세스에서 다른 프로세스로 이동한다는 공통점이 있지만, CPU의 제어권을 변경시키는 주체가 SW인지 HW인지에 따라 나뉜다.
입출력 장치에는 컨트롤러가 있고 CPU와 입출력할 데이터를 저장하는 버퍼가 있다. 디스크의 데이터는 워드 단위로 버퍼에 채워진 후 CPU에게 인터럽트로 알리고 CPU는 버퍼의 내용을 메모리로 옮긴 후 다음 워드의 입력을 실행한다.
최근 거의 모든 컴퓨터 시스템에서 사용하는 메모리 관리 기법이다.
물리적 메모리보다 큰 프로그램을 실행할 수 있다. (가상 메모리만큼)
가상 메모리 기법에서는 물리적 메모리의 크기와 상관없이 사용할 수 있는 메모리의 크기를 충분히 크다고 가정하고 프로그래밍하는 것이 가능하다.
가능하게 하는 원리는 다음과 같다.
프로그램 전체가 항상 동시에 사용되는 것은 아니다.
그러므로 현재 사용되고 있는 부분만 메모리에 적재 후, 나머지(현재 사용되고 있지 않은 부분)는 하드디스크와 같은 보조 기억 장치에 저장해 두었다가 필요할 때 메모리에 적재하는 방식을 취한다.
이 때 사용되는 보조 기억 장치의 영역을 우리는 스왑 영역(Swap Area)이라 부른다.
프로그램을 구성하는 가상 메모리 주소 공간은 페이지라는 동일한 크기의 작은 단위로 나뉘어 물리적 메모리와 스왑 영역에 일부씩 저장된다.
이렇게 동일한 단위로 메모리를 분할하는 기법을 페이징(Paging) 기법이라 한다.
https://velog.io/@hyeon930/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C-1.-OS-%EA%B0%9C%EC%9A%94
https://velog.io/@10000001a/OS-ch1-1
https://rheem-hm.tistory.com/14
https://mikiplace.tistory.com/7
https://2jinishappy.tistory.com/147
https://woovictory.github.io/2018/12/21/OS-info/
https://huistorage.tistory.com/111
https://velog.io/@adam2/%EC%9D%B8%ED%84%B0%EB%9F%BD%ED%8A%B8
https://m.blog.naver.com/syunjae21/222065512231
https://ko.wikipedia.org/wiki/%ED%94%84%EB%A1%9C%EC%84%B8%EC%84%9C_%EB%A0%88%EC%A7%80%EC%8A%A4%ED%84%B0