1. Introduction

운영 체제는 컴퓨터의 하드웨어를 관리하는 소프트웨어이다. 현대 컴퓨팅 환경에서의 운영 체제의 역할을 알아보기 이전에, 컴퓨터 하드웨어의 구성과 아키텍쳐를 이해하는 것은 중요하다. 이는 크고 복잡하기 때문에, 단계적으로 만들어져야 한다.

1.1. What Operating Systems Do

컴퓨터 시스템은 크게 4부분으로 나눌 수 있다. 하드웨어, 운영 체제, 애플리케이션 프로그램, 사용자. 하드웨어는 시스템의 기본적 계산 자원을 제공한다. 애플리케이션 프로그램은 이러한 자원들이 사용자의 문제들을 해결하는 방법을 정의한다. 운영 체제는 하드웨어를 제어하고 그 사용을 여러 애플리케이션 프로그램간에 조정한다. 운영 체제는 그 자체로는 의미가 없고, 다른 프로그램이 의미있는 일을 하는 환경을 제공할 뿐이다.

1.1.1. User View

사용자의 관점에서는 운영 체제는 사용의 편의성자원 활용을 위해 설계된다. 많은 사용자들은 모바일 기기와 터치 스크린이나 Siri 등의 음성 인식 인터페이스 등을 통해 상호 작용한다. 임베디드 컴퓨터 등은 사용자 관점이 거의 없거나 적다.

1.1.2. System View

컴퓨터의 관점에서는 운영체제는 자원 할당자로 볼 수 있다. 또는 사용자 프로그램의 실행을 관리하는 제어 프로그램으로도 볼 수 있다.

1.1.3. Defining Operating Systems

즉, 운영 체제는 많은 역할과 기능을 갖고 있다. 이렇게 된 배경은 컴퓨터의 역사에 근거한다. 컴퓨터는 짧지만 빠르게 발달해왔기 때문이다 (무어의 법칙). 운영 체제의 존재 이유는 유용한 컴퓨팅 시스템을 만들기 위함이다. 또한, 무엇이 운영 체제의 일부가 되어야 하는지에 대한 합의도 없다. 보편적인 정의는, 운영 체제는 컴퓨터에서 항상 동작하는 프로그램(커널)이라는 것이다. 커널 이외에는 다른 두 가지 타입인 시스템 프로그램과 애플리케이션 프로그램이 있다. 무엇이 운영체제를 구성하는지는 개인용 컴퓨터가 널리 퍼짐에 따라 중요해졌다. 최근의 모바일 운영 체제는 코어 커널뿐만 아니라 앱 개발자에 대한 추가적인 서비스들을 제공하는 프레임워크인 미들웨어를 포함하기도 한다. 즉, 운영 체제는 항상 켜져 있는 커널, 앱 개발을 돕는 미들웨어, 시스템의 관리를 돕는 시스템 프로그램으로 구성된다.

1.2. Computer-System Organization

현대적인 범용 컴퓨터 시스템은 여러 CPU와 디바이스 컨트롤러들로 이루어져 있다. 이들은 버스로 연결되는데, 이는 컴포넌트와 공유 메모리 사이의 접근을 제공한다. 대개, 운영체제는 각 디바이스 컨트롤러에 대해 디바이스 드라이버를 갖고 있다. 이는 운영 체제의 나머지 부분에 디바이스에 대한 일관된 인터페이스를 제공한다. 이제 이러한 시스템이 어떻게 작동하는지를 알아보자.

1.2.1. Interrupts

컨트롤러는 인터럽트를 통해 디바이스 드라이버에 신호를 전달한다.

1.2.1.1. Overview

하드웨어는 CPU에 신호를 전달해서 어느 때나 인터럽트를 가동시킬 수 있다. 이는 보통 시스템 버스를 통해 이루어진다. CPU가 인터럽트를 받으면 동작을 멈추고 그 동작을 지정된 장소로 변경시킨다. 인터럽트는 컴퓨터 아키텍쳐의 중요한 부분으로서, 로우 메모리에 인터럽트 루틴 각각을 관장하는 포인터들의 테이블이 인터럽트 벡터로 자리잡아 있다. 인터럽트 아키텍쳐는 인터럽트 시점에서의 상태 정보도 저장하고 있어야 한다. 인터럽트를 수행한 뒤 정보를 복원하기 위해서이다.

1.2.1.2. Implementation

