이 포스팅은 공룡책으로 알려진 Operating System Concepts의 1장을 공부하면서 정리한 포스팅이다.


1.1 운영체제란 무엇인가?


1.1 운영체제가 할 일 (What Operating Systems Do)

컴퓨터 시스템은 다음 그림처럼 대게 네 가지 구성요소인 하드웨어, 운영체제, 응용 프로그램, 사용자로 구분할 수 있다.

운영체제는 다양한 사용자를 위해 다양한 응용 프로그램 간의 하드웨어 사용을 제어하고 조종한다.

운영체제는 항상 실행 중인 커널(Kernel)과 응용 프로그램 개발을 쉽게 하고 기능을 제공하는 미들웨어 프레임워크 및 시스템 실행 중에 시스템 관리하는데 도움이 되는 시스템 프로그램(System Program)이 포함된다.

일반적으로 항상 실행되는 프로그램을 커널(Kernel)이라고 한다,


1.2 컴퓨터 시스템의 구성 (Computer System Organization)

현대의 범용 컴퓨터 시스템은 하나 이상의 CPU와 구성요소와 공유 메모리 사이의 액세스를 제공하는 공통 버스(bus)를 통해 연결된 여러 장치 컨트롤러로 구성된다.

일반적으로 운영체제에는 각 장치 컨트롤러마다 장치 드라이버가 있다. 이 장치 드라이버는 장치 컨트롤러의 작동을 잘 알고 있고 나머지 운영체제에 장치에 대한 일관된 인터페이스(명세)를 제공한다. CPU와 장치 컨트롤러는 병렬로 실행되어 메모리 사이클을 놓고 경쟁한다.

장치 드라이버/제어기 또는 디바이스 드라이버는 특정 하드웨어나 장치를 제어하기 위한 커널의 일부분으로 동작하는 프로그램이다.

컴퓨터를 구성하는 다양한 입출력 장치마다 각각 장치드라이버가 프로그램 되어 커널에 통합되어 실행된다.

장치 드라이버는 높은 수준의 컴퓨터 프로그램들이 컴퓨터 하드웨어 장치와 상호 작용하기 위해 만들어진 하나의 컴퓨터 프로그램이다.

1.2.1 인터럽트 (Interrupts)

하드웨어는 어느 순간이든 시스템 버스를 통해 CPU에 신호를 보내 인터럽트를 발생시킬 수 있다.

CPU가 인터럽트 되면 CPU는 하던 일을 중단하고 즉시 고정된 위치로 실행을 옮긴다. 이러한 고정된 위치는 일반적으로 인터럽트를 위한 서비스 루틴이 위치한 시작 주소를 가지고 있다. 그리고 인터럽트 서비스 루틴이 실행된다. 인터럽트 서비스 루틴이 실행이 완료되면, CPU는 인터럽트 되었던 연산을 재개한다. 다음의 그림은 인터럽트 연산의 시간 일정이다.

일반적으로 인터럽트 서비스 루틴의 주소가 들어 있는 포인터 테이블은 하위 메모리(첫 100개 정도의 위치)에 저장된다.

장치 컨트롤러가 인터럽트 요청 라인에 신호를 선언하여 인터럽트를 발생(raise)시키고 CPU는 인터럽트를 포착(catch)하여 인터럽트 핸들러로 디스패치(dispatch)하고 핸들러는 장치를 서비스하여 인터럽트를 지운다(clear). 이 기본 인터럽트 기법은 비동기 이벤트에 CPU가 대응할 수 있게 한다.

인터럽트는 마스크 불가능 인터럽트(nonmaskable interrupt)마스킹 가능(maskable interrupt) 인터럽트로 나뉜다.

1.2.2 저장장치 구조 (Storage Structure)

CPU는 메모리에서만 명령을 적재할 수 있으므로 실행하려면 프로그램을 먼저 메모리에 적재해야 한다.

범용 컴퓨터는 프로그램 대부분을 메인 메모리(Random-Access Memory : RAM)라 불리는 재기록 가능한 메모리에서 가져온다.

모든 형태의 메모리는 바이트의 배열을 제공한다. 각 바이트는 자신의 주소를 가지고 있다. 상호 작용은 특정 메모리 주소들에 대한 일련의 적재(load), 또는 저장(store)명령을 통하여 이루어진다.

대부분의 컴퓨터 시스템은 메인 메모리의 확장으로 보조저장장치를 제공한다. 보조저장장치의 주요 요건은 대량의 데이터를 영구히 보존할 수 있어야 한다는 점이다. 가장 일반적인 보조저장장치는 하드 디스크 드라이브(HDD)와 비휘발성 메모리(NVM)로, 프로그램과 데이터 모두를 위한 저장소를 제공한다.

대부분의 프로그램은 메모리에 적재될 때까지 보조저장 장치를 사용한다. 보조저장장치는 메인 메모리보다 훨씬느리기 때문에, 보조저장장치의 올바른 관리는 컴퓨터 시스템에서 매우 중요하다.

