[운영체제] 운영체제의 정의와 컴퓨터 구조(Operating System and Computer Architecture)

참고도서: Operating System Concepts (9/E) Abraham Silberschatz, Peter B. Galvin, Greg Gagne

OSC 책과 1주차 강의는 개괄적인 concept을 중심으로 진행되었다. 컴퓨터 구조에서 많이 배웠던 부분들인데, 방학 사이에 컴퓨터 구조 내용을 많이 잊어버려서 다시 상기시키면서 공부하기에 좋은 챕터였다.

운영체제의 정의

운영체제는 무엇이다 라고 정의하기에는 운영체제가 너무나 많은 일들을 한다. 따라서 운영체제를 한마디로 정의하기 보다는 운영체제의 목적이 무엇인지, 그 쓰임새를 바탕으로 정의내리는 것이 좋을 것이다.

사용자의 관점에서

사용자의 관점에서 운영체제는 컴퓨터의 리소스를 쉽게 사용할 수 있도록 그 환경을 제공해주는 역할을 한다. 물론 모든 컴퓨터가 그렇지는 않다. 자동차나 간단한 전자기기에 탑재된 임베디드 컴퓨터에는 운영체제가 필요할까? 이런 기기들은 주어진 입력에 대해 정확하고 반복적인 작업만 순차적으로 수행하면 되기 때문에 운영체제가 필요하지 않고 실제로도 운영체제 없이 설계되어 있다.

시스템의 관점에서

쉽게 말해서 주어진 환경에 있는 리소스들을 시의적절하게 사용할 수 있도록 해주는 resource allocator의 역할을 운영체제가 하게된다. 컴퓨터는 주어진 컴퓨터 시스템으로만 작동되지 않고 여러 외부 리소스, 즉 외장 디바이스들과의 작업이 수행되기 때문에 리소스를 때에 따랑 잘 분배하는 것은 매우 중요한 일이다.

정의내리기

위 내용을 바탕으로 생각해보면, 운영체제는 다음과 같이 정의할 수 있겠다.

"다양한 소프트웨어와 하드웨어 구성요소들이 시스템에서 잘 사용될 수 있도록 돕는 프로그램"

이 정의 역시도 너무나 추상적으로 느껴진다. 우리는 보통, 운영체제를 단순하게 컴퓨터가 켜져있는 동안 계속 실행되는 프로그램이라고 부르기도 한다. 그리고 이런 프로그램을 kernel 이라고 부른다. 운영체제와 kernel은 다르지만 운영체제 안에 kernel이 포함된다.

컴퓨터 시스템

컴퓨터 시스템의 동작 원리

컴퓨터가 동작할 때 내부적으로 어떤 일이 일어나는지 한번 구체적으로 정리해보자.

1단계: Bootstrap Program 시작하기
컴퓨터를 처음 부팅하게 되면 컴퓨터는 스스로 초기 프로그램들을 실행시킨다. 이런 프로그램들을 bootstrap program 이라고 하는데, 이 녀석들은 일반적으로 firmware라고 불리는 ROM이나 EEPROM 에 저장되어 있다. bootstrap program은 시스템을 시작시키는 역할을 하기 때문에, 운영체제의 kernel이 어디에 위치하는지 파악하고 kernel을 메모리에 넣어주는 작업을 필수적으로 해야한다.

2단계: kernel 시작하기
Bootstrap program에 의해 kernel이 메모리로 옮겨지면 kernel은 시스템과 사용자에게 서비스를 제공하기 시작한다. 이때 제공되는 서비스는 kernel 내부에 들어있거나 system program에 의해 제공된다. 앞서 정의했던 대로 kernel 은 컴퓨터가 켜져있는 동안 계속 실행된다. 이때 kernel이 실행되는 동안 함께 계속 실행되는 프로그램들을 system process 혹은 system daemon 이라고 한다.

3단계: 이벤트 기다리기
Kernel과 system process가 계속 실행되면, 시스템은 어떤 이벤트가 발생할 때까지 대기하게 된다. 이런 이벤트들은 주로 하드웨어나 소프트웨어에 의해 발생하는데, 하드웨어에 의해 발생하는 이벤트를 interrupt 라고 하고, 소프트웨어에 의해 발생하는 이벤트를 system call이라고 한다.

