이 글은 운영체제 공룡책을 읽고 정리한 내용입니다.
운영체제는 컴퓨터가 동작할 수 있는 환경을 제공해주는 SW 라고 볼 수 있습니다. 컴퓨터 자체는 물리적인 HW이기 때문에 운영체제라는 SW를 탑재해야만 다양한 응용프로그램들이 동작할 수 있습니다.
말 그대로 compute + er 계산기 인데, 정보를 처리하기 위한 장치입니다.
현대 컴퓨터의 구조는 모두 앨런 튜링이 설계한 튜링머신을 기반으로 하고 있기 때문에 튜링머신의 구조에 대해 먼저 알아보겠습니다.
튜링머신은 세 가지로 구성되어 있습니다.
즉 행동표에 정의 되어있는 행동 양식에 따라 헤드가 동작하며, 테이프에 어떠한 정보를 읽고 쓰는 동작을 하는 기계가 튜링머신입니다.
현대 컴퓨터와 비교해보면 테이프는 메모리, 테이프의 정보를 읽고 쓰는 헤드는 메모리 입출력 장치 혹은 프로세서, 동작을 정의하는 작동규칙표는 곧 CPU 혹은 응용프로그램과 유사한 것을 알 수 있습니다.
이 튜링머신 (응용프로그램)이 여러개 모이면 universal turing machine이 되는데, 이러한 집합을 운영체제에 비유할 수 있습니다.
컴퓨터 하드웨어 안에 운영체제가 필수로 들어가고, 시스템프그래밍을 통해 운영체제와 통신하여 컴퓨터의 하드웨어가 동작할 수 있는 응용프로그램을 만들 수 있습니다.
사용자는 이 응용프로그램을 사용하려 하게되고 요청을 받아 운영체제에서 서비스를 제공해주게 됩니다.
현대에는 다중코어를 가진 CPU와 다양한 물리적 디바이스 컨트롤러들이 버스를 통해 메모리 (RAM)에 연결되어 있습니다. 이러한 형태의 컴퓨터 시스템을 OS 가 제어해주게 됩니다.
컴퓨터를 처음 작동시키면 가장먼저 벌어지는 일이 ROM(Read-Only-Memory)에 운영체제를 로딩하는 일이며 이것을 Bootstrapping이라 부릅니다.
컴퓨터 시스템은 하드웨어, 운영체제, 응용프로그램으로 구성됩니다.
하드웨어는 중앙처리장치(CPU), 메모리 입출력 (I/O) 장치로 구성되고 기본 연산자원을 제공하는데 응용프로그램에서 사용자의 계산문제를 해결하기 위해 이들 자원이 어떻게 사용될지를 정의한다.
운영체제는 그 자체로는 유능한 기능을 수행하지 못하지만, 다른 프로그램이 유용한 작업을 할 수 있는 환경을 제공합니다.
운영체제에는 항상 실행중인 커널, 응용프로그램 개발을 쉽게 하고 기능을 제공하는 미들웨어 프레임워크, 시스템을 관리하는데 도움이 되는 시스템 프로그램이 포함됩니다.
현대의 범용 컴퓨터 시스템은 하나 이상의 CPU와 공통버스를 통해 연결된 여러 장치 컨트롤러로 구성되는데 운영체제안에는 각 장치 컨트롤러에 대한 장치 드라이버가 있습니다.
따라서 현대에 새로운 컴퓨터나 모바일 휴대폰장치를 개발할 때 대부분 운영체제에 붙어있는 디바이스 드라이버 및 컨트롤러를 개발하는 작업이 수행됩니다.
폰 노이만 구조 시스템에 의해 실행되는 전형적인 명령-실행 사이클은 먼저 메모리로부터 명령을 인출하고, 그 명령을 명령레지스터에 저장합니다. 따라서 CPU는 메모리에서만 명령을 적재할 수 있으므로 프로그램을 먼저 메모리에 적재해야 합니다.
컴퓨터는 프로그램 대부분을 메인 메모리라 불리는 RAM에서 가져오는데, 이는 휘발성 이므로 전원이 꺼지면 내용이 손실됩니다. 비휘발성 메모리에는 운영체제를 적재하는 부트스트랩, 읽기전용 메모리 EEPROM, 비휘발성 저장장치인 펌웨어 등이 있으며, 모든 형태의 메모리는 주소를 의미하는 바이트의 배열을 제공합니다.
EEPROM이나 펌웨어 등은 메모리의 변경이 용이하지 않기에, 프로그램은 메인메모리 RAM에 올려야 합니다.
보조저장장치로써 하드디스크 드라이브(HDD) 와 비휘발성 메모리 (NVM)를 사용합니다. 따라서 대부분의 시스템 및 응용프로그램은 메모리에 적재될 때 까지 보조저장장치에 저장됩니다.
HDD는 기계식 저장장치, NVM은 전기적 저장장치 (예를 들면 SSD) 라고 불리는데, 일반적으로 전기적 저장장치가 더 성능이 좋습니다.
컴퓨터 시스템은 사용된 범용 처리기의 수에 따라 분류 가능합니다.
코어는 명령을 실행하고 로컬로 데이터를 저장하기 위한 구성요소이며 하나의 메인 CPU는 프로세스의 명령어를 포함하여 범용 명령어 세트를 실행할 수 있습니다. 단일 처리코어를 가진 하나의 CPU로 이루어진 프로세서를 단일처리기 시스템이라 부릅니다.
최신 컴퓨터에서는 다중처리기 시스템 (multiprocessor system)이 존재하는데, 이는 단일코어 CPU가 있는 두 개 이상의 프로세서를 의미합니다. 프로세서 수를 늘리면 더 적은 시간에 더 많은 작업을 수행할 수 있으므로 처리량이 증가하는 장점이 있습니다. 그러나 N개의 프로세서를 쓴다고 N배 처리속도가 빨라진다고 볼 수는 없는데 이유는 여러 프로세서가 하나의 작업에 협력할 때 오버헤드가 발생하기 때문입니다.
둘 이상의 독자적 시스템 또는 노드들을 연결하여 구성한 시스템입니다. 다중 처리기 시스템은 하나의 독자적 시스템 안에 여러 프로세서가 존재하는것에서 차이가 있습니다. 클러스터 컴퓨터는 저장장치를 공유하고 LAN과 같은 근거리 통신망이나 연결망으로 연결됩니다.
클러스터 내 하나의 컴퓨터가 고장나더라도 서비스는 계속 제공되므로 높은 가용성을 제공할 수 있습니다. 병렬화라는 기법으로 컴퓨터의 각 계산 노드가 일부문제들을 해결하여 종합하도록 구현한다면, 다중처리기 시스템 보다 훨씬 큰 계산능력을 제공할 수 있습니다.
보통 응용프로그램을 메모리에 올려두고 사용하게 되는데, 여러개의 응용프로그램을 메모리에 올려두고 동시에 사용할 수 있다면 CPU 효율을 높게 가져갈 수 있습니다.
CPU는 우리가 생각하는것보다 성능이 훨씬 좋기 때문에 한번에 하나의 프로그램만 동작하게 사용한다면, 인터럽트를 대기하는 시간이 대부분을 차지하게 되고 이 시간들이 낭비되게 됩니다.
따라서 여러 프로그램이 동시에 돌아가면서 CPU가 담당하는 작업을 계속해서 전환하며 마치 여러개의 작업을 동시에 수행하는것처럼 동작하게 구현하는 것을 multiprogramming이라고 부릅니다.
RAM에 여러개의 프로세스가 동시에 준비된 상태이더라도, CPU는 한 번에 하나의 일만 처리할 수 있기 때문에 다음 매 작업전환마다 다음에 동작할 프로그램을 선택해야 합니다. 이 때 CPU가 최대한 효율적으로 일할 수 있도록 작업을 선택하는 방법론을 CPU scheduling이라고 합니다.
운영체제에는 유저모드와 커널모드 두 가지 모드가 존재합니다. 그 이유는 유저가 어떤 프로그램을 다룰 때 잘못 동작하여 치명적인 오류를 발생시키는 일을 막아야 하기 때문입니다.
유저 프로세스와 커널 프로세스로 나뉘는데, 유저 프로세스에서는 HW를 직접적으로 제어할 수 없습니다. system call 을 사용하여 커널에 요청을 보내야지만 커널에서 HW를 제어하게 됩니다.
약간 요런느낌인데
출처 : https://blockdmask.tistory.com/69
커널에는 파일시스템 및 메모리와 각종 디바이스 드라이버 등의 중요한 컴퓨터 자원이 존재하므로 유저가 이를 직접적으로 접근해서 제어하지 못하도록 해야합니다.
따라서 유저모드에서 유저가 어떠한 명령을 내리면 system call 이라는 명령을 통해 커널모드에 접근하여 컴퓨터자원을 사용하거나 하드웨어에서 어떠한 동작을 수행하도록 명령을 내리고 다시 유저모드로 복귀하는 형태로 동작합니다.
현대적인 컴퓨터에서는 여러개의 프로세스를 하나의 CPU에서 병렬적으로 처리가능합니다. 기술이 발전함에 컴퓨팅 능력이 강력해지고, 병렬적으로 처리할 수 있는 프로세스가 늘어나게 되었습니다. 따라서 다중 프로세스만 처리하지 말고 하나의 CPU를 가지고 여러개의 운영체제를 단일 컴퓨터 내에서 돌릴 수 있도록 하는 기술이 등장하게 되었고 이를 가상화 기술이라 부릅니다.
VMM (Virtual Machine Manager) 라 불리는 가상머신을 여러개를 띄우고 각각 다른 OS를 설치하여 OS VMM scheduling을 통해 여러 운영체제를 돌릴 수 있게 됩니다.
단일 운영체제와 VMM을 활용한 다중운영체제를 시각화한 모습.