[OS] Chapter1 - 서론

Chris Kim·2024년 9월 30일

공룡책

목록 보기
1/14

Introduction

운영체제 란 컴퓨터 하드웨어를 관리하는 소프트웨어 다.
현대 컴퓨팅 환경에서 운영체제의 근본적인 책임은 여러 컴퓨터 자원을 프로그램에 할당하는데 있으며, 덩치가 크고 복잡한 운영체제는 이 책임을 완수하기 위해 부분별로 생성되어야 한다.

목표

  1. 컴퓨터 시스템의 일반적인 구성과 인터럽트의 역할을 기술한다.
  2. 현대 다중처리기 컴퓨터 시스템의 구성요소에 관해 기술한다.
  3. 사용자 모드에서 커널 모드로의 전환에 대해 설명한다.
  4. 다양한 컴퓨팅 환경에서 운영체제가 어떻게 사용되는지 논의한다.
  5. 무료 및 공개 소스 운영체제의 예를 제공한다.

1.1 운영체제가 할 일

컴퓨터 시스템은 하드웨어, 운영체제, 응용 프로그램, 사용자, 이 네 가지로 구분할 수 있다. 운영체제는 컴퓨터 시스템에서 그 자체로 유용한 기능을 수행하지는 못한다. 그러나 응용프로그램이 주어진 하드웨어 자원을 유용하게 사용할 수 있는 환경을 제공할 수 있다.

1.1.1 사용자 관점

수많은 사용자들은 랩탑을 사용할 떄, 키보드, 모니터, 마우스 등의 입출력 장비를 통해 랩탑을 조작한다. 이들의 특징은 해당 하드웨어 자원을 사용자가 독점하며, 이는 유저의 사용용이성을 증대시키기 위한 것이다. 때문에 운영체제는 성능에 약간 신경쓰고, 하드웨어와 소프트웨어 자원이 어떻게 공유되느냐의 자원의 이용 에는 전혀 신경을 쓰지 않는다.

1.1.2 시스템 관점

시스템 관점에서 운영체제는 자원 할당자제어 프로그램 의 역할을 수행한다. 전자의 경우, 운영체제는 하드웨어와 소프트웨어 자원에 대한 다양한 요청들을 해결한다. 후자의 경우, 컴퓨터의 부적절한 사용을 방지하기 위한 사용자 프로그램의 수행을 제어한다.

1.1.3 운영체제의 정의

컴퓨팅 시스템의 목표는 프로그램 실행을 통해 사용자 문제를 해결하는데 있다. 그리고 운영체제는 이 목표를 달성하기 위한 환경을 제공한다. 산업과 기술의 발전으로 다양한 문제를 해결하게 되었고 이에 보편적인 운영체제의 정의를 제공하는 것은 쉽지 않다.
하지만 일반적인 정의에 따르면 운영체제는 컴퓨터에서 항상 실행되고 있는 프로그램인 커널 과 우녕ㅇ체제와 관련되어 있지만 반드시 커널의 일부일 필요는 없는 시스템 프로그램 이다.

[+] 미들웨어 : 응용 프로그램 개발자에게 추가서비스를 제공하는 이려련의 소프트웨어 프레임워크

1.2 컴퓨터 시스템의 구성

현대의 범용 컴퓨터 시스템은 하나 이상의 CPU와 구성요소와 공유 메모리 사이의 액세스를 제공하는 공통 버스(컴퓨터 구성요소 간 신호와 정보를 주고받는 경로)를 통해 연결된 여러 장치 컨트롤러로 구성된다. 각 장치 컨트롤러는 로컬 버퍼 저장소와 특수 목적 레지스터 집합을 유지관리한다.
그리고 운영체제에는 각 장치 컨트롤러의 작동을 잘 아는 장치 드라이버가 있다. 이 드라이버들은 메모리 사이클을 두고 CPU와 경쟁한다. 이에 메모리 컨트롤러는 이러한 경쟁을 질서있게 해결하기 위해 액세스를 동기화 한다.

1.2.1 인터럽트(Interrupt)

입출력 작업을 시작할 때, 장치 드라이버는 적절한 레지스터에 값을 적재하고, 장치 컨트롤러는 이 레지스터의 내용을 검사, 수행할 작업을 결정한다. 장치 컨트롤러가 장치에서 로컬 버퍼로 데이터 전송을 시작한다. 이때, 전송이 완료 된 뒤에 장치 컨트롤러는 어떻게 장치 드라이버에게 작업 완료를 알릴까? 바로 인터럽트다.

1.2.1.1 개요

하드웨어는 언제든 CPU에 인터럽트를 발생 시킬 수 있다. CPU가 신호를 받아 인터럽트 되면, 즉시 하고있던 연산을 중단하고 고정된 위치로 이동하여 인터럽트 서비스 루틴을 시작한다. 그리고 루틴을 수행하고 중단되었던 연산을 재개한다.
일반적인 루틴을 호출하기 위해 인터럽트 고유의 핸들러를 호출할 수 있다. 그러나 빈번한 호출을 처리하기 위해 인터럽트 루틴에 대한 포인터들의 테이블을 대신 이용할 수 있다. 이들은 하위 메모리 첫 100개 정도의 위치에 자리 잡는다. 이 경우, 인터럽트가 요청되면 장치의 번호로 색인된 인터럽트 벡터 가 제공된다. 또한, 인터럽트 구조는 인터럽트된 모든 정보를 저장해야 인터럽트를 처리한 후 이 정보를 복원할 수 있다.