4단계: 이벤트 처리하기
interrupt는 대부분 system bus를 통해 CPU에게 전달되고, system call 역시도 CPU에 전달된다. CPU는 이런 이벤트 신호들을 받으면 현재 진행하던 작업을 중단하고 이벤트에 맞는 행동을 취한다. 이때 수행하는 작업을 interrupt service routine 이라고 하는데, 어떤 interrupt signal에 대해 어떤 작업을 수행할지 이미 다 지정되어 있는 테이블을 interrupt vector 라고 한다. 따라서 CPU는 신호를 받으면 이 테이블에서 바로 service routine의 위치를 참조하여 명령어들을 실행하는 것이다. 그렇다면 중단되었던 작업은 어디에 보관될까? 이 문제를 해결하기 위해서 system stack을 사용한다. system stack에는 실행되는 작업들이 순차적으로 쌓이게 되고 작업이 끝나면 stack에서 pop 되는 방식으로 사용된다.

컴퓨터 시스템은 종료되기까지 위 단계를 반복적으로 실행하며 작업을 수행한다.

저장공간 구조

Main Memory

제일 중요하고 기억해야할 것은 컴퓨터에서 실행된는 모든 프로그램과 작업은 실행 이전에 메모리로 옮겨져야 한다는 것이다. CPU가 직접적으로 접근 할 수 있는 가장 큰 크기의 메모리가 RAM이기 때문에 우리는 RAM을 main memory라고 부른다. 메모리는 바이트 단위의 배열로 구성되어 있고 한 바이트마다 고유한 주소를 가지고 있다. CPU는 이 주소를 load 나 store 명령어를 통해 관리하면서 명령어들을 실행하게 된다.

Von Neumann Architecture

폰노이만 구조에서는 어떤 작업을 실행하기 위해서 메모리에 들어있는 명령어를 가져와 instruction register에 옮기는 작업을 먼저 수행한다. 그리고 instruction register 안에 들어있는 명령어들을 decoding 하는 작업을 거쳐 명령어의 연산들을 수행한다.

Volatile memory and secondary storage

어차피 모든 프로그램은 main memory를 거쳐야 하니, 모든 프로그램을 메모리에 저장해둔다면 너무나 편리하게 컴퓨터를 사용할 것이다. 하지만 현실은 늘 그렇듯 시궁창이다.. main memory는 거의 항상 휘발성의 특징을 가진다. 시스템의 전원을 종료시키면 메모리에 담긴 모든 정보가 사라진다는 의미이다. 엎친데 덮친격으로 main memory는 우리가 사용하는 모든 프로그램을 담기에 용량이 너무나 부족하다.

이런 문제를 해결하기 위해서 우리는 secondary storage 라고 불리는 저장공간을 사용한다. 그리고 여기서 그치는 것이 아니라 storage hierarchy를 만들어서 용량이 작지만 속도가 빠른 휘발성 저장장치와, 속도는 느리지만 용량은 큰 비휘발성 저장장치를 함께 사용하는 방법을 고안했다.

SSD를 최근에 많이 사용한다. HDD보다 속도가 무지막지하게 빠르다. 어떻게 만들어졌길래 이런 성능이 가능할까? SSD는 내부적으로 휘발성 저장장치를 함께 사용한다. SSD는 휘발성 저장장치를 컴퓨터가 실행되는 동안 사용하고 시스템이 종료되면 해당 저장장치에 있던 정보들을 모두 비휘발성 저장장치에 옮겨둔다. 시스템이 사직되면 다시 그 정보들을 휘발성 자장장치에 넣는 것이다. 단순하지만 아주 효과적인 방법이다.

I/O 구조

운영체제와 I/O는 뗄레야 뗄 수 없는 관계이다. 운영체제의 내부는 대부분 I/O 장치를 어떻게 관리할 것인지에 대한 내용이기 때문이다. 일반적인 컴퓨터에서는 I/O장치에 대한 제어를 위해 Device Controller 가 사용된다. 운영체제는 이 컨트롤러들에 대한 Device Driver를 포함해서 I/O 장치들이 운영체제와 잘 소통이 되도록 한다.

CPU는 어떤 I/O 명령이 들어왔는 알아내기 위해서 device driver가 device controller에 있는 레지스터를 확인한다. 컨트롤러는 이 레지스터를 검사해서 어떤 명령어를 수행할지 결정한다. 그리고 장치로부터 오는 데이터들을 내부 local buffer를 통해 device driver에 전달한다. 이 전달하는 작업이 끝나면 device controller 는 driver에게 작업이 끝났다는 것을 interrupt signal을 사용하여 알리게 된다. 마지막으로 driver는 수행 결과에 대한 정보를 운여체제에게 전달하게 된다. 이런 방식의 I/O 명령 수행을 interrupt driven I/O 라고 부른다.

