📖 본 글은 모든 내용을 "Operating System Concepts Ed.10"에서 인용합니다.
💡 An operating system is software that manages a computer’s hardware.
운영체제란 하드웨어를 관리하는 “소프트웨어”이다.
추상적으로는, 모든 어플리케이션에 대한 근간(basis)을 마련해주고,
유저와 하드웨어 사이의 “중재자” 역할을 해준다.
2가지 관점에서 운영체제를 파헤쳐보자.
💡 The operating system is designed mostly for ease of use, with some attention paid to performance and security and none paid to resource utilization.
사용자의 입장에서는 “편리함”에 중점을 두고 있음을 알 수 있다.
그리고 자원이 어떻게 할당되는 지는 전혀 관심이 없어보인다.
💡 We can view an operating system as a resource allocator.
💡 An operating system is a control program.
사용자와는 반대로 시스템 입장에서는 “자원 할당자”로 인식하고 있다.
또한, OS는 무언가를 “제어”하는 프로그램으로서 정의하고 있다.
💡 In general, we have no completely adequate definition of an operating system.
컴퓨터의 용도가 다양해짐에 따라 정확히 정의를 내리기 힘들다.
💡 The operating system is the one program running at all times on the computer—usually called the kernel.
그러나 한가지 확실한건, OS는 컴퓨터(Kernel) 위에서 항시 동작하는 하나의 프로그램이다.
컴퓨터 시스템은 3가지 주요 측면에서 살펴보면 좋다.
컴퓨터 시스템은 하나 이상의 CPU와 여러개의 Device Controller을 가지고 있고,
이들은 공유 메모리와 “Bus”를 통해 연결되어 있다.
Bus의 종류는 다양하지만, 주요 콤포넌트(키보드, 마우스, 모니터 등)은 보통 system bus를 사용한다.

디바이스는 사용 시에 전기 신호를 곧바로 CPU한테 보내는데, 그 신호를 CPU가 어떻게 알까?
→ Interrupt라는 알람을 보내서 CPU가 알 수 있게 한다.
💬 CPU에는 interrupt-request line이라는 전기신호를 탐지하는 장치가 있다.
구체적으로 어떤 일을 해야 하는지는 Interrupt Vector (IV)에 저장되어 있다.
모든 인터럽트는 숫자를 하나 보내는데, 그게 IV의 index다.
그리고 그 숫자는 Interrupt Controller가 받아서 CPU에 전달해주게 된다.
IV의 value에는 interrupt service routine (ISR)의 주소가 담겨 있어서,
그 주소로 가게되면 interrupt를 처리할 코드가 작성되어있다.
💬 IV는 메모리의 가장 낮은 주소에 저장되서 빠르게 찾을 수 있다.
이들은 interrupt-controller가 기능 제공을 해준다.
하드웨어에서는 어떻게 이를 가능하게 해줄까?
앞서 언급했던 interrupt request line은 2가지 종류가 있는데,
각 상황에 맞게 인터럽트를 선택적으로 처리할 수 있다.
💬 외부 기기가 많아짐에 따라 IV의 공간이 부족한 상황이 발생하게 됐는데,
이를 2-leveled list 방식으로 확장 시킨 것을 Interrupt Chaining이라고 한다.
💬 시스템 프로그램: 운영과 관련된 프로그램
어플리케이션 프로그램: 운영과 관련없는 프로그램
CPU는 기본적으로 명령어(이하 inst)를 memory에서만 가져올 수 있다.
운영체제에서 memory라고 한다면, 보통은 RAM을 얘기한다.
RAM은 DRAM 기술로 제작되어서 읽기(fetch)속도가 빠르지만,
대신 휘발성이 높다는 한계점을 가지고 있다.
그래서 삭제되지 않기를 바라는 data를 저장할 secondary storage가 필요하다.
💬 RAM 말고 다른 메모리도 쓰는데, EEPROM이라는 non-volatile 기술이 있다.
얘는 bootstrap program(운영체제의 최초 실행 담당)을 저장하는데 쓰임!

전체적인 구조는 위 그림을 보자.
단, 현대의 컴퓨터는 보통 2차 저장장치까지만 쓰는 경우가 많다.
인터럽트와 메모리에 대해 간단히 알아봤으니, I/O가 어떻게 처리되는지 보자.
CPU, Memory, Bus라는 3대 요소가 있지만, 이 3개로는 interrupt 처리가 느리다.
모든 byte에 대해서 cpu가 일을 하게 되면, I/O의 느린 속도 상 효율이 떨어지기 마련이다.
그래서 OS가 믿을 수 있으면서 이런 일을 대신해줄 장치를 만들게 되었다.

