CHAPTER 2 - 시스템 구조 (System Structures)

CH 2에서는,
- 첫째로, 운영체제가 제공하는 서비스와 System Call이란 무엇인가에 대해서 알 수 있다.
- 둘째로, 운영체제 설계 및 구현 시에 고려해야 하는 점에 대해서 알 수 있다.
- 셋째로, 운영체제의 여러 구조들에 대해서 알 수 있다.

 


2.1 운영체제 서비스(Operating System Service)

- 운영체제는 프로그램 실행 환경을 제공하며, 특정 서비스를 사용자에게 제공한다.

1. 사용자 인터페이스(User interface)
  1-(1) CLI(Command Line Interface) : 문자열로 명령하는 인터페이스를 제공함.
  1-(2) Batch Interace : 디렉티브가 파일 형태로 입력되고, 파일을 통해 인터페이스를 제공함.
  1-(3) GUI(Graphical User Interface) : 가장 보편적. 그래픽 요소들을 통해 인터페이스를 제공함.

2. 프로그램 수행(Program Execution)
  - System은 Program을 메모리에 load 해서 실행할 수 있어야 한다.
  - 프로그램이 정상적이든, 비정상적이든 실행을 끝낼 수 있어야 한다.

3. 입출력 연산(I/O Operation)
  - 수행 중인 프로그램은 입출력을 요구할 수 있다.
  - 사용자는 보통 입출력 장치를 직접 제어할 수 없으므로, 운영체제가 입출력 수행의 수단을 제공해야 한다.

4. 파일 시스템 조작(File System Manipulation)
  - 프로그램은 파일을 읽고 쓸 수 있어야 하며, 이름에 의해 파일 생성/삭제/검색 등을 할 수 있어야 한다.
  - 이에 많은 OS들은 다양한 specific feature와 Performance feature를 제공하기 위해 다양한 파일 시스템을 제공한다.

5. 통신(Communication)
  - 한 프로세스가 다른 프로세스와 정보를 교환해야 할 필요가 있는 상황이 많다.
  - 이러한 통신은 두 가지 방법(Shared Memory, Message Passing)에 의해 구현될 수 있다.

6. 오류 탐지(Error Detection)
  - 운영체제는 모든 가능한 Error를 항상 의식하고 있어야 한다.
  - Error는 CPU, Memory Hardware, I/O, 또는 user program에 의해 일어날 수 있다.

7. 자원 할당(Resource Allocation)
  - 다수의 User가 존재하거나 다수의 작업들이 동시에 수행될 때, Resource를 적절히 할당해주어야 한다.
  - 예를 들어, CPU를 최대한 효율적으로 이용하기 위해 운영체제는 CPU Scheduling Routine이 CPU의 속도, 사용 가능한 레지스터 수 등의 다양한 요인을 고려하여 자원을 할당한다.

8. 회계(Accounting)
- 사용자가 컴퓨터 자원을 어떻게, 얼마나 많이 사용하는지를 알 수 있도록 해야 한다.

9. 보호(Protection)와 보안(Security)
- 보호(Protection) : 시스템 자원에 대한 모든 접근이 통제되도록 보장하는 것
- 보안(Security) : 각 사용자가 자원에 대한 접근을 원할 때, 시스템에게 자기 자신을 인증하는 것에서부터 시작.

 


2.2 사용자 운영체제 인터페이스 (User OS Interface)

* 명령 해석기(Command-Interpreter)
- 선택할 수 있는 명령어 해석기를 여러 개 제공하는 시스템에서는 이 해석기를 "셸"이라고 부른다.
- 명령어 해석기의 중요한 기능은 사용자가 지정한 명령을 가져와서 그것을 수행하는 것이다.

* GUI(Graphical User Interface)
- CLI 방식보다 사용자 친화적인 방식으로, 사용자는 마우스를 통해 아이콘을 클릭함으로써 프로그램을 수행할 수 있다.
- 스마트폰이나 태블릿에서는 마우스를 사용하지 않고, '터치스크린 인터페이스'를 사용한다.

 


2.3 시스템 호출(System Calls)

- System Call은 OS에 의해 사용 가능하게 된 서비스에 대한 인터페이스를 제공한다
- 간단한 프로그램(파일 복사, 이동)의 경우도 많은 System Call을 수행하게 된다.

- 대부분, 프로그래머들은 API(Application Programming Interface)를 통해 System Call을 호출한다.
- API 사용자는 System Call이 어떻게 구현되고, 실행 중 무슨 작업을 하는지 알지 못해도 되며, 단지 API를 준수하고, 시스템 호출의 결과로서 운영체제가 무엇을 할 것인지 만을 파악하면 된다.

 