다른 장치에 저장된 자료의 백업 사본을 저장하기 위해 특수 목적으로만 사용하기에 매우 느리고 충분히 큰 장치를 3차 저장장치라고 한다.

다양한 저장장치 시스템은 저장 용량 및 액세스 시간에 따라 다음 그림과 같이 계층 구조로 구성될 수 있다.

캐시는 두 구성요소 간에 액세스 시간이나 전송 속도의 차이가 큰 경우 성능을 향상하기 위해 설치할 수 있다.

1.2.3 입출력 구조 (I/O Structure)

운영체제 코드의 상당 부분은 시스템의 안정성과 성능에 대한 중요성과 장치의 다양한 특성으로 인해 I/O 관리에 할애된다.

인터럽트 구동 I/O의 형태는 소량의 데이터를 이동하는 데는 좋지만 NVS(비휘발성 저장장치) I/O와 같은 대량 데이터 이동에 사용될 때 높은 오버헤드를 유발할 수 있다. 이 문제를 해결하기 위해서 Direct Memory Access(DMA)가 사용된다.

장치에 대한 버퍼 및 포인터, 입출력 카운트를 세팅한 후 장치 제어기는 CPU의 개입 없이 메모리로부터 자신의 버퍼 장치로 또는 버퍼로부터 메모리로 데이터 블록 전체를 전송한다. 이 경우 블록 전송이 완료될 때마다 인터럽트가 발생한다.

아래의 그림은 DMA를 사용하는 현대 컴퓨터의 작동방식에 대해서 설명한다.

몇몇 고가의 시스템은 버스 대신에 스위치 구조를 사용한다. 이러한 시스템에서는 공유 버스를 사용하기 위한 사이클을 경쟁하지 않고 다수의 구성요소가 다른 구성요소들과 동시에 통신하는 것이 가능하다. 이 경우 DMA의 사용은 더욱 효과적이다.


1.3 컴퓨터 시스템 구조 (Computer SYstem Architecture)

컴퓨터 시스템은 사용된 범용 처리기의 수에 따라 분류 가능한 다양한 방식으로 구성될 수 있다.

1.3.1 단일 처리기 시스템 (Single Processor System)

Single Processor System이란 하나의 Processor를 포함하는 컴퓨터 시스템을 말한다.

Single Processor System은 일반적으로 단일 처리 코어를 가진 범용 CPU가 하나만 있는 단일 프로세서 시스템의 경우가 대부분이다.

코어는 명령을 실행하고 로컬로 데이터를 저장하기 위한 레지스터를 포함하는 구성요소이다.

1.3.2 다중 처리기 시스템 (Multi Processor Systems)

Multi Processor System 이란 두 개 이상의 Processor를 포함하는 컴퓨터 시스템을 말한다.

다음 그림은 단일 코어 CPU가 있는 두 개의 프로세서로 구성된 시스템을 보여준다.

프로세서는 컴퓨터 버스 및 때때로 클록, 메모리 및 주변 장치를 공유한다.

Multi Processor system의 주요 장점은 처리량(Throughput)증가 이다. 즉, 프로세서 수를 늘리면 더 적은 시간에 더 많은 작업을 수행할 수 있다.

가장 일반적인 다중 처리기 시스템은 각 피어 CPU 프로세스가 운영체제 기능 및 사용자 프로세스를 포함한 모든 작업을 수행하는 SMP(symmetric multiprocessing)를 사용한다. 이 모델의 장점은 성능을 크게 저하하지 않으면서 N개의 프로세스를 실행할 수 있다. 그러나 CPU가 독립적이기 때문에 하나는 유휴 상태이고 다른 하나는 과부하가 걸려서 비효율적일 수 있다. => 스케줄링을 잘 해야 한다.

MultiProcessor의 정의는 시간이 지남에 따라 발전해 왔으며 이제는 여러개의 컴퓨팅 코어가 단일 칩에 상주하는 다중 코어시스템을 포함한다. Processor 내의 통신이 Processor 간의 통신보다 빠름으로 다중 코어 시스템은 단일 코어를 가지는 여러 Processor보다 효율적일 수 있다.

[중요] 컴퓨터 시스템 구성요소 정의

  • CPU - 명령을 실행하는 하드웨어
  • Processor - 하나 이상의 CPU를 포함하는 물리적 칩
  • Core - CPU의 기본 계산 단위
  • MultiCore - 동일한 CPU가 여러 컴퓨팅 코어를 포함하는 구조
  • MultiProcessor - 여러 프로세서를 포함하는 시스템

Multi Processor에 작고 빠른 로컬 버스를 통해 액세스 되는 자체 로컬 메모리를 제공하고 모든 CPU가 공유 시스템 연결로 연결되어 모든 CPU가 하나의 물리 주소 공간을 공유하는 NUMA(non-uniform memory access)라고 하는 이 방법은 CPU가 로컬 메모리에 액세스 할 때 빠를 뿐만 아니라 시스템 상호 연결에 대한 경합도 없다는 장점이 있다.