1.2.1.2 구현(Implementation)

CPU는 인터럽트 요청 라인 을 통해 인터럽트 신호를 감지, 인터럽트 벡터의 장치 번호를 이용하여 인터럽트 핸들러 루틴 으로 이동한다. 그 후 서비스 루틴을 수행, 그 와중에 인터럽트 처리기는 현재상태를 저장, 원인 확인, 처리, 복원 한다. 그 후 return_from_interrupt 로 CPU를 인터럽트 실행 전 상태로 복귀시킨다.
최신 운영체제는 다음 세 가지 기능을 요구한다.

  1. 중요한 처리 중에 인터럽트 처리를 연기할 수 있어야 한다.
  2. 장치의 적절한 인터럽트 핸들러로 효율적으로 디스패치(CPU의 점유를 넘기는것; 준비상태의 작업을 CPU에 할당하면서 실행상태로 만드는 것) 할 방법이 필요하다.
  3. 운영체제가 우선순위가 높은 인터럽트의 우선순위가 낮은 인터럽트를 구분하고 적절한 긴급도로 대응할 수 있도록 다단계 인터럽트가 필요하다.

이 기능들은 인터럽트 컨트롤러 하드웨어에 의해 제공된다.
대부분의 CPU에는 2개의 인터럽트 요청 라인이 있다. 하나는 마스크 불가능 인터럽트(nonmaskable interrupt) 고 나머지 하나는 마스킹 가능(maskable) 이다. 여기서 mask저지, 즉 막는다 라는 뜻이다.

인터럽트 벡터의 주소보다 장치가 많은 경우, 인터럽트 체인 을 사용한다. 이것은 인터럽트 벡터의 각 원소가 인터럽트 핸들러 리스트의 헤드를 가리키도록 하는 것이다. 이 구조는 큰 크기의 인터럽트 테이블의 오버헤드와 하나의 인터럽트 핸들러로 디스패치 하는 비효율성의 절충안이다.
또한 인터럽트 레벨(interrupt priority level) 을 통해 CPU는 마스킹을 하지 않고도 인터럽트 처리 연기가 가능하다.

요약하자면 인터럽트는 CPU라는 자원을 시시각각 효율적으로 배분하기 위해 사용되는 것이다.

1.2.2 저장장치 구조

CPU는 메모리에서만 명령을 적재할 수 있으므로, 프로그램 실행을 위해서 메모리에 프로그램을 적재해야한다. 이때 사용되는 메모리를 메인메모리(Random Acess Memory; RAM)에서 가져오며 이들은 DRAM(Dynamic random-access memory) 이라는 반도체 기술로 만들어진다.
컴퓨터는 그 밖에도 다양한 메모리를 사용한다. EEPROM, 펌웨어 등이 있다.
메인 메모리는 적재/저장 명령을 통해 레지스터와 메인 메모리간에 내용을 주고받는다. 그 밖에는 CPU는 프로그램 카운터에 저장된 위치부터 실행하기 위해 메인 메모리에서 명령을 자동으로 적재한다.

폰 노이만 구조 시스템 에서 명령-실행 사이클은 다음과 같다. 먼저 메모리에서 명령을 명령 레지스터에 인출하여 저장한다. 그리고 이 레지스터는 피연산자를 메인 메모리에서 꺼내서 내부 레지스터에 저장한다. 연산을 수행하고 그 결과는 메모리에 저장될 수 있다. 이 때, 메모리 장치는 메모리 주소만을 인식한다. 메모리 주소가 어떻게 생성되었는지는 상관없다.

이렇게 메모리에 결과를 저장하려고 해도, 메인 메모리의 용량은 너무 작고 휘발성을 가지고 있다는 문제가 있다. 그래서 대부분의 컴퓨터 시스템은 보조저장장치를 제공한다. 일반적으로 여기에는 하드 디스크 드라이브(HDD), 비휘발성메모리(NVM)장치 가 있다.
그 밖에도 캐시 메모리, CD-ROM, Blu-ray등이 있는데 이들은 3차 저장장치라고 불린다.
여러 저장장치들은 게층구조로 구분될 수 있다. 앞의 4단계는 반도체 메모리로 제작되며, 앞의 3단계는 휘발성 저장장치다.

레지스터-캐시-메인 메모리-비휘발성 메모리-하드 디스크 드라이브-광학 디스크-자기 테이프

1.2.3 입출력 구조

잘 생각해보면 NVS와 같은 비휘발성 메모리에 정보를 저장할 때, 인터럽트방식을 사용하면 굉장히 높은 오버헤드가 발생한다. 그래서 직접 메모리 액세스(DMA) 사 사용된다. 그러면 CPU의 개입없이 메모리와 버처장치간에 데이터 블록 전체를 주고받을 수 있다. 그동안 CPU는 다른 작업을 수행할 수 있다.