- 운영체제에 매개변수를 전달하는 방법은 크게 3가지가 있다.
1. 매개변수를 레지스터 내에 전달하는 방법
2. 매개변수를 메모리 내의 블록이나 테이블에 저장하고, 블록의 주소가 레지스터 내에 저장되는 방법
3. 매개변수를 블록이나 스택에 저장하는 방법 (매개변수의 길이를 제한하지 않는 장점이 있음.)

 


2.4 시스템 호출의 유형 (Types of System Calls)

- 시스템 호출은 5가지 중요한 범주로 묶을 수 있다.
1. Process Control (프로세스 제어)
2. File Manipulation (파일 조작)
3. Device Manipulation (장치 조작)
4. Information Maintance (정보 유지 보수)
5. Communication (통신)과 Protection (보호)

* 프로세스 제어(Process Control)

(1) 끝내기(end), 중지(abort)
- 실행 중인 프로그램은 수행을 정상적으로(end()), 혹은 비정상적으로(abort()) 종료할 수 있어야 한다.

(2) 적재(load), 수행(execute)
- 한 프로그램을 실행하고 있는 process나 job이 다른 프로그램을 load 하고, execute 하기를 원할 수 있다.
- load된 프로그램이 종료 되었을때, 어디로 Control을 Return해야 하는가에 대한 질문이 생길 수 있다.
- 만약 Control이 기존 프로그램으로 돌아간다면, 기존 프로그램의 Memory image를 save 해놔야 한다.
- 만약 두 프로그램이 병행하게 수행된다면, Multi-programming 될 새로운 job이나 process를 생성한 것이다.

(3) 프로세스 생성, 프로세스 종료
- new job, process 혹은 set을 생성한다면, 이들의 execution을 control 할 수 있어야 한다.

(4) 프로세스 속성 획득, 속성 결정
- job의 priority, maximum allowable execution time 등을 포함하여 속성을 결정할 수 있어야 한다.

(5) 시간 기다리기(wait for time)
- new job이나 process를 생성한 후에는, 이들의 실행을 끝나기를 기다릴 필요성이 있을 수 있다.

(6) wait event, signal event
- 특정 사건이 일어날 때까지 기다릴 수 있을 수 있어야 한다.(wait event)
- 그 사건이 일어나면 신호를 보낼 수 있을 수 있어야 한다. (Signal event)

(7) Allocate and free memory
- 둘 이상의 프로세스들이 공유하는 데이터들에 대해 일관성을 보장해야 할 필요성이 있을 수 있다.
- 이에 운영체제는 종종 프로세스가 공유 데이터를 lock 할 수 있는 System Call을 제공한다.

 

* 파일 조작(File Manipulation)

(1) 파일 생성(Create File), 파일 삭제(Delete File)
- 이 System Call은 보통, 파일 이름이나 파일 속성의 일부를 요구한다.

(2) 열기 (Open), 닫기(Close)
- 생성된 파일들을 사용하기 위해서는 열기(Open) System call을 사용한다.
- 파일을 더 이상 사용하지 않을 때는, 파일 닫기(Close) System Call을 사용한다.

(3) 읽기, 쓰기, 위치 변경(Reposition)
- 파일을 열은 뒤에, 읽기(Read()), 쓰기(Write())를 할 수 있다.
- 위치 변경(Reposition(), (ex) 파일의 끝으로 건너뛰기)를 할 수 있다.

(4) 파일 속성 획득 및 결정 (get file attributes, set file attributes)
- 파일 속성에 대한 정보를 얻을 수 있고, 변경할 수 있다.

 

* 장치 조작(Device Manipulation)

- 프로세스는 작업을 계속 수행하기 위해 Main Memory, Disk Drive 등의 추가 자원을 필요로 할 수 있다.

(1) 장치를 요구(Request Devices), 장치를 방출(Release Devices)
- 다수의 사용자가 동시에 사용하는 시스템은 독점적인 device 사용을 보장받기 위해 Request 해야 한다.
- device의 사용이 끝나면, 반드시 Release 해야 한다.

(2) 읽기, 쓰기, 위치 변경(Reposition)
- 일단 device를 request 하여 Allocated 되면, 해당 device를 Read, Write, Reposition 할 수 있다.
- I/O 장치와 파일들 간에는 유사성이 많기 때문에, UNIX를 포함한 많은 운영체제가 이들 둘을 통합한 파일-장치 구조(file device structure)로 결합하였다.