NUMA Multi Processor Architecture은 다음과 같다.

하지만 NUMA 시스템의 잠재적 단점은 CPU가 시스템 상호 연결을 통해 원격 메모리에 액세스해야 할 때 지연 시간이 증가하여 성능 저하가 발생할 수 있다는 점이다.

마지막으로 블레이드 서버다수의 Processor Board, I/O Board, Networking Board들이 하나의 chassis(샤시)안에 장착되는 형태를 가진다. 블레이드 서버와 전통적인 다중 처리기 시스템과의 차이점은 각 블레이드-처리기 보드는 독립적으로 부팅될 수 있고 자기 자신의 운영체제를 수행한다는 것이다.

1.3.1 클러스터형 시스템 (Clustered Systems)

클러스터 시스템은 둘 이상의 독자적 시스템 또는 노드들을 연결하여 구성한다는 점에서 Multiprocessor 시스템과 차이가 있다. 각 노드는 통상 다중 코어 시스템이고, 그러한 시스템은 약결합(loosely coupled)이라고 간주된다.

클러스터링은 통상 높은 가용성(availability)을 제공하기 위해 사용된다, 즉, 클러스터 내 하나 이상의 컴퓨터 시스템이 고장 나더라도 서비스는 계속 제공된다.

일반적으로 높은 가용성은 시스템에 중복 기능을 추가함으로써 얻어지고, 클러스터 소프트웨어 중 한 층이 클러스터 노드에서 실행된다. 각 노드는 하나 이상의 다른 노드(네트워크로 연결되어 있는)들을 감시한다. 만일 감시받던 노드가 고장 나면 감시하던 노드가 고장 난 노드의 저장장치에 대한 소유권을 넘겨받고, 그 노드에서 실행 중이던 응용프로그램을 다시 시작한다. 이로써 사용자와 응용 프로그램의 클라이언트는 잠깐의 서비스 중단만을 경험하게 된다.

클러스터링은 비대칭형 클러스터링대칭형 클러스터링이 존재한다.

  • 비대칭형 클러스터링 : 다른 컴퓨터들이 응용 프로그램을 실행하는 동안 한 컴퓨터는 긴급 대기(hot-standby) 모드 상태를 유지한다.
  • 대칭형 클러스터링 : 둘 이상의 호스트들이 응용 프로그램을 실행하고 서로를 감시한다.

한 클러스터가 네트워크로 연결된 다수의 컴퓨터 시스템으로 구성되므로 클러스터는 고성능 계산환경을 제공하도록 사용될 수 있다. 이러한 시스템은 클러스터 내의 모든 컴퓨터에서 Application을 병렬 수행할 수 있으므로 Singleprocessor나 SMP(symmetric multiprocessing) 시스템보다 훨씬 큰 계산 능력을 제공할 수 있다.

다른 형태의 클러스터로 병렬 클러스터WAN을 이용한 클러스터링이 있다.

아래의 그림은 스토리지 전용 네트워크(storage-area network, SAN)를 이용하는 클러스터 시스템의 일반적인 구조를 설명하는 그림이다.

HADOOP

Hadoop은 단순하고 저렴한 하드웨어 구성요소를 포함하는 클러스터형 시스템에서 빅데이터의 분산 처리에 사용되는 공개 소프트웨어 프레임워크이다.

Hadoop은 단일 시스템에서 수천 개의 컴퓨팅 노드를 포함하는 클러스터로 확장되도록 설계되었다.

작업은 클러스터의 노드에 할당되며 Hadoop은 노드 간 통신을 정렬하여 처리할 병렬 계산을 관리하고 결과를 통합한다. Hadoop은 또한 노드의 장애를 감지하고 관리하여 효율적이고 매우 안정적인 분산 컴퓨팅 서비스를 제공한다.

Hadoop은 다음 세 가지 구성요소로 구성된다.

  1. 분산 컴퓨팅 노드에서 데이터와 파일을 관리하는 분산 파일 시스템.
  2. YARN(“Yet Another Resource Negotiator”) 프레임워크는 클러스터 내의 자원을 관리하고 클러스터의 노드에 작업을 스케줄 한다.
  3. MapReducd 시스템은 클러스터의 노드에서 데이터를 병렬 처리할 수 있게 한다.

1.4 운영체제의 작동 (Operating-System Operations)

컴퓨터의 전원을 켜거나 재부팅 할 때와 같이 컴퓨터를 실행하려면 초기 프로그램을 실행해야 한다. 이 초기 프로그램(부트스트랩 프로그램)은 단순한 형태를 띠는 경향이 있고, 일반적으로 컴퓨터 하드웨어 내에 펌웨어로 저장된다.

부트스트랩 프로그램은 운영체제를 적재하는 방법과 해당 시스템 실행을 시작하는 방법을 알아야 하고, 이 목표를 달성하려면 부트스트랩 프로그램이 운영체제 커널을 찾아 메모리에 적재해야 한다.