1.3 컴퓨터 시스템 구조

1.3.1 단일 처리기 시스템

코어 는 명령을 실행하고 로컬로 데이터를 저장하기 위한 레지스터를 포함하는 구성요소다. 코어를 가진 하나의 메인 CPU는 프로세스의 명령어를 포함하여 범용 명령어 세트를 실행할 수 있다. 그리고 몇 년 전까지 대부분의 컴퓨터 시스템은 단일 처리 코어를 가진 하나의 CPU를 포함하는 단일 프로세서를 사용했다. 이 시스템에는 다른 특수 목적 프로세서도 있다.
이 모든 전용 처리기들은 제한된 명령어 집합을 실행하고 사용자 프로세스를 실행하지는 않는다. 이 처리기들은 운영체제에 의해 관리되기도 하는데, 운영체제는 이 처리기들이 수행할 다음 태스크에 대한 정보를 보내고 처리기들의 상태를 감시한다.
단일 프로세서 시스템은 단일 처리 코어를 가진 범용 CPU가 하나만 있는 경우 시스템은 단일 프로세서 시스템이다. 이 정의에 따르면 현대 컴퓨터 시스템은 단일 프로세서 시스템이 없다.

1.3.2 다중 처리기 시스템

최신 환경에서는 다중 처리기 시스템 이 지배적이다. 일반적으로 각가 단일 코어 CPU가 있는 두개 이상의 프로세서가 있다. 다중 처리기 시스템의 주요 장점은 처리량 증가다. 당연히 프로세서의 수가 증가하니 처리할 수 있는 작업의 수도 증가하는 것이다. 하지만 프로세서 추가와 처리량 증가는 정비례하지 않는다. 그 이유는 프로세서간 협력을 위한 오버헤드가 증가하기 때문이다. 팀플을 한다고 산출물이 언제나 그만큼 훨씬 나아지지 않는 것처럼 말이다.
따라서 협력을 위한 기술이 있다. 그 중 하나가 SMP(symmetric multiprocessing) 이다. 여기에서 각 CPU는 각 레지스터 세트를 가지고 있으나 버스를 통해 메모리를 공유한다. 이 구조를 통해서 N개의 프로세서로 N개의 프로세스를 실행할 수 있다. 하지만 각 CPU가 독립적이므로 하나는 유휴상태에 놓였지만 하나는 과부하 상태에 놓일 수 있다.
다중 처리기 의 정의는 변화해 왔고, 현재는 여러 개의 컴퓨팅 코어가 단일 칩에 상주하는 다중 코어 시스템을 포함한다. 근래 랩탑 등의 CPU가 여러개의 코어를 가지는 것처럼 말이다. 이는 여러 칩을 사용하는 것보다 전력을 적게 소모하므로 효율적이다. 이 때 각 코어는 더 작고 빠른 (L1)캐시와 레지스터 세트로 구성되어 있으며 L2 캐시는 코어들이 공유한다.
당연히 다중 처리기 시스템에 CPU를 추가하면 성능은 향상된다. 그러나 앞서 살펴본 것처럼 경합과 병목현상으로 그렇게 효율적이지 못할 수 있다. 이를 해결하기 위한 방법 하나가 NUMA(non-uniform memory access) 다.
NUMA는 CPU에게 작고 빠른 로컬 버스를 통해 접근가능한 자체 로컬 메모리를 제공한다. 그러나 단점도 있는데, 임의의 CPU가 다른 CPU의 원격 메모리에 접근하려고 하는 경우 지연이 발생 할 수 있다. 하지만 이는 스케줄링과 메모리 관리를 통해 해결이 가능하다.
블레이드 서버 는 다수의 처리기 보드 및 입출력 보드, 네트워킹 보드들이 하나의 섀시(chassis) 안에 장착되는 형태를 가진다.

컴퓨터 시스템 구성요소의 정의
1. CPU : 명령을 실행하는 하드웨어
2. 프로세서 : 하나 이상의 CPU를 포함하는 물리적 칩
3. 코어 - CPU의 기본 계산단위
4. 다중 코어 - 동일한 CPU에 여러 컴퓨팅 코어를 포함함
5. 다중 처리기 - 여러 프로세서를 포함함

1.3.2 클러스터형 시스템