인터럽트의 구현은 대개 CPU 하드웨어가 인터럽트-요청 선 이라 불리는 와이어를 갖고 있어 컨트롤러가 주는 신호를 감지한 뒤 인터럽트-핸들러 루틴으로 점프한다. 그리고 필요한 조치를 한 뒤 상태를 원복시키고 인터럽트 이전의 실행 상태로 CPU를 되돌린다. 이를 디바이스 컨트롤러가 인터럽트를 실행하고 CU가 인터럽트를 받고 인터럽트 핸들러에 전송하고 핸들러가 인터럽트를 청소한다고 한다. 현대적인 운영 체제에서는 조금 더 복잡하다:

  1. 임계 프로세싱 중에는 인터럽트를 미룰 수 있어야 한다.
  2. 적절한 인터럽트 핸들러로 전송할 수 있는 효율적인 방법이 있어야 한다.
  3. 인터럽트 간 우선도를 정의할 수 있어야 한다.

현대적인 하드웨어에서는 이 특성들은 CPU와 인터럽트-컨트롤러 하드웨어를 통해 제공된다. 대부분의 CPU는 2개의 인터럽트 요청 선이 있다. 하나는 마스킹 불가능한 인터럽트로, 회복 불가능한 메모리 에러같은 이벤트를 위해 예약되어 있다. 두번째는 마스킹 가능한 인터럽트로, 절대로 중단되어서는 안 되는 임계 명령어의 실행 전에 CPU에 의해 꺼질 수 있다.

인터럽트 벡터 메커니즘의 목적은 무엇이 서비스를 필요로 하는지를 판단할 때 인터럽트의 가능한 모든 소스를 탐색할 필요성을 줄이는 것에 있다. 하지만 컴퓨터의 디바이스 수가 인터럽트 벡터의 크기보다 클 수도 있는데, 이 문제는 인터럽트 벡터의 각 원소가 인터럽트 핸들러의 목록을 가리키도록 하는 인터럽트 체이닝으로 해결한다. 인텔 프로세서의 인터럽트 벡터 중 0-31은 논마스커블, 32-255는 마스커블이다. 인터럽트 메커니즘은 또한 인터럽트 우선순위 레벨의 시스템을 구현한다.

요약하면, 현대 운영 체제에서 인터럽트는 비동기 이벤트를 다루기 위해 폭넓게 쓰인다.

1.2.2. Storage Structure

CPU는 메모리를 통해서만 명령어를 로드할 수 있다. 대부분의 프로그램은 읽고 쓰기 가능한 메모리, 즉 무작위 접근 기억 장치(RAM)에서 실행된다. 이는 대개 동적 무작위 접근 기억 장치(DRAM)라는 반도체 기술을 통해 구현된다. 컴퓨터는 다른 메모리도 쓰는데, 컴퓨터를 가동시키는 첫째 프로그램은 붓스트랩 프로그램으로, RAM은 전원을 끄면 데이터가 소멸되는 휘발성이기 때문에 전기적으로 지울 수 있는 읽기 전용 메모리나 다른 펌웨어 (낮은 빈도로 써지는 비휘발성 저장소)에 올려진다. 이는 느리기 때문에 대부분 정적 프로그램이나 자주 쓰이지 않는 데이터를 담는다.

모든 메모리는 바이트의 배열의 형태를 갖는다. 이에 대한 상호작용은 특정 메모리 주소에 대한 로드나 저장 명령어의 열을 통해 이루어진다. 폰 노이만 아키텍쳐를 따르는 시스템에 실행된 명령어-실행 사이클은 먼저 메모리에 명령어를 부착시키고 그 명령어를 명령어 레지스터에 저장한 뒤 실행한다. 이 때 프로그램에서 메모리 주소가 어떻게 생성되는지는 상관이 없다. 그 값만이 중요하다.

이상적으로는 프로그램과 데이터가 메인 메모리에 영구적으로 저장되는 것이 바람직하지만 이는 불가능하다. 메인 메모리는 대개 매우 작고, 휘발성이기 때문이다. 따라서 대부분의 컴퓨터 시스템은 하드디스크 드라이브(HDD)나 비휘발성 메모리 기기(NVMD) 등의 이차 저장소를 메인 메모리에 대한 확장으로 쓴다. 다른 기기에 저장된 데이터에 대한 백업용으로 쓰이는 느린 저장소인 삼차 저장소도 있다. 이런 여러 저장소의 종류는 용량과 접근 시간 면에서 계층화될 수 있다. (레지스터-캐시-메인 메모리-플래시 메모리-HDD-광학 디스크-마그네틱 테이프) 일반적으로 크기와 속도간의 트레이드오프가 있다. 상위 메모리는 반도체 메모리로 만들어진다. 저장소에 대해서는 다음의 명칭을 사용하겠다:

  • 휘발성 메모리는 메모리라 지칭된다.
  • 비휘발성 메모리는 NVS로 지칭된다. 이는 기계적 비휘발성 메모리 (하드디스크, 광학 디스크 등)과 전기적 비휘발성 메모리 (플래시 메모리, SSD, NVM) 등으로 나뉜다. 전기적 비휘발성 메모리가 더 빠르고 더 용량이 작고 더 비싸다.