커널이 적재되어 실행되면 시스템과 사용자에게 서비스를 제공할 수 있다.

일부 서비스는 커널이 실행되는 전체 시간 동안 실행되는 시스템 데몬이 되기 위해 부팅할 때 메모리에 적재되는 시스템 프로그램에 의해 커널 외부에서 제공된다.

시스템이 완전히 부팅되면 어떤 이벤트가 발생할 때까지 기다린다. 이벤트는 거의 인터럽트를 발생시켜 신호를 보내고, 이 인터럽트의 종류로는 하드웨어 인터럽트, 트랩, 오류, 소프트웨어 인터럽트등으로 구분될 수 있다.

1.4.1 다중 프로그래밍과 다중 태스킹 (multiprogramming and multitasking)

다중 프로그래밍(multiprogramming)은 CPU가 항상 한 이상의 프로그램을 실행할 수 있도록하여 CPU 이용률을 높이고 사용자의 만족도를 높이는 프로그래밍.

다중 프로그래밍 시스템에서 실행 중인 프로그램을 프로세스(process)라고 한다.

운영체제는 다음 그림과 같이 여러 프로세스를 동시에 메모리에 유지한다.

운영체제는 이러한 프로세스 중 하나를 선택하여 실행하기 때문에 특정 프로세스가 다른 프로세스의 작업이 완료되기를 기다려야 할 수도 있다.

다중 태스킹(multitasking)은 다중 프로그래밍의 논리적 확장이다. multitasking 시스템에서 CPU는 여러 프로세스를 전환하며 프로세스를 실행하지만 전환이 자주 발생하여 사용자에게 빠른 응답 시간을 제공하게 된다.

여러 프로세스를 병행하게 실행하려면 프로세스 스케줄링, 디스크 저장장치 및 메모리 관리를 포함하여 운영체제의 모든 단계에서 서로 영향을 미치는 기능이 제한되어야 한다.

1.4.2 이중-모드와 다중모드 운용 (Dualmode and Multimode Operation)

운영체제는 적어도 두 개의 독립된 연산 모드, 즉 사용자 모드커널 모드를 필요로 한다. 이 모드 비트(mode bit)는 하나의 비트가 현재의 모드를 나타내기 위해 컴퓨터의 하드웨어에 추가되었다.

모드 비트의 사용으로 운영체제를 위하여 실행되는 작업과 사용자를 위해 실행되는 작업을 구분할 수 있게 되었다.

즉, 사용자 Application이 운영체제로부터 서비스를 요청하면(시스템 콜) 이 요청을 수행하기 위해서는 사용자 모드에서 커널 모드로 전환해야 한다. 이 그림은 다음과 같다.

위와 같은 이중 모드는 잘못된 사용자로부터 운영체제를, 그리고 잘못된 사용자 서로를 보호하는 방법을 제공한다.

이중 모드 이외의 모드는 Intel Processor에 4개의 모드가 존재하고, ARMv8 시스템에는 7가지의 모드가 있다.

가상화를 지원하는 CPU는 종종 VMM(virtual Machine Manager)이 시스템을 제어하는 시점을 표시하기 위한 별도의 모드를 가진다. 이 모드에서 VMM은 사용자 프로세스보다 많은 권한을 가지지만 커널보다는 적은 권한을 가진다.

Microsoft Windows, Unix, Linux와 같은 대부분의 최신 운영체제는 이중 모드 기능을 활용하고 운영체제를 보다 강력하게 보호한다.

1.4.3 타이머 (Timer)

우리는 사용자 프로그램이 무한루프(infinite loop)에 빠지거나 시스템 서비스 호출에 실패하여, 제어가 운영체제로 복귀하지 않는 경우가 없도록 반드시 방지해야 한다. 해당 목적을 달성하기 위해 우리는 타이머(Timer)를 사용할 수 있다. 타이머는 지정된 시간 후 컴퓨터를 인터럽트 하도록 설정할 수 있다.

이 시간은 고정 혹은 가변 일 수 있으며, 가변 타이머는 일반적으로 고정률의 클록(fixed-rate clock)과 계수기로 구현된다.

사용자에게 제어를 양도하기 전에, 운영체제는 타이머가 인터럽트를 할 수 잇도록 설정되었는지를 확인하고. 타이머의 값을 변경하는 명령은 명백히 특권 명령이다.


1.5 자원 관리 (Resource Management)

운영체제는 자원 관리자이다. 시스템의 CPU, 메모리 공간, 파일-저장 공간, I/O 장치는 운영체제가 관리해야 하는 자원에 속한다.

1.5.1 프로세스 관리 (Process Management)

프로세스는 자기 일을 수행하기 위해 CPU 시간, 메모리, 파일, 그리고 입출력 장치를 포함한 여러 가지 자원을 필요로 한다.