위의 그림을 보면, DMA라는 친구가 디바이스와 메모리 사이를 연결해주는데,
인터럽트가 들어왔을 때, CPU가 확인하고 DMA에게 데이터 전송을 부탁하는 것이다.
CPU는 buffer, pointer, counter 등을 세팅하자마자 DMA에게 일을 시키면,
DMA는 block 단위로 데이터를 옮겨두고 나서 다 옮겼다고 보고하는 방식이다.
이렇게 함으로써 CPU는 본인 일에 집중하면서도 비동기로 I/O 처리가 가능한 것이다.
컴퓨터 아키텍처의 구체적인 내용을 다룬다기 보다는, 용어를 정리하고 넘어가자.
💡 The core is the component that executes instructions and registers for storing data locally.
코어는 명령어를 수행하고 레지스터를 활용하는 하나의 콤포넌트이다.
초기의 컴퓨터는 연산장치가 하나뿐이었다.
그 뜻은, 명령어가 병렬적으로 처리되지 않고, 모든 로직이 순차적으로 이루어진다는 것이다.
그렇다고 시스템 전체에 processor가 하나만 있다는 것은 아니고,
각 device는 본인만의 microprocessor를 통해 queue 관리를 해주기는 한다.
그럼에도 결국 우리가 사용하는 "컴퓨터"의 연산은 하나라는 뜻이기 때문에,
지금의 우리가 느끼는 속도와는 확연히 느리긴 했다.
그래서 현대에서는 프로세서의 개수 자체를 늘리는 선택을 했다.
N개의 프로세서가 정확히 N배의 속도를 뜻하지는 않지만, 그래도 훨씬 빠르다.
그런데 컴퓨터 구조가 복잡해짐에 따라서 용어가 뒤죽박죽이 되어버렸기 때문에,
이 기회에 확실하게 정의를 잡아두고 넘어가자.
개인 컴퓨터 (PC)를 뜯어보면, CPU 칩이 하나라는 것을 볼 수 있는데,
CPU의 스펙을 보면 Multicore라고 쓰여있어서 헷갈릴 수 있다.
이는 multicore인 singleprocessor이기 때문이다.

모든 CPU core는 자기만의 소형 cache와 register들을 private하게 소유하고,
그 외의 L2 cache를 비롯한 bus, main memory 등은 공유하는 식이다.
이 때문에 정확히 N-core 개수만큼 성능이 N배로 뛰지 않는 것이다.
💬 결국 Multicore는 앞서 얘기한 컴퓨터 시스템(버스+메모리+CPU) 자체를 나눈 것이 아니다.
시스템 자체를 분리한 구조는 Clustered System이라고 별도로 지칭한다.
운영체제의 시작부터 기본적인 동작과정까지 가볍게 살펴보자.
💡 Typically, bootstrap program (initial program) is stored within the computer hardware in firmware. It initializes all aspects of the system, from CPU registers to device controllers to memory contents.
부트스트랩이 하드웨어의 기본적인 세팅을 완료해주고, kernel을 메모리에 올려준다.
이후, 어떠한 동작이 들어올때까지 OS는 가만히 기다리고 있다.
(동작이 아예 없는 경우는 사실상 존재하지 않는다)
여기서 말하는 동작이라 함은 interrupt와 trap이다.
💡 Another form of interrupt is a trap (or an exception), which is a software-generated interrupt caused either by an error or by a specific request from a user program that an operating-system service be performed by executing a special operation called a system call.
인터럽트는 H/W에서 오는 신호이고, 트랩은 S/W에서 오는 신호이다.
따라서 운영체제가 놀고 있는 시간이 실질적으로는 존재할 수 없는 것이다.
💡 One of the most important aspects of operating system is the ability to run multiple programs, as a single program cannot, in general, keep either the CPU or the I/O devices busy at all times. Furthermore, users typically want to run more than one program at a time as well.
멀티프로그래밍이라 함은, 하나 이상의 프로그램을 동시에 "시작" 해둘 수 있다는 뜻이다.
즉, 현재의 프로그램이 I/O를 대기해야 해서 멈춘 상태라면, 다른 프로그램을 실행하면 되는 것이다.
이 멀티프로그래밍 환경에서 실행중인 프로그램을 "process"라고 부른다.
💡 Multitasking is a logical extension of multiprogramming. In multitasking systems, the CPU executes multiple processes by switching among them, but the switches occur frequently, providing the user with a fast response time.
멀티태스킹은 멀티프로그래밍이라는 개념의 확장이다.
프로세스들을 재빠르게 계속해서 스위칭 해주면서 동시에 실행중인 것 처럼 느끼게 해준다.
그런데 이런식으로 사용자가 원하지도 않았는데 스위칭을 계속 해주려면,
어떤 프로세스로 스위칭을 해줄 지 선택하는 기준이 있어야 할 것이다.
이 결정을 CPU Scheduling이라고 부른다!
💡 In a multitasking system, the operating system must ensure reasonable respose time. A common method for doing so is virtual memory, a technique that allows the execution of a process that is not completely in memory. The main advantage of this scheme is that is enables users to run programs that are larger than actual physical memory.
또한, OS는 이 과정에서 합리적인 응답 시간을 보장해줘야 한다.
그리고 이를 가능하게 도와주는 대표적인 기술이 바로 Virtual Memory이다.
가상 메모리의 가장 큰 이점은 실제 메모리 공간보다 많은 양의 프로세스를 올릴 수 있다는 것이다.
뿐만 아니라, 물리주소를 논리주소로 관리할 수 있게 해줘서 개발자 편의성도 제공해준다.
운영체제와 사용자들이 컴퓨터 시스템의 하드웨어를 공유하기 때문에,
잘 디자인된 운영체제는 잘못된 프로그램이 다른 프로그램에 영향을 미치지 않도록 해야한다.
💡 At the very least, we need two seperate modes of operation: user mode and kernel mode. A bit, called the mode bit, is added to the hardware of the computer to indicate the current mode: kernel (0) or user (1).
최소한 2개의 서로 구분된 모드를 사용하여 안전하게 자원을 지킬 필요가 있다.