위와 같은 방법은 크기가 큰 작업에 대해서는 적합하지 않다. 따라서 DMA(Direct Mapped Access) 방식을 사용하기도 한다. 이 방식에서는 device controller가 CPU의 개입없이 I/O 장치로부터 오는 데이터를 통채로 메모리로 옮겨버린다. 이 방법에서는 interrupt 는 메모리로 옮기는 과정을 끝냈다는 의미로 단 한번만 사용된다.

Single-Processor Systems

예전 컴퓨터들은 모두 프로세서가 하나 밖에 없었다. 따라서 CPU가 한번에 한 명령어만 수행해야했고, I/O를 효율적으로 처리하기 위해서 special-purpose processor를 만들어 주어진 작업을 처리하도록 하는 특수목적의 프로세서를 만들어 사용하기도 했다.

Multiprocessor Systems

기술의 발전은 하나의 컴퓨터 시스템안에 여러 프로세서가 사용될 수 있도록 했다. 원래는 한 프로세서가 모든 작업을 해야했지만 이제 여러개의 프로세서가 일을 처리하기 때문에 전체적인 throughput이 좋아지는 효과가 있다. 그리고 동일한 갯수의 single-processor를 여러개 사용하는 것보다 공급전원의 소비량이 크게 줄어들었다.

특히 multiprocessor system에 대해 주목해야할 점은 안정성이 크게 향상되었다는 것이다. 여러개의 프로세서를 사용하기 때문에, 한 프로세서의 일부, 혹은 전체가 마비되는 상황이 생기더라도 작업을 계속 수행할 수 있게 되었다. 이렇게 일부에 문제가 생겼을 때 작업을 이어나가는 능력을 graceful degradation 이라고 하고, 완전히 마비되어도 작업을 수행할 수 있는 능력을 fault tolerant 라고 한다. single processor 에서는 상상도 할 수 없는 일이다.

Type of Multiprocessor Systems

Multiprocessor System의 설계를 위해서 일반적으로 두 가지 방법을 사용할 수 있다.

Asymmetric Mutiprocessing

Asymmetric Multiprocessing 설계는 여러개의 프로세서들이 운용되면서 각각의 프로세서가 주어진 특정한 작업만을 수행하는 것을 의미한다. 따라서 프로세서들이 시스템의 작업상황에 맞게 유동적인 작업을 하는 것이 아니라 고정된 임무를 계속적으로 수행하는 것이다.

Symmetric Multiprocessing(SMP)

SMP 라고도 불리는 이 설계방법은 각각의 프로세서가 유동적으로 작업을 수행하는 설계이다. 운영체제가 모든 프로세서들을 관리하면서 작업을 할당해주고, 각 프로세서는 각각 캐시와 레지스터를 가지고 있다. 한가지 특징은 시스템을 구성하는 프로세서들이 모두 같은 메모리를 공유한다는 것이다. 따라서 작업이 정교하게 잘 분배되어야 한 프로세서로 모든 작업이 몰리거나, 메모리 접근에 충돌이 일어나는 일을 막을 수 있을 것이다.

Clustered Systems

Clustered System은 multiprocessor system이 좀 더 확장된 형태이다. 여러개의 나뉘어진 독자적인 컴퓨터 시스템이 네트워크를 통해 연결되어 있는 설계이다.

일반적인 multiprocessor system처럼 clustered system도 두가지 종류로 나뉠 수 있다.

Asymmetric으로 설계된 clustered system은 하나의 시스템이 작업을 수행하고 다른 시스템들은 이 시스템에 문제가 일어나는 것을 기다리고 있는 상태이다. 만약 작업을 진행하던 시스템에 문제가 생겨서 작업이 중단되면, 해당 작업을 지켜보던 다른 시스템이 다시 시작하게 된다. 이런 대기상태를 hot-standby mode 라고 한다.

Symmetric 으로 설계된 clustered system은 두 개 이상의 시스템이 각자의 작업을 수행하면서 또 동시에 서로의 상태를 감시하는 형태의 설계이다. 이것이 가능한 이유는 symmetric clustered system 에서는 한 프로그램을 여러개로 쪼개어서 병렬적으로 작업을 수행하는 parrallelization이 가능하기 때문이다.


Written by@전여훈 (Click Me!)
고민이 담긴 코드를 만들자, 고민하기 위해 공부하자.