프로그램 그 자체는 프로세스가 아니며 즉, 하나의 프로그램은 디스크에 저장된 파일의 내용과 같이 수동적(passive) 개체지만 프로세스는 다음 수행할 명령을 지정하는 프로그램 카운터(program counter)를 가진 능동적(active)인 개체이다.

시스템은 프로세스의 집합으로 구성되는데, 프로세스 중 일부는 운영체제 프로세스들(시스템 코드를 수행하는 프로세스들)이며, 나머지는 사용자 프로세스들(사용자 코드를 수행하는 프로세스들)이다.

운영체제는 프로세스 관리와 연관해 다음과 같은 활동에 대해 책임을 진다.

  • 사용자 프로세스와 시스템 프로세스의 생성과 제거
  • CPU에 프로세스와 스레드 스케줄하기
  • 프로세스의 일시 중지와 재수행
  • 프로세스 동기화를 위한 기법 제공
  • 프로세스 통신을 위한 기법 제공

1.5.2 메모리 관리 (Memory Management)

메인 메모리는 CPU와 입출력 장치에 의하여 공유되는, 빠른 접근이 가능한 데이터 저장소이다.

프로그램이 수행되기 위해서는 반드시 절대 주소로 매핑(mapping)되고 메모리에 적재되어야 한다. CPU 이용률과 사용자에 대한 컴퓨터의 응답 속도를 개선하기 위해, 우리는 메모리에 여러 개의 프로그램을 유지해야 하며 이를 위해서 메모리 관리 기법이 필요하다.

운영체제는 메모리 관리와 관련하여 다음과 같은 일을 담당해야 한다.

  • 메모리의 어느 부분이 현재 사용되고 있으며 어느 프로세스에 의해 사용되고 있는지를 추적해야 한다.
  • 필요에 따라 메모리 공간을 할당하고 회수해야 한다.
  • 어떤 프로세스(또는 그 일부)들을 메모리에 적재하고 제거할 것인가를 결정해야 한다.

1.5.3 파일 시스템 관리 (File-System Management)

운영체제는 저장장치의 물리적 특성을 추상화하여 논리적인 저장 단위인 파일을 정의한다. 운영체제는 파일을 물리적 매체로 매핑하며, 저장장치를 통해 이들 파일에 접근한다.

파일은 파일 생성자에 의해 정의된 관련 정보의 집합체이다. 일반적으로 파일은 프로그램(소스와 목적 프로그램 형태)과 데이터를 나타낸다.

운영체제는 대량 저장 매체와 그것을 제어하는 장치를 관리함으로써 파일의 추상적인 개념을 구현한다. 또한, 파일은 사용하기 쉽도록 통상 디렉터리들로 구성된다.

운영체제는 파일 관리를 위하여 다음과 같은 일을 담당한다.

  • 파일의 생성 및 제거
  • 디렉터리 생성 및 제거
  • 파일과 디렉터리를 조작하기 위한 프리미티브의 제공
  • 파일을 보조저장장치로 매핑
  • 안정적인(비휘발성) 저장 매체에 파일을 백업

1.5.4 대용량 저장장치 관리 (Mass Storage Management)

컴퓨터 시스템은 메인 메모리를 백업하기 위해 보조저장장치(HDD, NVM, …)를 제공해야 한다.

운영체제는 보조저장장치 관리와 관련하여 다음 활동을 책임진다.

  • 마운팅과 언마운팅
  • 사용 가능 공간(free-space)의 관리
  • 저장장소 할당
  • 디스크 스케줄링
  • 저장장치 분할
  • 보호

마운팅(Mounting) : 해당 파일 시스템이 디렉토리(마운트 지점)에 연결되어 시스템에서 사용될 수 있게 만드는 작업

언마운팅(Unmounting) : 해당 파일 시스템의 마운트 지점 연결을 끊어 시스템에서 사용할 수 없게 하는 작업.

1.5.5 캐시 관리 (Cache Management)

캐시는 컴퓨터 과학에서 데이터나 값을 미리 복사해 놓는 임시장소를 가리킨다.

캐싱은 컴퓨터 시스템의 중요한 원리이다. 정보는 통산 어떤 저장장치에 보관된다. 정보가 사용됨에 따라, 더 빠른 장치인 캐시에 일시적으로 복사된다. 그러므로 우리가 특정 정보가 필요할 경우, 우리는 먼저 캐시에 그 정보가 있는지를 조사해 보아야 한다. 만약 캐시에 있으면 우리는 그 정보를 캐시로부터 직접 사용하지만, 만일 캐시에 없다면 메인 메모리 시스템으로부터 그 정보를 가져와서 사용해야 하며, 이 때 이 정보가 다음에 곧 다시 사용될 확률이 높다는 가정하에 캐시에 넣는다.

캐시 크기가 제한되어 있으므로 캐시 관리는 중요한 설계 문제이다. 캐시 크기와 교체 정책을 신중하게 선택하면 성능이 크게 향상될 수 있다.