(3) 장치 속성 획득, 장치 속성 결정 (get device attributes, set device attributes)

(4) 장치의 논리적 부착 또는 분리 (Logically attach or detach devices)

 

* 정보의 유지(Information Maintenance)

(1) 시간과 날짜의 설정과 획득 (get time or date, set time or date)
- 대부분의 시스템은 현재 시간(time()), 날짜(date())를 되돌려 주는 System Call을 가지고 있다.

(2) 시스템 데이터의 설정과 획득 (get System data, set System data)
- 현재 사용자 수, OS의 Version number, Free Memory와 같은 시스템에 관한 정보를 알려주기도 한다.

(3) 프로세스, 파일, 장치 속성의 획득 (get process, file, or device attributes)
- 운영체제는 현재 실행되고 있는 프로세스들에 관한 정보를 가지고 있다.

(4) 프로세스, 파일, 장치 속성의 설정 (set process, file, or device attributes)
- 운영체제는 현재 실행되고 있는 프로세스들에 관한 정보에 접근하여 재설정할 수 있다.

 

* 통신(Communication)

- Communication에는 Message Passing과 Shared Memory model이 있다.

1. Message Passing Model
- 통신하는 두 process가 정보를 교환하기 위해 서로 메시지를 주고받는다.
- Message는 두 프로세스 사이에서 직접 교환되거나, mailbox를 통해 간접적으로 교환될 수 있다.

2. Shared Memory Model
- process는 다른 process가 소유한 Memory 영역에 대한 접근을 하기 위해 System call을 사용한다.
- 정상적으로, OS는 한 process가 다른 process의 memory를 접근하는 것을 막으려고 한다.
- 이에, Shared Memory Model에서는 이런 제한을 제거해야 할 필요성이 있다.

- 대부분의 System은 두 가지(Message Passing, Shared Memory) 모두를 구현한다.
- Message Passing은 Conflict가 없기 때문에, 소량의 데이터를 교환하는데 좋다.
- Shared Memory는 최대 속도와 편리한 통신을 할 수 있지만, 동기화 부분에서 문제점이 있다.

(1) 통신 연결의 생성, 제거 (create, delete communication connection)

(2) 메시지의 송신, 수신 (Send, Receive Messages)

(3) 상태 정보 전달 (Transfer status information)

(4) 원격 장치의 부착(Attach) 및 분리(Detach)

 

* 보호(Protection)

- 과거에, Protection은 다수의 사용자를 가지는 다중 프로그램 시스템에서만 고려되는 문제였다.
- Networking과 Internet의 출현으로, 서버에서 휴대용 컴퓨터까지 모든 컴퓨터 시스템에서 고려해야 한다.

 


2.5 시스템 프로그램(System Programs)

- 시스템 프로그램은 시스템 유틸리티(System Utility)로 알려져 있으며, 프로그램 개발과 실행을 위해
보다 편리한 환경을 제공한다.

- 시스템 프로그램(System Program)은
파일 관리, 상태 정보, 파일 변경, 프로그래밍 언어 지원, 프로그램 적재와 수행, 통신, 백그라운드 서비스
의 범주로 분류할 수 있다.

- 대부분의 운영체제는 시스템 프로그램과 함께 일반적인 문제점을 해결하거나, 일반적인 연산을 수행하는 데 유용한 프로그램들도
제공한다.
- 이러한 Application Program에는 Web Browser, Word Processor, Database System 등이 포함된다.

 


2.6 운영체제 설계 및 구현

* 설계 목표 (Design Goals)

- 요구 조건은 근본적으로 사용자 목적과 시스템 목적의 두 가지 기본 그룹으로 나눌 수 있다.
- 사용자 입장에서, 시스템은 사용하기에 convenient to use, easy to learn, Reliable, safe, fast 해야 한다.
- 시스템적 입장에서, 운영체제는 설계, 구현, 유지 보수가 쉬워야 하며, 적응성, 신뢰성, 효율성 등을 가져야 한다.

 

* 기법과 정책 (Mechanisms and Policies)

- 기법(Mechanism)은 how to do something(어떻게 할 것인가)을 결정하는 것이다.
- 정책(Policy)는 what will be done(무엇을 할 것인가)를 결정하는 것이다.

 

* 구현 (Implementation)

- 초창기 운영체제는 어셈블리어로 작성되었으며, 현재 대부분의 운영체제는 고급 언어로 작성된다.
- 운영체제를 고급 언어로 구현하는 것에 대한 단점은 속도가 느리고, 저장 장치가 많이 소요되는 것이다.
- 하지만, 고급언어를 통한 sophisticated optimization을 수행하고, 좋은 자료구조와 알고리즘을 사용함으로써 위의 문제를 해결하고, 성능 향상을 이룰 수 있다.

 