완전한 저장소 시스템은 모든 요소에 균형을 맞춰야 한다.

1.2.3. I/O Structure

운영 체제 코드의 많은 부분은 입출력을 관리하는 데 쓰인다. 시스템의 신뢰성과 퍼포먼스와 다양한 종류의 디바이스에 대응하기 위해서다. 인터럽트 기반 I/O는 대용량 데이터 이동에 부적합하므로 이 때는 직접 메모리 접근(DMA)가 쓰인다. 어떤 하이엔드 시스템은 버스 아키텍쳐 대신 스위치를 쓰기도 한다.

1.3. Computer-System Architecture

컴퓨터 시스템은 여러 방법으로 구성될 수 있다.

1.3.1. Single-Processor Systems

예전엔 대부분의 컴퓨터 시스템이 단일 프로세싱 코어가 달린 단일 CPU를 포함한 단일 프로세서를 사용했다. 코어는 명령어를 실행하고 데이터를 국소적으로 저장하는 컴포넌트이다. 이런 시스템들은 제한된 명령어 집합을 수행하는 특별한 용도의 프로세서들을 대동하기도 한다. 하지만 이런 특별한 목적의 마이크로프로세서들이 싱글 프로세서 시스템을 멀티프로세서로 만들지는 않는다.

1.3.2. Multiprocessor Systems

현대 컴퓨터는 각각 싱글코어 CPU가 달린 프로세서를 여러 개 쓰는 멀티프로세서 시스템을 주로 쓴다. 이는 대역폭을 늘려주지만, 오버헤드 때문에 프로세서가 N개라고 대역폭이 N배가 되진 않는다. 가장 범용적인 멀티프로세서 시스템은 대칭 멀티프로세싱(SMP)이다. 이는 각 CPU 프로세서가 모든 작업을 수행하는 것이다. 이는 많은 프로세스가 큰 퍼포먼스 저하 없이 동시에 가동될 수 있다는 이점이 있다. 대개 이 때는 CPU간 부하 균형을 위해 공유 메모리를 사용한다.

멀티프로세서의 정의는 시간에 따라 변화하여 이제는 단일 칩 내에 복수의 컴퓨팅 코어를 배치하는 멀티코어 시스템을 포함한다. 칩 내의 통신이 칩 간의 통신보다 빠르기 때문에 이는 효율적이고 전력 소모량이 적다. 이 때 각각의 코어는 각각의 레지스터와 캐시를 갖고 공유 캐시를 갖는다.

멀티프로세서 시스템에 CPU를 추가하는 것은 컴퓨팅 파워를 증가시키지만 이것도 너무 많아지면 시스템 버스가 병목이 되어 퍼포먼스가 저하된다. 이를 방지하기 위해 CPU를 공유 시스템 인터커넥트로 연결하는 것이다. 이 접근을 비균일 메모리 접근(NUMA)이라 한다. 하지만 이도 지연 시간을 증가시킬 수 있다. 마지막으로, 블레이드 서버는 동일한 섀시에 여러 프로세서 보드, I/O 보드, 네트워킹 보드를 배치하는 것이다. 이는 각각의 블레이드 프로세서 보드가 각자의 운영 체제를 실행한다는 차이점이 있다.

1.3.3. Clustered Systems

멀티프로세서 시스템의 또 다른 형태로 복수 시스템을 느슨하게 결합시킨 집속 시스템이 있다. 이는 가용성이 높은 서비스에 주로 사용된다. 생존 하드웨어의 단계에 비례해 서비스를 지속할 수 있는 능력을 우아한 성능 저하라 한다. 이를 넘어서 단일 컴포넌트의 실패에 항상 대처할 수 있는 고장 허용 시스템도 있다.

집속 시스템은 비대칭적이거나 대칭적일 수 있다. 비대칭 클러스터링에서는 한 기계가 핫-스탠바이 모드로 활동 중인 서버를 모니터링한다. 대칭 클러스터링에서는 복수의 호스트가 애플리케이션을 실행하며 서로를 모니터링한다. 이것이 더 효율적이지만, 복수의 애플리케이션이 가동 가능해야 한다는 점이 있다. 클러스터는 네트워크로 연결된 여러 컴퓨터 시스템으로 구성되어 있으므로, 고성능 컴퓨팅 환경을 제공할 수 있다. 다만 애플리케이션이 이를 활용할 수 있는 병렬화 기능을 제공해야 한다.

다른 형태의 클러스터는 넓은 영역 네트워크에 걸쳐 여러 병렬 클러스터를 클러스터링하기도 한다. 대다수의 운영 체제는 여러 호스트의 데이터에 대한 동시 접근을 지원하지 않으므로, 이에 대해서는 분산 락 매니저(DLM) 기능이 필요하다. 클러스터 기술은 저장소 지역 네트워크(SAN)에 의해 발전되어 왔는데, 이는 여러 시스템이 저장소 풀에 부착되게 한다.