여러 CPU를 가지는 시스템의 다른 유형은 클러스터형 시스템이다. 일반적으로 클러스터 컴퓨터는 저장장치를 공유하고 근거리 통신망이나 InfiniBand와 같은 고속의 상호 연결망으로 연결된다. 이런 시스템에서 하나 이상의 컴퓨터가 고장나더라도 중복된 서비스를 제공할 수 있는 다른 컴퓨터가 대체될 수 있다. 여기에서 남아있는 하드웨어 수준에 비례해서 서비스를 계속 제공하는 기능을 우아한 성능 저하(graceful degaradtion) 이라고 하며, 정상적인 성능 저하를 넘어 단일 구성요소에 오류가 발송해도 계속 작동이 가능하므로 결합허용 시스템이라고 부르기도 한다.
또한 비상용으로 대기시키는 컴퓨터의 유무에 따라 비대칭형 클러스터, 대칭형 클러스터 로 나뉜다. 대칭형 클러스터가 효율적으로 작동하기 위해서는 하나나 이상의 응용 프로그램들이 실행 가능해야 한다.
클러스터형 시스템은 네트워크를 통한 병렬처리가 가능하므로 고성능 계산환경을 제공한다. 이는 SMP 시스템보다 훨씬 큰 계산능력을 제공한다.
그밖에도, 병렬 클러스터와 WAN을 이용한 클러스터링이 있다. 전자의 경우 여러 호스트가 공유 저장장치상의 동일한 데이터에 접근할 수 있게 한다. 이때, 접근 충돌을 제어하고 잠금기법을 제공하기 위해서 분산 잠금 관리자(distributed lock manager; DLM) 이 몇몇 클러스터 기술에 포함되어 있다.
스토리지 전용 네트워크(storage-area network, SAN) 은 뒤에서 살펴보도록 하자.

  • PC마더보드
    이 보드는 슬롯이 채워지면 온전히 작동하는 컴퓨터다. 프로세서 소켓, DRAM 소켓, PCIe 버스 슬롯 및 다양한 입출력 커넥터로 구성된다. 고급 컴퓨터일 수록 둘 이상의 시스템 보드를 허용하여 NUMA 시스템을 형성한다.
  • HADOOP
    HADOOP는 단순하고 저렴한 클러스터형 시스템에서 빅데이터 분산처리에 사용되는 공개 소스 프레임워크다. HADOOP의 특징은 단일 시스템 내에서 수천 개의 컴퓨팅 노드를 포함하는 클러스터로 확장되도록 설계되었다는 점이며, 노드 간 통신을 정렬, 병렬 계산을 관리, 결과를 통합한다. HADOOP는 다음 세 가지 구성요소로 구성된다.
    1. 분산 컴퓨팅 노드에서 데이터와 파일을 관리하는 분산 파일 시스템
    2. YARN(Yet Another Resource Negotiator) 프레임워크는 클러스터 내의 자원을 관리하고 클러스터의 노드에 작업을 스케줄 한다.
    3. MapReduce 시스템은 클러스터의 노드에서 데이터를 병렬 처리할 수 있게 환다.
    HADOOPsms 리눅스 시스템에서 실행되게 설계되었으며, 여러 언어를 사용하여 작성할 수 있다. 일반적으로 JAVA가 널리 사용된다.

1.4 운영체제의 작동

처음에 컴퓨터를 부팅하는 경우 다음과 같은 절차를 거친다. 먼저 하드웨어 내 펌웨어에 저장되어있는 부트스크랩 프로그램 메모리에 적재되어 실행되면서 시스템 전반과 관련된 하드웨어(CPU 레지스터, 메모리등)를 초기화한다. 그리고 펌웨어에서 운영체제 커널을 찾아 메모리에 적재한다. 이후 커널이 실행되고 커널이 실행되는 동안 어떤 서비스는 시스템 데몬이 되기 위해서 커널 외부, 그러니까 시스템 프로그램에 의해 메모리에 적재되어 실행된다. 그 후 수많은 다른 데몬이 실행되고 다른 작업이 시작되길 기다린다. 여기에는 앞서 살펴본 인터럽트, *트랩(혹은 예외) 이 있으며, 사용자 프로그램의 특정 요청으로 인한 트랩의 경우, 시스템 콜 이라는 특수 연산을 실행하여 요청된다.

1.4.1 다중 프로그래밍과 다중 태스킹

일반적으로 프로그램 하나만으로 CPU의 성능을 전부 차지 하지는 않는다. 심지어 사용자들은 동시에 복수의 프로그램을 실행하기를 원한다. 여기서 CPU가 최소 하나의 프로그램을 실행시켜 CPU이용률을 높이는 것을 다중 프로그래밍 이라고 하고, 다중 프로그램 시스템에서 실행 중인 프로그램을 프로세스라고 한다. 하지만 정말로 동시에 실행하는 것은 아니고 CPU가 프로세스를 전환하면서 다중 프로그램을 실행하는 것이다. 즉 프로세스는 대기하기도 한다. 다중 태스킹은 다중 프로그래밍을 논리적으로 확장한 것이다. 앞에서 말한 전환이 자주 발생하면 그만큼 사용자에게 빠른 응답시간이 제공된다. 그만큼 CPU가 바쁘게 일하는 것이다. 예를들어, 인간의 타이핑 속도는 컴퓨터에 비하면 한참 느리다. CPU는 그걸 다 기다려주지 않는다. CPU 스케줄링(뒤에서 배울 것임)을 통해 실행할 프로세스를 결정한다. 그밖에도 빠른 응답시간을 제공하기 위해 가상 메모리를 활용하기도 한다.

1.4.2 이중-모드와 다중모드의 운용