2.7 운영체제 구조 (Operating-System Structures)

* 간단한 구조(Simple Structure)

- 간단한 구조를 가지고 있는 운영체제로, MS-DOS가 있다.
- MS-DOS는 interface와 functionality 계층이 잘 분리되어 있지 않다.
- 예를 들어, Application Program은 basic I/O routine을 통해 display와 disk drive에 직접 쓰기가 가능하다.
- 따라서, User Program이 고장 나게 되면 시스템 전체가 고장 나게 된다.

MS-DOS 층 구조

- 제한적인 구조의 또 다른 예로, 최초의 UNIX 운영체제가 있다.
- UNIX는 두 가지 부분(커널과 시스템 프로그램)으로 구성되어 있다.

- System Call Interface와 Kernel Interface 사이의 모든 것이 Kernel이다.
- Kernel은 System Call을 통해 파일 시스템, CPU 스케줄링, 메모리 관리 등의 다양한 기능을 제공한다.
- 이 Monolithic 한 구조는 구현하기 어렵고, 유지 보수하기 어렵다는 단점이 있다.
- 하지만, 성능 측면에서 System Call Interface에서 통신하는 경우 Overhead가 거의 없다는 장점이 있다.

Traditional UNIX System structure.

 

* 계층적 접근(Layered Approach)

- 적절한 hardware support가 있을 경우, 운영체제는 보다 적절하게 분할될 수 있다.
- 계층적 접근 방식에서는, 운영체제가 여러 층으로 나누어진다.
- 최하위 층(Layer 0)는 Hardware이고, 최상위 층(Layer N)은 User Interface이다.|
- 계층적 구조에서, 특정 층 M은 자료구조와 상위 층에서 호출할 수 있는 루틴의 집합으로 구성된다.
- 층 M은 다시 자신의 하위 층에 대한 연산을 호출할 수 있다.

Layered Operating System

 

- 계층적 접근 방식의 장점은 구현과 디버깅이 간단하다는 점이다.
- 각 층들은 자신의 하위층들의 서비스와 연산들만을 사용하도록 되어 있으며, 이 점이 디버깅을 단순화한다.
- 하위 층부터 구현을 시도하고, 완벽히 디버깅이 끝난 뒤에 상위 층의 구현을 시도하게 된다.
- 이에, 디버깅 시에 오류가 나게 되면, 그 하위 층들은 모두 디버깅이 완료되었기 때문에 해당 층에 오류가
  있다는 것을 알 수 있다.

- 계층적 접근 방식의 어려운 점은 여러 층을 적절히 정의하기가 어렵다는 것이다.
- 각 층은 자신의 하위 계층들만 사용할 수 있기 때문에, 설계 시에 신중하게 고려해야 한다.

- 계층적 구현 방법의 또 다른 문제점은 다른 유형의 구현 방법보다 효율성이 낮다는 점이다.
- 각 층에서, 매개 변수들이 변경되거나, 데이터가 전달될 필요가 있는 상황이 발생할 수 있다.
- 이에 System Call에 Overhead를 추가하며, 다른 구조들보다 System Call 수행 시간이 오래 걸릴 수 있다.

 

* 마이크로 커널(Microkernels)

- 1980년대 중반에, Carnegie-Mellon 대학교의 연구자들이 MicroKernel 접근 방식을 사용하여 Kernel을 모듈화한 Mach를 개발하였다.
- 이 방법은 중요치 않은 구성 요소들을 커널로부터 제거하고, 그것들을 System 및 User level Program으로 구현하여 운영체제를 구성하는 방법이다.

Architecture of a typical microkernel

- 마이크로 커널의 주 기능은 Client Program과 User Space에서 수행되는 다양한 서비스 간에
Communication을 제공하는 것이다. (통신은 Message Passing을 통해 제공된다.)

- 마이크로 커널의 장점은 운영체제의 확장이 용이하다는 점이다.

- 모든 새로운 서비스는 사용자 공간에 추가되므로, Kernel의 변경을 필요로 하지 않는다.
- 불가피하게 커널이 변경되어야 할 때에도, 비교적 커널의 크기가 작아 변경할 대상이 작은 경우가 많다.

- 마이크로 커널의 단점은 system-function overhead가 증가하여, 성능이 나빠진다는 점이다.

 
 

* 모듈(Modules)