1.4. Operating-System Operations

운영 체제는 프로그램이 실행되는 환경을 제공한다. 이는 컴퓨터가 실행될 때 운영 체제 커널에 자리잡아 최초 실행되는 붓스트랩 프로그램에 의해 로딩된다. 커널이 로딩되고 실행되면 서비스를 시작한다. 어떤 서비스는 시스템 데몬으로서 커널이 실행되는 시간 전체 동안 구동된다. 더 이상 실행할 프로세스나 I/O 디바이스, 사용자 요청이 없으면 운영 체제는 인터럽트가 올 때까지 대기한다. 하드웨어 인터럽트 외에 소프트웨어 인터럽트인 트랩(또는 예외), 또는 시스템 호출도 있다.

1.4.1. Multiprogramming and Multitasking

운영 체제의 중요한 점은 복수의 프로그램(프로세스)을 실행할 수 있는 멀티프로그래밍 능력이다. 발상은 프로그램 중 하나가 대기 상태일 때 다른 프로그램으로 스위칭하는 것으로 CPU가 놀지 않게 하는 것이다. 이는 우리의 삶에서도 자주 볼 수 있는 발상이다. 멀티태스킹은 멀티프로그래밍의 논리적 확장으로, 프로세스간 스위칭을 빈번하게 해서 반응 시간을 줄인다. 예를 들면 키 입력 등. 동시에 메모리에 여러 프로세스를 올리는 것은 특정한 형태의 메모리 관리인 CPU 스케쥴링을 필요로 한다. 멀티태스킹 시스템에서, 운영 체제는 물리적 메모리보다 큰 가상 메모리논리적 메모리로서 둠으로써 납득 가능한 반응 시간을 갖게 한다. 멀티프로그래밍과 멀티태스킹 시스템은 파일 시스템을 지원해야 한다.

1.4.2. Dual-Mode and Multimode Operation

운영 체제는 사용자 정의 코드와 운영 체제 코드를 구분할 수 있어야 한다. 그래서 사용자 모드커널 모드(관리자 모드, 시스템 모드, 특권 모드)를 하드웨어에 모드 비트를 부착해 구분짓는다. 부팅 시에 하드웨어는 커널 모드로 시작하고, 운영 체제는 사용자 애플리케이션을 유저 모드로 시작한다. 컴퓨터를 제어할 때는 커널 모드로 바뀐다. 이러한 듀얼 모드는 특정한 기계 명령어를 특전 명령어로 설계해 악성 사용자로부터 운영 시스템을 보호하는 역할을 한다. 예를 들면 커널 모드로 스위칭하라는 명령어가 있다.

모드의 개념은 3개 이상으로도 확장될 수 있다. 예를 들어 인텔 프로세스는 4개의 독립적인 프로세스 링으로 구성되어 있다. 가상화를 빈번하게 하는 CPU는 가상 머신 매니저(VMM)의 제어를 가리키는 독립적인 모드를 둔다. 이로서 컴퓨터 시스템 내의 명령어 실행 사이클을 알아보았다.

시스템 호출은 사용자 프로그램이 운영 시스템에 보내는 요청이다. 이는 하드웨어에게는 소프트웨어 인터럽트로 받아들여진다. 하드웨어 보호는 운영 체제에 의해 모드를 위반하는 에러를 감지함으로써 이루어진다.

1.4.3. Timer

사용자 프로그램이 무한 루프 등에 빠지는 일이 없기 위해, 운영 체제는 타이머를 둬야 한다. 이는 보통 변수 타이머로 구현된다. 사용자에게 권한을 주기 전, 운영 체제는 타이머가 인터럽트되도록 세팅한다.

1.5. Resource Management

운영 체제는 자원 관리자이다.

1.5.1. Process Management

프로그램은 그 명령어들을 CPU가 실행하지 않으면 아무것도 할 수 없다. CPU에 의해 실행되는 프로그램을 프로세스라 한다. 이 프로세스는 작업을 위해 특정한 자원이 필요하다. 프로그램은 패시브한 객체고 프로세스는 액티브한 객체라는 점을 강조하겠다. 싱글스레드 프로세스는 실행할 다음 명령어를 특정하는 단일한 프로그램 카운터를 가져서 명령어를 순서대로 실행한다. 멀티스레드 프로세스는 복수의 프로그램 카운터를 가진다. 프로세스는 시스템이 작업을 수행하는 단위로, 운영 체제는 이를 단일 CPU 코어에서 직렬로 또는 여러 CPU 코어에서 병렬로 수행한다.