앞서서 운영체제를 사용자 관점과, 시스템 관점에서 바라보았다. 실제로 운영체제와 사용자는 관계가 밀접하고 자원을 공유한다. 떄문에 적절하지 못한 프로그램은 잘못된 프로그램, 혹은 운영체제의 잘못된 작동을 일으킨다.
이를 위해 대부분의 운영체제는 커널 모드(모드 비트:0)와 사용자 모드(모드 비트:1)을 운용한다. 사용자 모드에서 프로그램이 시스템 콜을 통해 운영체제의 서비스를 요청하는 경우, 인터럽트가 발생하고 인터럽트 벡터의 특정위치로 트랩을 건다. 이때 trap 혹은 syscall이라는 특정 명령어를 가진다. 그 후 비트 모드가 1에서 0으로 전환되고 서비스 루틴이 수행된다. 그 후 시스템콜 다음 명령으로 복귀한다. 이때 다시 사용자 모드로 전환된다. 만약 적절하지 못한 명령이 실행되는 경우 운영체제는 트랩을 건다.
이중-모드는 확장되어 사용되기도 한다. Intel은 4개의 보호 링을 활용한다. 그밖에도 ARMv8에서는 모드가 7가지나 있다. 가상화를 지원하는 CPU는 VMM(Virtual machine manager) 이 시스템을 제어하는 시점을 표시하기 위한 별도의 모드를 가진다.
우리에게 악영향을 미칠 수 있는 명령의 경우 특권 명령 으로 분류되어 관리된다. 하드웨어는 이 특권 명령이 커널 모드에서만 수행되도록 한다. 만약 사용자 모드에서 특권명령을 시도하면, 불법적인 명령으로 간주하고 운영체제로 트랩을 건다.
하드웨어 보호기 기능이 제공되는 경우 모드 규칙을 위반하는 경우에, 오류가 발생한다. 이때 비정상적으로 프로그램은 종료되고, 오류메시지가 주어지며, 프로그램의 메모리가 덤프된다.(이 메모리 덤프는 통상 파일에 기록된다.)

1.4.3 타이머

CPU는 언제나 운영체제 아래에 있어야 한다. 즉 무한루프나 시스템 서비스 호출에 실패하는 경우 CPU가 운영체제하의 제어로 돌아오지 않을 수 있다.
이를 방지하기 위해 운영체제는 타이머를 사용한다. 비유하자면, CPU가 집을 나가면 타이머로 복귀시간을 재는 것이다. 시간이 지나면 강제로 CPU를 끌고 들어온다. 당연히 타이머를 변경하는 것은 특권 명령 이다.

1.5 자원 관리

1.5.1 프로세스 관리

프로그램은 보조저장장치에 저장된 수동적인 객체다. 하지만 프로세스는 메모리에 적재되어 현재 실행되고 있는 프로그램이며, 프로그램 카운터를 통해 CPU가 수행할 명령을 지시하는 능동적인 주체다. 프로세스의 실행 주기에는 CPU 시간, 메모리, 파일, 입출력 장칟등의 자원을 필요로 하며, 자료의 초기화도 포함된다. 한 프로ㅓ세스는 한 시스템 내의 작업의 단위다. 이러한 시스템은 프로세스의 집합으로 구성되며, 일부는 운영체제 프로세스 들이고 나머지는 사용자 프로세스들이다. 이들은 CPU 코어에서 멀티플렉싱하거나 병렬로 수행하게 할 수 있다.

  • 프로세스와 관련된 운영체제의 책임
  1. 사용자 프로세스와 시스템 플호세스의 생성과 제거
  2. CPU에 프로세스와 스레드 스케줄하기
  3. 프로세스의 일시 중지와 재수행
  4. 프로세스 동기화를 위한 기법 제공
  5. 프로세스 통신을 위한 기반제공

1.5.2 메모리 관리

폰 노이만 방식 컴퓨터에서는 CPU가 명령어 인출 사이클 동안 메인 메모리로부터 명령어를 읽고, 자료 인출 사이클 동안 메인 메모리로부터 데이터를 읽고 또한 쓴다. 프로그램을 실행하기 위해 절대주소를 매핑하고 프로그램을 메모리에 적재한다. 프로그램 종료시 해당 메모리 공간은 가용선언된다. CPU 이용률과 응답속도 개선을 위해 메모리에는 여러 개의 프로그램이 유지되어야 한다. 따라서 메모리 관리가 필수적이다. 운영체제는 메모리 관리와 관련하여 다음과 같은 일을 담당한다.

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

1.5.3 파일 시스템 관리

컴퓨터 시스템의 편리한 사용을 위해, 운영체제는 정보 저장장치에 대한 균일한 논리적 관점을 제공한다. 운영체제는 저장장치의 물리적 특성을 추상화하여 논리적인 저장 단위인 파일을 정의한다. 운영체제는 파일을 무릴적 매체로 매핑하며, 저장장치를 통해 이들 파일에 접근한다. 파일은 파일 생성자에 의해 정의된 관련 정보의 집합체다.
운영체제는 대량 저장 매체와 그것을 제어하는 장치를 관리함으로써 파일의 추상적인 개념을 구현한다. 또한, 파일은 디렉토리로 구성된다. 그리고 파일의 접근권한도 관리한다.

  • 파일 시스템 관리와 관련된 운영체제의 책임
  1. 파일의 생성과 제거
  2. 디렉터리 생성 및 제거
  3. 파일 디렉터리를 조잦ㄱ하기 위한 프리미티브의 제공
  4. 파일을 보조저장장치로 매핑
  5. 안정적인(비휘발성) 저장 매체에 파일을 백업