한 캐시에 있는 A 값이 갱신될 경우 A가 존재하는 모든 캐시에 즉각적으로 반영되어야 하는 캐시 일관성 문제도 고려 대상이다.

1.5.6 입출력 시스템 관리 (I/O Systems Management)

운영체제 목적 중의 하나는 사용자에게 특정 하드웨어 장치의 특성을 숨기는 것이다. 단지 장치 드라이버만이 자신에게 지정된 특정 장치의 특성을 알고 있다.

입출력 시스템은 다음과 같이 구성되어 있다.

  • 버퍼링, 캐싱, 스풀링을 포함한 메모리 관리 구성요소
  • 일반적인 장치 드라이버 인터페이스
  • 특정 하드웨어 장치들을 위한 드라이버

1.6 보안과 보호 (Security and Protection)

보호(protection)란 컴퓨터 시스템이 정의한 자원에 대해 프로그램, 프로세스 또는 사용자들의 접근을 제어하는 기법이다. 이 기법은 시행될 제어에 대한 명세와 이들을 강제 시행하는 방법을 규정하는 수단을 반드시 제공해야 한다.

보안 기능은 외부 또는 내부의 공격을 방어하는 기능이다.

시스템의 모든 사용자를 구분하기 위해 사용자 식별자, 그룹 식별자, 유효 사용자 식별자가 존재한다.


1.7 가상화 (Virtualization)

가상화는 단일 컴퓨터(CPU, 메모리, 디스크 드라이브, 네트워크 인터페이스 카드 등)의 하드웨어를 여러 가지 실행 환경으로 추상화하여 개별 환경이 자신만의 컴퓨터에서 실행되고 있다는 환상을 만들 수 있는 기술이다.

가상화는 운영체제가 다른 운영체제 내에서 하나의 Application처럼 수행될 수 있게 한다.

넓게 말하면 가상화 소프트웨어는 에뮬레이션을 포함하는 클래스의 구성원이다.

소프트웨어로 컴퓨터 하드웨어 시뮬레이션하는 에뮬레이션은 일반적으로 소스 CPU 유형이 대상 CPU 유형과 다른 경우에 사용된다.

가상화에서는 특정 CPU를 위해 컴파일된 운영체제가 동일 CPU용의 다른 운영체제 내에서 수행된다.

아래 그림은 하나의 운영체제와 3개의 가상 머신을 실행시키는 컴퓨터를 나타내는 그림이다.

다수운영체제를 위해 소프트웨어를 작성하는 회사는 가상화를 이용하여 하나의 물리 서버를 이용하여 이들 모든 운영체제를 수행하여, 개발, 테스팅, 디버깅을 수행할 수 있다.


1.8 분산 시스템 (Distributed Systems)

분산 시스템은 물리적으로 떨어져 있는 이기종 컴퓨터들의 집합이다. 분산 시스템의 컴퓨터들은 사용자가 시스템 내의 다양한 자원들을 접근할 수 있도록 네트워크로 연결되어 있다.

네트워크는 가장 단순하게 보면 두 개 이상 시스템 간의 통신 경로이다. 분산 시스템의 많은 기능은 네트워킹에 의존하고 있다.

TCP/IP가 가장 일반적인 네트워크 프로토콜로 인터넷의 기본 구조를 제공하며, 대부분의 운영체제는 TCP/IP를 지원한다.

네트워크는 노드 간의 거리에 의해 유형이 결정된다. 유형은 근거리 통신망(LAN), 광역 통신망(WAN), 도시권 통신망(MAN), 단거리 통신망(PAN)으로 분류할 수 있다.


1.9 커널 자료구조 (Kernel Data Structures)

운영체제에서 광범위하게 사용되는 다수의 기본 자료구조에 대해서 간략히 설명하도록 하겠다.

1.9.1 리스트, 스택 및 큐 (Lists, Stacks, Queues)

배열의 각 항은 직접 접근할 수 있으나 리스트의 항들은 특정 순서로 접근해야 한다. 즉 리스트는 데이터 값들의 집단을 하나의 시퀀스로 표현한다.

이 구조를 구현하는 가장 일반적인 방법이 연결 리스트(Linked List)이다.

Linked List는 3개로 분류할 수 있으며 이는 Singly Linked List, Doubly Linked List, Circularly Linked List 다.

  • Singly Linkend List에서 각 Element는 후속 Element를 가르킨다. 그림은 다음과 같다.

  • Doubly Linked List에서 한 Element는 자신의 앞 항이나 뒷 항을 가리킨다. 그림은 다음과 같다.

  • Doubly Linked List에서 마지막 Element는 첫 Element를 가리킨다. 그림은 다음과 같다.

Linked List의 장점

  • 가변 수의 항들을 수용하며 항의 삭제와 삽입이 쉽다.

Linked List의 단점

  • 길이가 n인 리스트에서 특정 항을 Fetch할 때 성능이 선형, 즉 O(n)이라는 점이다.