운영 체제는 프로세스 관리에 있어 다음을 맡는다:

  • 사용자와 시스템 프로세스를 생성하고 삭제
  • CPU 위의 스레드와 프로세스를 스케쥴링
  • 프로세스를 연기하고 재개
  • 프로세스 동기화 메커니즘을 제공
  • 프로세스 통신 메커니즘을 제공

1.5.2. Memory Management

일반적으로 CPU가 직접적으로 주소를 따 오고 접근할 수 있는 저장소는 메인 메모리뿐이다. CPU가 수행할 명령어도 메인 메모리에 상주해야 한다. 따라서 프로그램이 실행될 때도 메인 메모리에 올라가야 한다. 이를 위해 운영 체제는 메모리 관리를 다음과 같이 할 수 있어야 한다.

  • 현재 사용되는 메모리와 그를 사용하는 프로세스를 추적
  • 메모리 공간을 필요에 따라 할당 또는 해제
  • 어떤 프로세스와 데이터를 이동시켜야 할 지, 메모리의 소진 여부를 판단

1.5.3. File-System Management

저장소의 논리적 저장 단위를 운영 체제가 추상화시킨 것을 파일이라 한다. 파일 관리는 운영 체제의 가장 가시적인 부분 중 하나다. 파일은 그를 생성한 사람에 의해 정의된 정보의 집합이다. 운영 체제는 대용량 저장소 미디어와 그를 제어하는 디바이스를 관리함으로써 파일의 컨셉을 추상화한다. 운영 체제는 파일 관리를 위해 다음의 역할을 한다:

  • 파일의 생성과 삭제
  • 파일을 관리하기 위한 디렉토리의 생성과 삭제
  • 파일과 디렉토리를 조작하는 기본 기능을 제공
  • 파일을 대용량 저장소에 맵핑
  • 비휘발성 저장소 미디어에 파일을 백업

1.5.4. Mass-Storage Management

컴퓨터 시스템은 메인 메모리에 대한 백업으로 쓸 이차 저장소를 제공해야 하고 그를 관리하기 위해 다음을 수행해야 한다.

  • 마운팅과 언마운팅
  • 자유 공간 관리
  • 저장소 할당
  • 디스크 스케쥴링
  • 파티셔닝
  • 보호

이차 저장소는 자주 쓰이고 포괄적으로 쓰이기 때문에 효율적으로 쓰여야 한다. 이보다 더 느리고 큰 저장소로 삼차 저장소가 있다. 이는 퍼포먼스 크리티컬하진 않지만, 그래도 관리되어야 한다.

1.5.5. Cache Management

캐싱은 자주 사용되는 데이터를 빠른 저장소에 저장해두는 것이다. 이는 내부 프로그래밍 가능한 레지스터로 구현되기도 한다. 이외에는 하드웨어에 구현된다. 캐시는 크기가 제한되어 있으므로 캐시 관리는 중요한 문제이다.

저장소 계층간 정보의 이동은 명시적일 수도 있고 묵시적일 수도 있는데 하드웨어 설계와 운영 체제 소프트웨어에 달려 있다. 이 때 같은 데이터가 다른 레벨의 저장소에 중복되어 발생할 수도 있다. 멀티태스킹 환경에서는 이것에 주의해야 한다. 멀티프로세서 환경에서 각 CPU가 각각의 캐시가 있다면 문제는 더 복잡해지는데, 이는 캐시 일관성을 보장해야 한다. 분산형 시스템에서는 데이터 일관성을 보장해야 한다.

1.5.6. I/O System Management

운영 체제의 목적 중 하나는 사용자로부터의 입출력 하드웨어 디바이스의 관리이다. 이는 I/O 서브시스템으로, 다음을 수행한다:

  • 버퍼링, 캐싱, 스풀링을 포함하는 메모리 관리 컴포넌트
  • 디바이스 드라이버 인터페이스
  • 하드웨어 디바이스에 대한 드라이버

어떤 기기의 특이한 점들을 아는 소프트웨어는 그 기기의 드라이버 뿐이다. I/O 서브시스템은 인터럽트 핸들러와 디바이스 드라이버로 구성된다.

1.6. Security and Protection

컴퓨터 시스템은 데이터에 대한 접근을 제한할 수 있어야 한다. 이는 보호 메커니즘으로 구현된다. 이는 컴포넌트 서브시스템간 인터페이스에 존재하는 잠재 에러를 감지해 신뢰성을 높인다. 하지만 이것으로는 충분하지 않으므로 시스템을 보호할 수 있는 보안이 필요하다. 이를 위해서 사용자를 유저 식별자 (유저 ID)로 구별해야 한다. 윈도우에서 이것은 보안 ID(SID)이다. 또는 사용자 집단을 그룹 식별자로 구분할 수도 있다. 이에 추가로 일시적으로 특전을 부여유효 UID로 프로그램을 동작할 수 있어야 한다.