이런식으로 kernel code를 실행할 때에는 반드시 kernel mode로 들어가야 한다.
그렇다면 어떤 경우에 kernel mode로 들어가게 되는 것일까?
💡 We accomplish this protection by designating some of the machine instructions that may cause harm as privileged instructions.
문제가 생길 수 있는 기계 명령어들은 privileged instruction의 권한을 받는다.
유저 모드에서 이에 접근하게 되면, 불법으로 판단하고 trap으로 넘겨버리게 되는 것.
이후에 운영체제의 판단에 따라 kernel 모드로 권한을 준 뒤 실행시켜줄 수 있다.
💬 컴퓨터 시스템 내부적으로 timer라는걸 가지고 있어서, 특정 시간이 지날 때마다 OS에게 interrupt를 보내서 시간의 경과를 알려준다.
앞서 얘기했듯이, 운영체제는 자원관리자이다.
그런데 컴퓨터에서 자원이라 불리는 것들이 굉장히 많다.
하나씩 가볍게 알아보고 넘어가자.
💡 We emphasize that a program by itself is not a process. A program is a passive entity, like the contents of a file stroed on disk, whereas a process is an active entity.
여기서 중요한 것은, 프로세스는 프로그램과 같은 말이 절대 아니다.
단순히 디스크에 올라간 것은 프로그램일 뿐이고, 그것이 실행된 것이 프로세스인 것.
더 나아가서, 실행이 되고 있는 것은 프로세스 내의 thread이다.
Single-thread라면, 해당 프로세스 내에서 하나의 작업이 이루어지는 것이고,
multi-thread라면, 여러 작업이 번갈아가며 (거의 동시에) 일하고 있는 것이다.
💬 이후에 자세히 다루겠지만, 쓰레드는 독립적인 program counter를 갖는다.
💡 A process is the unit of work in a system.
정리하자면, 프로세스는 시스템 내에서의 작업 단위이고, 실제 일은 쓰레드가 하는 것이다.
본론으로 돌아와서, 운영체제가 이런 프로세스를 어떤 면에서 관리하는 것일까?
💡 The main memory is generally the only large storage device that the CPU is able to address and access directly.
메모리가 중요한 이유는, CPU가 직접 접근할 수 있는 큰 공간 중 유일하기 때문이다.
(나중에 볼 cache도 어느정도 비슷한 역할을 하기는 한다.)
그렇기에 더더욱 메모리의 공간을 효율적이게 쓰는 것이 중요해졌다.
운영체제가 이를 위해 하는 일은 다음과 같다.
💡 To make the computer system convenient for users, the operating system provides a uniform, logical view of information storage.
우리가 파일을 손쉽게 관리할 수 있는 이유는,
1차원 배열로 구성된 물리주소를 운영체제가 논리적으로 표현해주기 때문이다.
또한, 제작자가 정의한 data들을 논리적인 묶음으로서 file을 정의해주기도 한다.
파일 시스템에 있어서 운영체제가 하는 일은 다음과 같다.
상대적으로 덜 중요해 보일 수 있어도, 저장장치에 대한 관리는 매우 중요하다.
메모리는 휘발성을 띄기 때문에 컴퓨터가 꺼져도 저장될 파일들을 보관하는 곳이기 때문이다.
운영체제는 이러한 저장장치에 대한 관리도 도맡아 하고 있다.
💡 Because cahces have limited size, cache management is an important design problem. Careful selection of the cache size and of a replacement policy can result in greatly increased performance.
캐시는 컴퓨터 시스템에서 굉장히 중요한 구성요소 중 하나이다.
메모리도 충분히 빠르지만, CPU 입장에서는 그마저도 느리기 때문에,
자주 사용되는 data를 더 빠르게 찾을 필요가 있기 때문이다.
그래서 캐시의 크기와 교체 알고리즘은 신중하게 결정한 필요가 있다.
속도 측면에서의 성능에 중대한 영향을 미치기 때문에 나중에 더 자세히 알아보고,
지금은 cache coherency 문제 정도만 인지하고 넘어가자.
💡 In a hierarchical storage structure, the same data may appear in different levels of the storage system.
메모리 계층구조의 특성 상, 같은 data가 여러 층에 걸쳐 저장되있을 것이다.
그러나 그 모든 층에서 항상 같은 값일 것이라고 보장할 수는 없다.
이것을 캐시 일관성 문제라고 부른다.
💡 One of the purpose of an operating system is to hide the peculiarities of specific hardware devices from the user. For example, in UNIX, the perculiarities of I/O devices are hidden from the bulk of the operating system itself by the I/O subsystem.
운영체제는 디바이스의 고유한 특성을 유저로부터 숨긴다.
특히 UNIX 에서는 I/O Subsystem을 통해 운영체제로부터 숨겨진다.
I/O subsystem은 다음과 같은 기능들을 제공한다.
사실 운영체제가 하는 일은 위의 것들 말고도 정말 많지만, 이후 챕터에서 천천히 다루기로 하자.
어느정도 알고 가야하는 개념들만 짚고 넘어가자.
💡 Protection, is any mechanism for controlling the access of processes or users to the resources defined by a cimputer system.
보호(protection)은 권한에 대한 전반적인 관리 방법을 얘기한다.
💡 It is the job of security to defend a system from external and internal attacks.
보호를 잘 지켰음에도, 해킹과 같은 악의적인 공격으로부터 컴퓨터를 지킬 수 있어야한다.
이를 보안(security)라고 한다.
💡 Virtualization is a technology that allows us to abstract the hardware of a single computer into several different execution environments, thereby creating the illusion that each separate environment is running on its own private computer.
하나의 컴퓨터의 하드웨어를 추상화해서 독자적으로 작동하는 것처럼 보여주게 하는 것이다.
우리가 흔히 아는 VM(가상 머신)이 바로 운영체제가 제공하는 기능 중 하나이다.
💡 Emulation, which involves simulating computer hardware in software, is typically used when the source CPU type is different from the target CPU type.
만약 구현하고자 하는 CPU 구조가 실제로 사용하는 것과 다른 경우에는,
emulation이라는 기술을 통해 구현이 가능하다.
분산 시스템, 클라우드 컴퓨팅, P2P 컴퓨팅 등 다양한 컴퓨터 시스템이 존재한다.
이들은 분산 컴퓨팅을 공부하면서 자세히 알아보자.
운영체제는 한시도 쉬지 않고 일을 한다.
컴퓨터의 자원을 관리하면서도, 사용자에게 편의성을 제공해준다.
정말 고마운 존재이니 잘 알고 쓰도록 하자.
Abraham Silberschatz, 『Operating System Concepts Ed.10』
잘 보고갑니다 ;)
문단에 구분선("---")이 있으면 더 읽기 편할듯 하네요 ^^