스택(Stack)은 순차적 순서를 가진 자료구조로 항을 넣거나 꺼내는데 후입선출(last in first out, LIFO)를 사용한다. 스택에 항을 삽입하거나 인출하는 일은 각각 푸쉬(push) 또는 팝(pop)이라 부른다.

큐(Queue)는 순차 순서의 자료구조로 선입선출(first in first out, FIFO)을 사용한다. 각 항은 삽입된 순서대로 큐로부터 제거된다.

1.9.2 트리 (Trees)

트리(Tree)는 데이터의 서열을 표시하는데 사용 가능한 자료구조이다. 트리 구조에서 데이터 값들은 부모-자식 관계로 연결된다.

트리의 종류 중 일부는 다음과 같다.

  • 일반 트리(General Tree) : 부모 노드는 임의의 수의 자식 노드를 가질 수 있다.
  • 이진 트리(Binary Tree) : 부모 노드는 최대 두 개의 자식 노드를 가질 수 있다.
  • 이진 탐색 트리(Binary Search Tree) : 이진 트리에 추가적인 조건으로 좌측 자식 노드 <= 우측 자식 노드의 순서를 요구한다.
  • 균형 이진 탐색 트리(Balanced Binary Search Tree) : 좌측과 우측 자식 트리간에 균형있는 높이를 가지도록 하는 조건이 생긴 이진 탐색 트리

1.9.3 해시 함수와 맵 (Hash Functions and Maps)

해시 함수(Hash Function)는 데이터를 입력으로 받아 이 데이터에 산술 연산을 수행하여 하나의 수를 반환한다. 이 수는 그 데이터를 인출하기 위해 테이블의 인덱스로 사용할 수 있다.

해시 함수를 사용하여 데이터를 인출할 경우 걸리는 시간이 O(1)만큼 좋을 수도 있으며 이는 상세 구현에 좌우된다.

해시 함수의 이슈 중 하나는 두 개의 서로 다른 입력이 하나의 출력 값을 가질 수 있다는 것이다. 이를 우리는 해시 충돌(hash collision)이라고 한다.

해시 함수의 한 용도는 해시 맵(Hash Map)을 구현하는 일이다. 해시 맵은 해시 함수를 사용하여 [키:값]을 매핑시킨다.

아래의 그림은 해시 맵의 예시 이다.

1.9.4 비트맵 (Bitmaps)

비트맵(Bitmaps)은 n개의 항의 상태를 나타내는 데 사용 가능한 n개의 이진 비트의 스트링이다.

비트맵은 대량의 자원의 가용성을 표시할 때 일반적으로 사용된다. (ex. 디스크 드라이브)

ex) 001011101


1.10 계산 환경 (Computing Environments)

다양한 계산 환경에서 운영체제가 어떻게 사용되는지 살펴보겠다.

1.10.2 모바일 컴퓨팅 (Mobile Computing)

모바일 컴퓨팅은 휴대용 스마트폰과 태블릿 컴퓨터의 컴퓨팅 환경을 말한다. 이들 장치들은 이동 가능하고 가볍다는 구별되는 물리적 특징을 공유한다.

온라인 서비스에 접근을 허용하기 위해 휴대장치는 전형적으로 IEEE 표준 802.11 무선 또는 휴대 전화 데이터망을 사용한다.

현재 휴대 컴퓨팅에서 두 개의 지배적인 운영체제는 Apple iOSGoogle Android이다.

1.10.3 클라이언트 서버 컴퓨팅 (Client-Server Computing)

현대 네트워크 구조는 서버 시스템이 클라이언트 시스템이 생성한 요청을 만족시키는 배치를 특징으로 한다. 클라이언트-서버 시스템이라고도 불리는 이 형태의 특수 분산 시스템은 아래의 그림과 같은 일반적인 구조를 갖는다.

서버 시스템은 대체적으로 계산 서버와 파일 서버로 분류될 수 있다.

  • 계산-서버 시스템은 클라이언트가 어떤 작업을 요청할 인터페이스를 제공한다. 그 결과로 서버는 그 작업을 수행하고 결과를 클라이언트에게 돌려보낸다. (ex. 데이터베이스 서버)
  • 파일-서버 시스템은 클라이언트가 파일을 생성, 갱신, 읽기 및 제거할 수 있는 파일 시스템 인터페이스를 제공한다. (ex. 웹 서버)

1.10.4 피어 간 계산 (Peer to Peer Computing)

이 모델에서는 클라이언트와 서버가 서로 구별되지 않고, 시스템상의 모든 노드가 피어로 간주되고 각 피어는 서비스를 요청하느냐 제공하느냐에 따라 클라이언트 및 서버로 동작한다.

클라이언트 서버 시스템에서는 서버가 병목으로 작용하지만, 피어 간 시스템에서는 서비스가 네트워크에 분산된 여러 노드에 의해 제공될 수 있다.

ex) Skype가 제공하는 IP상 음성 서비스

1.10.5 클라우드 컴퓨팅 (Cloud Computing)