1.7. Virtualization

가상화는 컴퓨터의 여러 하드웨어를 여러 다른 실행 환경으로 추상화할 수 있게 하는 기술이다. 가상 머신의 사용자는 여러 운영 체제간 스위치를 할 수 있다. 이는 운영 체제가 다른 운영 체제 내의 애플리케이션으로서 구동될 수 있게 한다.

가상화는 넓게 이야기하면 에뮬레이션을 포함한다. 에뮬레이션은 컴퓨터 하드웨어를 소프트웨어로 시뮬레이팅하는 것이지만, 성능 저하가 심각하다는 점이 있다.

특별한 CPU 아키텍쳐를 위해 컴파일된 운영 체제는 그 CPU 아키텍쳐를 위해 컴파일된 또 다른 호스트 운영 체제 내에서 가상 머신 매니저(VMM)에 의해 게스트로서 구동될 수 있다.

현대적인 운영 체제는 복수의 애플리케이션을 실행할 수 있지만, 가상화의 필요성은 증가하고 있다. 이 책에서는 주로 리눅스를 다룬다.

1.8. Distributed Systems

분산형 시스템은 물리적으로 떨어졌지만 네트워크로 연결되어 사용자에게 시스템의 자원에 접근할 수 있도록 하는 시스템이다. 네트워크는 복수의 시스템간 통신 통로이다. 범용적으로는 TCP/IP가 있다. 네트워크는 노드간 거리에 기반해 구별된다. 지역 네트워크 (LAN)는 방, 빌딩, 캠퍼스간 컴퓨터를 연결한다. 광역 네트워크(WAN)는 빌딩, 도시, 국가간을 연결한다. 또 다른 예로 메트로폴리탄 네트워크(MAN) 또는 사유지 네트워크(PAN) 등이 있을 수 있다. 이를 전달하는 매체는 다양하다.

어떤 운영 체제는 네트워크의 컨셉을 포함하기도 하는데 이런 네트워크 운영 체제는 네트워크간 파일 공유 등의 특성을 지원한다.

1.9. Kernel Data Structures

이 절에서는 커널을 구성하는 기본적 자료 구조에 대해 다룬다.

1.9.1. Lists, Stacks, and Queues

배열은 각 항목이 직접적으로 접근될 수 있는 자료 구조이다. 리스트는 데이터가 나열된 자료 구조이다. 흔히 연결 리스트로 구현된다. 이에는 단일 연결 리스트, 양방향 연결 리스트, 환형 연결 리스트 등이 있다. 문제점은 항목에 대한 접근이 선형 시간이라는 점이다. 스택은 후입선출(LIFO)를 지원하는 자료 구조이다. 이는 push, pop 연산을 지원한다. 반면 는 선입선출(FIFO)를 지원하는 자료 구조이다.

1.9.2. Trees

트리는 데이터 계층을 나타내는 자료 구조이다. 일반 트리에서는 부모가 자식을 얼마든지 가질 수 있다. 이진 트리에서는 왼쪽 자식과 오른쪽 자식까지 최대 2개만 가질 수 있다. 이진 탐색 트리는 왼쪽 자식 ≤ 부모 ≤ 오른쪽 자식의 순서를 요구한다. 그러나 최악의 경우에는 여전히 선형 시간의 성능을 낼 수 있기 때문에 레드-블랙 트리 등의 균형 이진 탐색 트리를 사용하곤 한다.

1.9.3. Hash Functions and Maps

해시 함수는 데이터를 입력받아 숫자를 리턴하는 함수로, 분할 상환 O(1)의 접근/삽입/삭제를 지원하기에 폭넓게 쓰인다. 하지만 해시 충돌을 조심해야 하는데 이는 연결 리스트로 다룬다. 이는 해시 맵 등의 구현에 쓰인다.

1.9.4. Bitmaps

비트맵은 길이 n의 이진 문자열로, 공간을 절약하기 위해 쓰인다. 디스크 블록 등에 활용된다.

1.10. Computing Environments

운영 체제의 사용 분야를 알아보자.

1.10.1. Traditional Computing

전통적인 사무실은 네트워크에 연결된 여러 PC들로 구성되었다. 그러나 요즈음은 WAN 대역폭과 웹 기술이 늘어나면서 포탈네트워크 컴퓨터 (얇은 클라이언트)를 차용하는 회사들이 늘어나고 있다. 또한 모바일 기기는 무선 네트워크에 연결되기도 한다. 많은 집에서는 방화벽을 사용하기도 한다. 20세기 후반에는 컴퓨팅 자원이 부족했기 때문에 시간을 공유하는 시스템이 많았다. 지금은 그렇지 않지만, 스케쥴링 방법은 여전히 쓰이고 있다.