1.5.4 대용량 저장장치 관리

  • 보조저장장치 관리와 관련된 운영체제의 책임
  1. 마운팅과 언마운팅
  2. 사용 가능 공간의 관리
  3. 저장장소 할당
  4. 디스크 스케줄링
  5. 저장장치 분할
  6. 보호

1.5.5 캐시 관리

CPU는 메인 메모리로 부터 명령을 인출하여 수행한다. 그러나 이는 명령 인출 사이클을 몇사이클이나 기다려야 할 수 있게 만든다. 이는 성능을 저하시킨다. 고로 고속 메모리인 캐시를 활용한다. 만약 캐시에 정보가 있다면 CPU는 캐시로부터 더 빠르게 정보를 가져올 수 있다.
따라서 캐시 관리는 중요하다고 할 수 있다. 하지만 여기서 하드웨어만으로 구성된 캐시는 운영체제로 제어할 수 없으므로 관심을 두지 않을 것이다.
특히 다수의 프로세스에서 하나의 자료에 접근할 때 굉장히 중요하다. 예를 들어 보조저장장치에 기록된 자료를 수정하기 위해 메인메모리에 복사하고, 캐시에 복사하고, 레지스터에 복사한다 치자. 레지스터에서 수정된 직후에는 자료가 복수의 저장장치에 존재하고 모두가 값이 같지가 않다.(물론 단일 프로세스는 문제가 없다 이들은 최상위 계층을 우선적으로 참고한다.) 다중처리기 환경에서 각 로컬캐시에 자료가 복사되고, 하나에서만 수정이 이뤄진 경우에 각 프로세스가 동일한 자료에 접근하려고 하는 경우 일관성에서 문제된다. 마찬가지로 분산환경에서는 문제가 더욱 복잡해진다.

1.5.6 입출력 시스템 관리

운영체제의 목적 중 하나는 사용자에게 ㅣ특정 하드웨어 장치의 특성을 숨기는 것이다. 예를 들면, UNIX에서 입출력 장치의 특성은 입출력 서브시스템 에 의해 운영체제 자체의 대부분으로부터 숨겨져 있다.

  • 입출력 시스템의 구성
  1. 버퍼링, 캐싱, 스풀링을 포함한 메모리 관리 구성요소
  2. 일반적인 장치 드라이버 인터페이스
  3. 특정 하드웨어 장치들을 위한 드라이버

1.6 보안과 보호

컴퓨토 시스템이 다수의 사용자를 거치며 다수 프로세스의 병렬 수행을 허용하는 경우에 데이터에 대한 접근은 반드시 규제되어야 한다. 보호 란 컴퓨터 시스템이 정의한 자원에 대해 프로그램, 프로세스, 또는 사용자들의 접근을 제어하는 기법이다.
컴퓨터 시스템은 충분한 보호 기능이 있더라도 여전히 고장이나 부적절한 접근을 허용할 수 있다. 인증정보의 도난이 그 예다. 이러한 외부 또는 내부의 공격을 방어하는 것이 보안 기능이다.
보호와 보안 기능을 제공하기 위해서, 운영체제는 사용자를 구분해야한다. 따라서 운영체제는 사용자 이름과 관련된 사용자 식별자(user IDs) 의 리스트를 유지한다. Windows 용어로는 보안 식별자(security ID, SID) 라고 한다. 그 밖에도 UNIX 시스템에서는 그룹 식별자 를 사용하기도 한다. 다만 가끔 권한을 상승시킬 필요가 있다. UNIX 시스템에서 setuid 속성을 활용하여 파일 소유주 권한으로 파일을 실행하는 것이 대표적인 예시다. 프로세스는 종료되거나 특권을 해제하기 전까지 유효 사용자 식별자(effective user ID) 를 이용하여 수행된다.

1.7 가상화

가상화 는 단일 컴퓨터의 하드웨어를 여러 가지 실행 환경으로 추상화하여 개별 환경이 자신만의 컴퓨터에서 실행되고 있다는 환상을 만들 수 있는 기술이다. 가상화는 운영체제가 다른 운영체제 내에서 하나의 응용처럼 수행될 수 있게 한다. 넓게 말하면 가상화 소프트웨어는 에뮬레이션을 포함하는 클래스의 구성원이다. 하지만 에뮬레이션은 비용이 너무나 크다. 그래서 가상화는 특정 CPU를 위해 컴파일된 운영체제가 동일 CPU용의 다른 운영체제 내에서 수행된다.
VMware는 이를 활용해서 Windows상에서 수행되는 응용의 형태로 새로운 가상화 기술을 만들었다. 이 응용은 게스트라고 불리는 하나 이상의 Windows나 다른 x86용 운영체제 복사본들을 수행하고, 각 게스트는 자신의 응용을 수행한다. 여기서 Windows는 호스트 운영체제고, VMware 응용은 가상 머신 관리자(VMM) 이다.