클라우드 컴퓨팅은 계산, 저장장치는 물론 Application조차도 네트워크를 통한 서비스로 제공하는 Computing Type이다.

ex) Amazon의 Elastic Compute Cloud(EC2)

클라우드 컴퓨팅의 유형 중 일부 소개

  • 공중 클라우드 - 서비스를 위해 지불 가능한 사람은 누구나 인터넷을 통해 사용 가능한 클라우드
  • 사유 클라우드 - 한 회사가 사용하기 위해 운영하는 클라우드
  • 혼합형 클라우드 - 공공과 사유 부분을 모두 포함하는 크랄우드
  • 소프트웨어 서비스(software as a service, SaaS) - 인터넷을 통해 사용 가능한 하나 이상의 Application
    • ex) Word Process, Spread Sheets

  • 플랫폼 서비스(platform as a service, PaaS) - 인터넷을 통해 사용하도록 Application에 맞게 준비된 소프트웨어 스택
    • ex) Database Server, Jenkins Server, …

  • 하부구조 서비스(infrastructure as a service, IaaS) - 인터넷을 통해 사용가능한 서버나 저장장치
    • ex) 생산 데이터의 백업 복사본을 만들기 위한 저장장치

클라우드 컴퓨팅 환경은 다수 유형의 조합을 제공하기 때문에 이들 클라우드 컴퓨팅의 유형들은 서로 독립적이 아니다.

다음의 그림은 IaaS를 제공하는 Public Cloud를 보여준다. 클라우드 서비스와 클라우드 사용자 인터페이스가 모두 방화벽에 의해 보호되는 것에 유의하자.

1.10.6 실시간 내장형 시스템 (Real-Time Embedded Systems)

내장형(Embedded) 시스템은 현재 가장 유행하는 컴퓨터의 형태이다. 이 장치들은 아주 특정한 작업만을 수행하는 경향이 있다.

내장형 시스템은 거의 언제나 실시간 운영체제를 수행한다. 실시간 시스템은 Processor의 작동이나 데이터의 흐름에 엄격한 시간 제약이 있을 때 사용된다.


1.11 무료 및 공개 소스 운영체제 (Free and Open Source Operating Systems)

UNIX

유닉스(영어: Unix)는 교육 및 연구 기관에서 즐겨 사용되는 범용 다중 사용자 방식의 시분할 운영 체제이다. 1970년대 초반 벨 연구소 직원인 켄 톰슨, 데니스 리치 등이 처음 개발하였다. 오늘날의 유닉스 시스템은 여러 회사들과 비영리 단체들이 이 커널로 활용하여 다양한 운영체제를 개발하고 있다.

유닉스는 처음부터 다양한 시스템 사이에서 서로 이식할 수 있고, 멀티 태스킹과 다중 사용자를 지원하도록 설계되었다. 유닉스 시스템은 다음과 같은 개념을 가지고 있다.

  • 일반 텍스트 파일, 명령행 인터프리터, 계층적인 파일 시스템, 장치 및 특정한 형식의 프로세스 간 통신을 파일로 취급 등.
  • 소프트웨어 공학 측면에서, 유닉스는 C의 사용과 유닉스 철학이라는 부분이 특징이다.

유닉스(UNIX) 상표권은 오픈 그룹이 갖고 있으며, 유닉스 소스 코드에 대한 저작권은 노벨이 소유하고 있다.

1.11.2 무료 운영체제 (Free Operating Systems)

소프트웨어 사용 및 재배포를 제한하려는 움직임에 대응하기 위해 1984년 Richard Stallman은 GNU라는 무료 UNIX 호환 운영체제(“GNU’s Not Unix!”의 약어)를 개발하기 시작하였다.

자유 소프트웨어 운동은 사용자에게 다음의 4가지 자유를 보장시키기 위해 시행되었다.

  1. 자유롭게 소프트웨어를 실행시킬 권리
  2. 소스 코드를 분석하고 수정할 권리
  3. 코드 수정 없이 배포하거나 판매할 권리
  4. 코드를 수정하여 배포하거나 판매할 권리

1.11.3 GNU/Linux

GNU/Linux 운영체제(커널만 말할 때는 Linux라고 하지만 GNU 도구를 포함한 전체 운영체제는 GNU/Linux라고 부름)는 시스템의 수백 가지의 고유한 배포판 또는 사용자 맞춤 빌드를 생성하였다.

주요 배포판에는 Red Hat, SUSE, Fedora, Debian, Slackware, Ubuntu가 있다.

1.11.4 BSD Unix

BSD UNIX는 Linux보다 오래되고 복잡한 역사를 가지고 있다. 1978년에 AT&T의 파생물로 출발하였다.

macOS의 핵심 커널 구성요소인 Darwin은 BSD UNIX에 기반을 두고 잇으며 역시 공개 소스화 되어 있다.

1.11.5 Solaris

Solaris는 Sun Microsystems사의 Unix 기반 상용 운영체제이다.