1.10.2. Mobile Computing

모바일 컴퓨팅은 스마트폰이나 태블릿 PC에서 쓰이는 컴퓨팅을 말한다. 최근에서는 활용도가 대폭 늘어났다. 이는 증강 현실을 구현하기도 한다. 모바일 기기는 용량이 적고 전력 소모가 적어야 하기 때문에 작고 느리고 프로세싱 코어가 적은 프로세서를 쓴다. 모바일 컴퓨팅을 지배하는 두 운영 체제로 Apple iOSGoogle Android가 있다.

1.10.3. Client-Server Computing

네트워크 아키텍쳐는 서버 시스템클라이언트 시스템으로부터의 요청을 받아들임으로써 클라이언트-서버 시스템을 구성한다. 이는 크게 2가지로 나뉘는데, 계산-서버 시스템은 클라이언트가 요청을 전송하고 서버가 동작을 수행해 그 결과를 클라이언트로 보내는 인터페이스를 제공한다. 파일-서버 시스템은 클라이언트가 파일을 생성, 업데이트, 읽기, 쓰기를 할 수 있는 파일 시스템 인터페이스를 제공한다.

1.10.4. Peer-to-Peer Computing

분산형 시스템의 또 다른 구조는 P2P 모델이다. 이 모델에서 클라이언트와 서버는 구별되지 않고, 시스템 내 모든 노드는 전부 피어로 구분된다. 이에 참여하기 위해서는 노드가 우선 피어의 네트워크에 참여해야 하는데, 어떤 서비스가 가용 가능한지를 판단하는데는 두 가지 방법이 있다.

  • 노드가 네트워크에 가입할 때, 네트워크의 중앙화된 검색 서비스에 서비스를 등록한다.
  • 또는 네트워크의 다른 모든 노드에 서비스에 대한 요청인 탐색 프로토콜을 보낼 수도 있다.

P2P 네트워크는 1990년대 후반에 많이 퍼졌다. IP간 음성(VoIP)을 제공하는 Skype는 그 예이다.

1.10.5. Cloud Computing

클라우드 컴퓨팅은 네트워크 상의 서비스를 통해 컴퓨팅, 저장, 애플리케이션까지 수행하는 것을 말한다. 이의 예인 ec2 등은 가상화의 확장으로 볼 수도 있다. 이에는 다음의 여러 종류가 있다.

  • 공적 클라우드 – 돈을 낸 누구든 인터넷을 통해 접근할 수 있는 클라우드
  • 사적 클라우드 – 회사 자신을 위해 운영되는 클라우드
  • 혼합 클라우드 – 공적 클라우드와 사적 클라우드를 모두 컴포넌트로 가진 클라우드
  • SaaS – 인터넷을 통해 사용가능한 복수의 어플리케이션
  • PaaS – 인터넷을 통한 어플리케이션 사용을 위해 준비된 소프트웨어 스택
  • IaaS – 인터넷 상에 사용가능한 서버나 저장소

이러한 여러 클라우드 컴퓨팅 타입이 혼합되어 쓰일 수 있다. 클라우드 인프라 안에는 많은 전통적 운영 체제가 존재한다.

1.10.6. Real-Time Embedded Systems

임베디드 컴퓨터는 어디에서나 흔히 볼 수 있다. 이에 설치되는 운영 체제는 매우 다양하다. 이는 리눅스같은 범용 운영 체제일 수도 있고 운영 체제 없이 동작하는 애플리케이션 독자적 통합 회로(ASIC) 일 수도 있다. 임베디드 시스템의 사용은 점점 늘어나고 있으며, 이 위에서 동작하는 실시간 운영 체제 또한 그렇다. 이는 잘 정의된, 고정된 시간 제한 내에서 동작이 보장되어야 한다.

1.11. Free and Open-Source Operating Systems

운영 체제에 대한 연구는 무료 운영 체제오픈 소스 운영 체제에 의해 더 쉬워졌다. 반대로 마이크로소프트 윈도우는 클로즈 소스독점적 소프트웨어이다. 바이너리 코드로부터 소스 코드를 생성하는 리버스 엔지니어링은 많은 노력이 드는데, 오픈 소스 운영 체제를 통해 이 노력을 줄일 수 있다. 오픈 소스 코드는 많은 이점이 있다.

1.11.1. History

1950년대에는 소프트웨어는 소스 코드와 같이 출시되었으나, 이후 수익화가 시작되엇다.

1.11.2. Free Operating Systems

소프트웨어 사용과 배포를 제한하는 움직임에 대항하기 위해, GNU 일반 공적 라이선스(GPL)가 등장하였고 프리 소프트웨어 재단(FSF)이 세워졌다.

1.11.3. GNU/Linux