- 이 방법에서 커널은 핵심적인 구성요소의 집합을 가지고 있고, 부팅 시에 또는 실행 중에 부가적인 서비스들을 모듈을 통하여 link 한다.
- 설계 시 중요한 점은, 핵심 서비스를 제공하고 다른 서비스들은 커널이 실행되는 동안 동적으로 구현하는 것이다.

- 전체적인 결과는 각 부분이 정의되고 Protected Interface를 가진다는 점에서 계층적 구조와 비슷하다.
하지만, Module에서 임의의 다른 Module을 호출할 수 있다는 점에서 계층적 구조보다 유연하다.

- 중심 모듈은 단지 핵심 기능만을 가지고 있고, 다른 모듈의 적재 방법과 모든 모듈들과 어떻게 통신하는지 안다는 점에서 MicroKernel과 유사하다. 하지만, 통신하기 위하여 메시지 전달을 호출할 필요가 없기 때문에 더 효율적이다.

 

* 혼용 시스템(Hybrid Systems)

- 하나의 구조만을 채택한 운영체제는 거의 존재하지 않으며, 보통 여러 구조를 결합한 혼용 구조로 구성된다.
- Linux와 Solaris는 Monolithic 구조면서, 새로운 기능을 동적으로 추가할 수 있는 Module을 사용한다.
- Windows는 Monolithic 구조면서, 동적으로 적재 가능한 커널 모듈도 지원한다.

 


2.8 운영체제 디버깅(Operating-System Debugging)

- 디버깅(Debugging)란 Hardware와 Software에서의 시스템 오류를 발견하고, 수정하는 행위이다.

* 장애 분석(Failure Analysis)

- 프로세스가 실패했을 때, 운영체제는 프로세스가 사용하던 메모리를 캡처한 뒤 'core dump'를 취하고 이후의 분석을 위해 파일로 저장한다.
- 커널 장애는 Crash라고 불린다. 해당 오류 정보는 로그 파일에 저장되고, 메모리의 상태가 'Crash dump'에 저장된다.

* 성능 조정(Performance Tuning)
- 병목(Bottlenecks) 지점을 제거함으로써 성능을 향상시키려고 하는 것도 디버깅에 포함된다.
- 이에 병목 지점을 발견하기 위하여 시스템 성능을 감시할 수 있어야 하며, 시스템 동작을 측정하고 표시할 수 있는 방법을 가지고 있어야 한다. ((ex) Windows 작업 관리자.)

 

 


2.9 운영체제 생성(Operating-System Generation)

- 운영체제는 다양한 주변 구성을 가진, 여러 부류의 기계에서 수행되도록 설계되는 것이 일반적이다.
- 이 경우, 시스템은 각 specific computer site를 위해 구성되거나 또는 생성되어야 한다.
- 이 절차를 시스템 생성(SYSGEN)이라고 한다.

 


2.10 시스템 부트(System Boot)

- 운영체제가 생성된 이후에는, 하드웨어에 의해 사용 가능해야 한다.
- 대부분의 컴퓨터 시스템에서는 Bootstrap Program이 커널을 찾은 뒤, Main Memory에 load 하고, 수행을 시작한다.
- PC와 같은 일부 컴퓨터 시스템은 단순한 Bootstrap Program이 좀 더 복잡한 Bootstrap Program을 디스크로부터 적재하고, 이 Bootstrap Program이 다시 커널을 load 하는 2단계 절차를 사용한다.

- 컴퓨터가 전원을 켜거나, 재부팅 등의 사건을 받으면 명령 레지스터는 미리 지정된 메모리 위치를 가리키고, 그곳에서부터 실행을 시작한다. (해당 위치에는 최초의 Bootstrap Program이 존재한다.)
- RAM은 시스템 시작 시에 알 수 없는 상태가 되기 때문에, Bootstrap Program은 ROM 안에 저장된다.

- bootstrap program은 먼저, 기계의 상태를 진단하여 이상이 없는지 확인한다.
- 이후, CPU Register, device Controller, Main Memory 등 시스템 전반에 걸쳐 초기화한다.
- 위의 작업이 끝나면, bootstrap program은 운영체제를 시작한다.

- 휴대전화, 태블릿 등의 시스템들은 운영체제의 크기가 작은 경우가 많아서 운영체제 전체를 ROM에 저장한다.
- 이 방식은 bootstrap code가 변경되면, ROM을 변경해야 한다는 점이다.
- 이 문제를 해결하기 위해 쓰기가 가능한 EPROM을 사용할 수 있다.


-Reference-
Abraham Silberschatz, Peter B. Galvin, Greg Gagne의 『Operating System Concept 9th』