1.8 분산 시스템

분산시스템이란 물리적으로 떨어져 있는 이기종 컴퓨터들의 집합이다. 분산 시스템의 컴퓨터들은 사용자가 시스템 내의 다양한 자원들을 접근할 수 있도록 네트워크로 연결되어 있다. 네트워크는 가장 단순하게 보면 두 개 이상 시스템 간의 통신 경로이다. 분산 시스템의 많은 기능은 네트워킹에 의존하고 있다.
네트워크는 노드 간의 거리에 의해 유형이 결정된다. 근거리 통신망(LAN) 은 한 방, 한 층, 또는 한 건물에 존재한다. 광역 통신망(WAN) 은 통산 건물, 도시 또는 국가 사이를 연결한다. 그 밖에도 기술 개발에 따라 도시권 통신망(MAN) , 단거리 통신망(PAN) 등이 등장하고 있다.
일부 운영체제는 네트워크 연결 제공 개념을 넘어서서 네트워크 및 분산 시스템 개념을 취했다. 네트워크 운영체제 는 다른 컴퓨터의 다른 프로세스가 메시지를 교환할 수 있도록 하는 통신 체계와 함께 네트워크를 통한 파일 공유와 같은 기능을 제공하는 운영체제다.

1.9 커널 자료구조

1.9.1 리스트, 스택 및 큐

배열은 우리에게 아주 익숙한 자료구조다. 하지만 배열 중간의 원소가 변하거나, 사라지거나, 추가되는 경우에는 다른 자료구조를 사용해야한다.
배열에 이어 리스트는 가장 기본적인 자료구조다.배열의 각 항은 접근 할 수 있으나 리스트는 특정 순서대로 접근해야 한다. 즉 리스트는 데이터 값들의 집단을 하나의 시퀸스로 표시한다. 이를 잘 나타내는 것이 연결 리스트(Linked list) 다. 단일 연결 리스트의 각 항은 후속항을 가리키며, 이중 연결 리스트는 앞항이나 후속항을 가리킨다. 원형 연결리스트에서는 각 항이 후속항을 가리키나, 마지막 항은 null이 아니라 맨 앞 항을 가리킨다.
스택(stack) 은 후입선출(LIFO)의 자료구조를 가지며, 푸쉬와 팝을 통해 항을 입출력한다. 운영체제는 함수를 호출하는 경우 인수, 로컬 변수 및 복귀 주소등이 스택에 푸쉬되고 복귀할 떄 이들을 스택으로부터 팝한다.
큐(que) 는 FIFO의 자료구조를 가지고 있다. 일반적으로 CPU의 수행을 기다리는 태스크 들은 큐로 구성된다.

1.9.2 트리

트리(trees) 는 데이터의 서열을 표시하는데 사용 가능한 자료구조다. 트리 구조에서 데이터 들은 부모-자식 관계를 가진다. 일반적으로 부모는 임의의 수의 자식을 가지지만, 이진 트리 에선 두 개의 자식까지 가질 수 있으며, 이진 탐색 트리 에서는 좌측 자식이 우측 자식보다 값이 작거나 같아야 한다. 최악의 경우 시간복잡도는 O(n) 이다. 이를 방지하기 위한 균형 이진 탐색 트리는 최악의 경우 O(lg n) 을 가진다. 이 알고리즘은 리눅스가 CPU 스케줄링의 알고리즘 일부로 채용했다.

1.9.3 해시 함수와 맵

해시 함수 는 데이터를 입력으로 받아 이 데이터에 산술 연산을 수행하여 하나의 수를 반환한다. 그 데이터를 반환하기 위해 테이블의 인덱스로 사용될 수 있다. 해시함수는 서로 다른 입력값이 같은 출력값을 내보낼 수 있다. 이 경우 충돌 이 일어난다고 말하며, 해시 함수는 매우 취약해진다. 해시함수는 해시 맵을 구현한다.

1.9.4 비트맵

비트맵 은 n개의 항의 상태를 나타내는 데 사용 가능한 n개의 이진 비트의 스트링이다. 이는 자료의 가용성을 나타낼 떄, 매우 효과적이다.

  • Linux 커널 자료 구조
    리눅스 커널에서 사용되는 자료구조는 커널 소스 코드에서 확인할 수 있다. Include 파일 <linux/list.h>는 커널 전체에서 사용되는 연결 리스트 자료구조의 세부 사항을 제공한다. 리눅스에서 큐는 kfifo라고 하며, 구현은 소스 코드의 kernel 디렉터리에 있는 kfifo.c 파일에서 찾을 수 있다. 리눅스는 또한 redblack 트리를 사용하여 균형 이진 탐색 트리를 제공한다.

1.10 계산환경

1.10.1 전통적 계산