무료, 오픈 소스 운영 체제로는 GNU/Linux가 있다. 이는 여러 개의 다른 배포판이 존재한다. PCLinuxOS 등의 라이브 CD, 라이브 DVD에 올라가는 배포도 있다.

1.11.4. BSD UNIX

BSD UNIX는 리눅스보다 역사가 오래되었다. 이도 여러 배포판이 있다. 이는 git 등의 버전 관리 시스템에 의해 관리된다. macOS는 BSD UNIX에 기반한다.

1.11.5. Solaris

Solaris는 상업적 UNIX 기반 운영 체제이다. 이는 SunOS로부터 유래되었다.

1.11.6. Open-Source Systems as Learning Tools

오픈 소스 운영 체제의 이점은 연구의 도구로 쓰일 수 있다는 점이다. 또한 다양성에 대한 이점도 잇다.

1.12. Summary

  • 운영 체제는 컴퓨터 하드웨어를 관리하는 소프트웨어로, 애플리케이션 프로그램이 실행되는 환경을 제공한다.
  • 인터럽트는 하드웨어가 운영 체제와 상호 작용하는 핵심 방식이다. 하드웨어 디바이스는 CPU에 신호를 보내 인터럽트를 가동시키고 CPU에 특정한 이벤트를 주목하도록 알린다. 이러한 인터럽트는 인터럽트 핸들러에 의해 관리된다.
  • 컴퓨터가 프로그램을 실행하기 위해, 프로그램은 프로세서가 직접 접근할 수 있는 유일한 저장소인 메인 메모리에 올려져야 한다.
  • 메인 메모리는 대개 전원이 꺼지면 내용물이 지워지는 휘발성 저장소이다.
  • 비휘발성 저장소는 메인 메모리의 확장으로 많은 양의 데이터를 영구적으로 저장할 수 있다.
  • 비휘발성 저장소의 흔한 예는 하드 디스크로, 프로그램과 데이터에 대한 저장소를 제공한다.
  • 컴퓨터 시스템의 다양한 저장소 시스템은 속도와 비용 면에서 계층화될 수 있다. 높은 층일수록 비싸고 빠르다. 낮은 층일수록 싸고 느리다.
  • 현대 컴퓨터 아키텍쳐는 각 CPU가 복수의 컴퓨팅 코어를 담고 있는 멀티프로세서 시스템이다.
  • CPU를 잘 활용하기 위해, 현대 운영 체제는 머맅프로그래밍을 사용해 동시에 여러 동자깅 수행될 수 있게 해서 CPU가 놀지 않게 한다.
  • 멀티태스킹은 CPU 스케쥴링 알고리즘이 프로세스간 스위칭을 빠르게 할 수 있는 멀티프로그래밍의 확장이다.
  • 사용자 프로그램이 시스템 동작을 방해하지 않도록, 시스템 하드웨어는 사용자 모드와 커널 모드를 가진다.
  • 여러 명령어는 특전을 받아서 커널 모드에서만 실행될 수 있다. 예를 들면, 커널 모드로 전환하는 명령어, I/O 컨트롤, 타이머 관리, 인터럽트 관리 등.
  • 프로세스는 운영 체제의 기본적 작업의 단위이다. 프로세스 관리는 프로세스를 생성하고 삭제하고 상호간 통신하고 동기화하는 것을 포함한다.
  • 운영 체제는 어떤 메모리가 어떤 프로세스에 의해 사용되고 있는지를 추적함으로써 메모리를 관리하며, 메모리 공간을 동적으로 할당하고 해제하는 것도 관장한다.
  • 저장소 공간은 운영 체제에 의해 관리된다. 이는 파일과 디렉토리를 표현하는 파일 시스템을 제공하고 대용량 디바이스의 공간을 관리한다.
  • 운영 체제는 운영 체제와 사용자를 보호하고 보안하는 메커니즘을 제공한다. 보호는 프로세스나 사용자에 의한, 컴퓨터 시스템에 의해 가용가능한 자원에 대한 접근을 제어한다.
  • 가상화는 컴퓨터의 하드웨어를 여러 다른 실행 환경에 대해 추상화하는 것이다.
  • 리스트, 스택, 큐, 트리, 맵 등의 자료 구조가 운영 체제 내에서 쓰인다.
  • 컴퓨팅은 전통적 컴퓨팅, 모바일 컴퓨팅, 클라이언트-서버 시스템, P2P 시스템, 클라우드 컴퓨팅, 실시간 임베디드 시스템 등 다양한 환경에서 등장한다.
  • 무료 오픈 소스 운영 체제는 소스 코드 형태로 사용 가능하며, 무료로 사용, 재배포, 수정 가능하다. 오픈 소스 운영 체제의 예로 GNU/Linux, FreeBSD, Solaris 등이 있다.

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Google photo

Google의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

%s에 연결하는 중