전통적인 계산 환경이란, 예를들어 네트워크에 연결된 PC들과 파일과 프린트 서비스를 제공하는 서버들로 구성되어 있으며, 원격 접근이 흔하지 않던 환경을 말할 수 있겠다.
하지만 현대에 들어서 포털(Portal)과 네트워크 컴퓨터를 통해 전통적인 계산의 경계를 확장하고 있다. 모뎀 통신으로 전화비 폭탄 테러를 당하던 시대는 저물었으며, 고속 연결이 일상화 되었다. 이런 고속연결은 홈 계산환경을 보호하기 위한 방화벽(Firewall) 을 등장시켰다.
과거에는 계산자원이 귀했기에 배치, 대화형 방식의 시스템이 흔했으며, 시분할 시스템을 위한 타이머와 스케줄링 알고리즘이 사용되었다. 하지만 이런 전통적인 시분할 시스템은 희귀해졌다.

1.10.2 모바일 컴퓨팅

모바일 컴퓨팅은 휴대용 스마트폰과 태블릿 컴퓨터의 컴퓨팅 환경을 말한다. 과거 기술 초창기에는 이들의 기능이 제한되었으나, 랩탑 컴퓨터의 실용성 떨어지는 기능조차 모바일 컴퓨팅 환경에서는 허용되기도 한다.
온라인 서비스 접근을 허용하기 위해 휴대장치는 전형적으로 IEEE 표준 802.11 무선 또는 휴대 전화 데이터망을 사용한다. 하지만 하드웨어 환경은 일반적인 랩탑보다 더 제한적이다. 따라서 이들의 처리기는 더 작고 느리며, 더 적은 수의 코어를 가진다.
현재 휴대 컴퓨팅에서 두 개의 지배적인 운영체제는 Apple iOS와 Google Android다.

1.10.3 클라이언트 서버 컴퓨팅

현대 네트워크 구조는 서버 시스템이 클라이언트 시스템이 생성한 요청을 만족시키는 매치를 특징으로 한다. 서버 시스템은 다음과 같이 두 개로 분류된다.

이름내용
계산-서버 시스템클라이언트가 어떤 작업을 요청할 수 있는 인터페이스를 제공한다.
파일-서버 시스템클라이언트가 파일을 생성, 갱신, 읽기 및 제거 할 수 있는 파일 시스템 인터페이스를 제공한다.

1.10.4 피어 간 계산

분산 시스템의 또 다른 예로 P2P를 들 수 있다. 이 시스템이서는 서버와 클라이언트의 역할이 고정되어 있지 않은 것이 특징이다. 즉 요청을 보내고 받느냐에 따라 그 역할이 그때마다 달라진다. 클라이언트 서버 시스템에서는 병목현상이 문제될 수 있으나, P2P에서는 이를 분산된 노드에 나누어서 해결 할 수 있다. 피어 간 네트워크에 참여한 노드가 제공 가능한 서비스를 결정하는 방법은 다음과 같다.

(1) 노드가 네트워크에 참가할 떄 중앙 검색 서비스에 자신이 제공하는 서비스를 등록한다. 서비스를 요청하려는 노드는 중앙 검색 서비스에서 서비스 가능한 노드를 찾는다. 그 외 통신은 클라이언트와 서비스 제공자 사이에서만 이뤄진다.
(2) 아니면 네트워크 상의 모든 노드들에게 서비스 요청 메시지를 보내는 방법이 있다. 이 경우 응답 메시지를 받기 위해 발견 프로토콜이 있어야 한다.

1.10.5 클라우드 컴퓨팅

클라우드 컴퓨팅은 계산, 저장장치는 물론 응용조차도 네트워크를 통한 서비스를 제공하는 계산 유형이다. 클라우드 컴퓨팅 유형의 예는 다음과 같다.

이름내용
공중 클라우드서비스를 위해 지불 가능한 사람은 누구나 인터넷을 통해 사용 가능한 클라우드
사유 클라우드한 회사가 사용하기 위해 운영하는 클라우드
혼합형 클라우드공공과 사유 부분을 모두 포함하는 클라우드
소프트웨어 서비스(software as a service)인터넷을 통해 사용가능한 하나 이상의 응용
플랫폼 서비스(platform as a service)인터넷을 통해 사용하도록 응용에 맞게 준비된 소프트웨어 스택
하부구조 서비스(infrastructure as a service)인터넷을 통해 사용 가능한 서버나 저장장치

하지만 이들이 서로 독립적인 것은 아니고 서로 혼합되어 제공되기도 한다.

1.10.6 실시간 내장형 시스템

자동차 엔진, 오븐, 공장용 로봇의 광학 드라이브 등 일상 곳곳에서 찾아볼 수 있다. 이런 내장형 시스템은 거의 언제나 실시간 운영체제를 수행한다. 실시간 시스템은 처리기의 작동이나 데이터의 흐름에 엄격한 시간 제약이 있을 때 사용된다. 즉 실시간 시스템은 정해진 시간 제약 내에 올바른 결과를 돌려줄 수 있을 때에만 정확히 동작하는 것으로 간주된다.

profile
회계+IT=???

0개의 댓글