[OS] Operating System Overview

impala·2023년 3월 3일
0

[CS] Operating System

목록 보기
2/4

2. 운영체제 개요

본격적으로 운영체제의 각 기능에 대해 알아보기 전에, 운영체제 전반에 걸친 역사와 특징등을 정리한다.

2.1 운영체제의 목적과 기능

운영체제란 응용프로그램의 수행을 제어하고 응용프로그램과 컴퓨터 하드웨어 사이의 인터페이스 역할을 하는 프로그램이다. 운영체제의 목적은 사용자가 컴퓨터를 편리하게 사용할 수 있도록 하고, 컴퓨터 시스템 자원을 효율적으로 관리해주며, 추후 기술의 발전에 따라 운영체제 또한 발전하도록 구축되어야 하는 것이다.

운영체제의 목적 1 - 사용자/컴퓨터 인터페이스

컴퓨터의 최종 사용자는 응용프로그램으로 볼 수 있는데, 이들은 프로그래머들에 의해 개발된다. 하지만 프로그래머들이 하드웨어를 직접 제어하는 방식으로 개발한다면 작업의 난이도가 매우 높아진다. 따라서 입출력 처리나 파일 관리 등 하드웨어 레벨의 작업을 처리해주는 시스템 프로그램(라이브러리, 유틸리티)들이 프로그래머들에게 제공되는데, 이런 시스템 프로그램의 집합이 바로 운영체제이다. 즉, 운영체제는 프로그래머와 응용프로그램이 시스템을 편리하게 사용할 수 있도록 서비스에 대한 인터페이스를 제공하는 프로그램이다.

일반적으로 운영체제가 제공하는 서비스들은 다음과 같다.

  • 프로그램 개발 : 응용프로그램의 개발을 용이하게 해주는 유틸리티 프로그램. 문서 편집기, 디버거 등
  • 프로그램 실행 : 프로그램이 실행되기 위해 자원을 스케줄링하고 명령어와 데이터를 메모리에 적재하여 프로세서에서 실행하는 일련의 과정
  • I/O장치 접근 : 세부사항을 감추어 사용자가 편리하게 입출력장치를 사용할 수 있도록 일관된 인터페이스 제공
  • 파일 접근 제어 : 파일을 제어하기 위해 파일형식에 대한 정보를 수집, 접근을 제어
  • 시스템 접근 : 사용자의 권한에 따라 시스템 전체 및 특정 자원에 대한 접근을 제어
  • 에러 발견 및 응답 : 각종 하드웨어 및 소프트웨어 에러 발생 시 수행중인 프로그램에 영향을 최소화하도록 에러를 제거하거나 처리함
  • 어카운팅 : 여러가지 자원에 대한 사용통계를 수집하고 모니터링함
  • Instruction Set Architecture(ISA) : 하드웨어와 소프트웨어의 경계로 컴퓨터가 따르고 있는 기계 명령어 집합규정을 제공
  • Application Binary Interface(ABI) : 서로 다른 기계상의 프로그램이나, 서로 다른 컴파일러에 의해 만들어진 바이너리 파일 간 호환성을 지원하기 위한 표준 인터페이스
  • Application Programming Interface(API) : 프로그램의 사용자들이 ISA를 통해 하드웨어의 자원과 서비스에 접근할 수 있도록 제공되는 인터페이스

운영체제의 목적 2 - 자원 관리자

컴퓨터란 데이터의 이동, 저장, 처리, 제어에 필요한 자원들의 집합으로, 운영체제는 이러한 자원들을 관리함으로써 컴퓨터의 기본 기능들을 제어한다. 운영체제 또한 하나의 프로그램이기 때문에 프로세서에게 명령어를 전달하고 제어를 양도해야 실행될 수 있지만, 일반 프로그램들과는 달리 다른 프로그램에게 시스템 자원을 사용할 것을 명령하여 프로그램의 수행시점을 결정한다. 즉, 운영체제는 다른 프로그램에게 자원을 분배하는 하나의 프로그램으로 간주할 수 있다.

운영체제가 관리하는 시스템 자원에는 프로세서, 메모리, I/O장치가 있다. 이중 메모리에는 운영체제의 주요 기능의 집합인 커널이 적재되어 있고, 나머지 공간에 사용자 프로그램과 데이터가 적재되어 프로세서에 의해 수행된다.

운영체제의 목적 3 - 발전성

운영체제는 새로운 하드웨어, 새로운 서비스, 버그등의 요인에 의해 정기적으로 발전되어야 한다. 이러한 요구를 만족할 수 있도록 운영체제는 모듈화 되어 각각의 기능을 하나의 모듈로 분리하고 명확한 인터페이스와 문서로 제공되어야 한다. 또한 운영체제가 점점 거대해짐에 따라 구조적인 모듈화가 필요하다.

2.2 운영체제의 발전

순차 처리(Serial Programming)

운영체제가 없는 초창기 컴퓨터는 프로그래머가 하드웨어를 직접 다루는 방식으로 사용되었다. 이 당시 컴퓨터는 카드 리더기를 통해 프로그램을 수행하다가 에러가 발생하면 프로그램이 멈추고, 그렇지 않으면 프린터에 결과가 출력되었다.

순차처리 시스템이 가지고 있던 문제는 다음과 같다.

  • 스케줄링 : 기계에 소프트웨어를 설치하고 실행하기 위해 사용시간을 예약해야 했는데, 예약한 시간보다 작업이 일찍 끝나거나 늦게 끝나는 경우 여러 문제가 발생했다.
  • 준비 시간 : 프로그램을 수행하기 위해 로드, 컴파일, 링크 등 여러 준비작업이 필요했다.

시간이 지남에 따라 효율적인 순차처리를 위해 링커, 로더, 디버거, 입출력 드라이버 루틴 등 여러 도구가 개발되었다.

단순 배치 시스템(Simple Batch System)

초창기 컴퓨터는 매우 고가였기 때문에 컴퓨터의 이용률을 극대화하기 위해 배치시스템이 개발되었다. 배치 시스템의 주요 아이디어는 모니터(초기 운영체제)라는 소프트웨어를 사용하여 사용자가 컴퓨터에게 직접 명령을 내리지 않고, 수행해야 할 작업묶음(Batch)을 입력하면 모니터가 자동으로 프로그램을 순차적으로 실행시키는 것이다. 이때, 모니터는 작업을 제어하기 위해 항상 주기억장치에 적재되어야 한다.

단순 배치 시스템의 동작은 다음과 같다. 먼저 메모리에 상주하는 모니터에 의해 프로그램의 명령이 로드되면 제어가 프로그램으로 넘어가고, 프로그램의 수행이 끝나면 제어가 모니터로 넘어와 다음 프로그램을 로드하게 된다. 이를 통해 모니터는 스케줄링 문제를 해결하고 작업 준비시간을 낭비하지 않게 해주었다. 이 과정에서 모니터는 작업 제어 언어(Job Control Language : JCL)이라는 특수한 언어를 사용하여 명령을 전달한다.

모니터를 도입하기 위해서는 다음과 같은 하드웨어의 기능이 필요하다.

  • 메모리 보호 : 사용자 프로그램은 모니터가 상주하는 메모리 영역을 변경해서는 안된다.
  • 타이머 : 단일 작업이 시스템을 독점하는 것을 방지한다.
  • priviliged instruction : 모니터만 사용할수 있는 명령어를 제공한다.
  • 인터럽트 : 사용자 프로그램과 제어를 주고받기 위해 사용된다.

이 중, 메모리보호와 priviliged instruction의 도입으로 동작모드라는 개념이 등장했다. 동작모드는 사용자모드와 커널모드로 구분된다. 사용자 프로그램은 사용자 모드에서 수행되고 특정 메모리영역에 접근할 수 없으며 특정 명령어를 사용할 수 없다. 반면 모니터는 커널모드에서 동작하고 모든 명령어가 사용가능하며, 모든 메모리 영역에 접근이 가능하다.

배치 시스템의 도입으로 컴퓨터의 이용률은 증가하였지만, 사용자 프로그램과 모니터가 번갈아 수행되기 때문에 메모리의 일부를 모니터가 점유하고 모니터가 프로세서를 주기적으로 사용하는 등의 오버헤드가 발생했다.

멀티 프로그래밍 배치 시스템(Multiprogrammed Batch System)

단순 배치 시스템은 한번에 하나의 프로그램만을 수행하는 단일 프로그래밍 환경을 지원하기 때문에 입출력 작업같이 느린 작업이 프로그램에 포함된다면 입출력 작업이 진행되는 동안 프로세서는 idle상태로 유지된다. 결국 입출력 작업에 소모되는 시간만큼 프로세서가 낭비되기 때문에 효율적인 프로세서의 사용을 위해서 멀티프로그래밍, 멀티태스킹 환경이 등장하게 되었다.

멀티프로그래밍 환경이란 동시에 여러개의 프로그램을 실행시키는 방법으로, 한 프로그램이 입출력 작업등에 의해 대기상태에 있으면 다른 프로그램을 메모리에 올려 수행하는 것을 말한다.

멀티프로그래밍 배치시스템을 도입하기 위해서는 다음과 같은 하드웨어의 기능이 필요하다.

  • 입출력 인터럽트 및 DMA : 입출력 작업을 수행하는 동안 프로세서에서 다른 작업 수행 가능

멀티 프로그래밍 환경의 운영체제는 다수의 작업이 메모리상에 올라와있기 때문에 메모리를 관리해야 하고, 프로세서가 어떤 작업을 수행해야할 지 결정하기 위해 스케줄링 알고리즘이 필요하다.

시분할 시스템(Time-sharing System)

멀티프로그래밍 배치 시스템을 통해 프로그램의 병렬화가 가능해졌지만, 대부분의 프로그램은 사용자와 컴퓨터가 직접 상호작용하는 interactive mode가 필요하다. 이를 위해 다수의 사용자에게 짧은 시간동안 프로그램이 번갈아가며 수행될수 있도록 하는 시분할 시스템이 등장하였다.

시분할 시스템에서는 여러 사용자가 동시에 터미널을 사용하여 시스템에 접근하는데, 일반적으로 사용자의 반응시간은 컴퓨터의 속도에 비해 매우 느리기 때문에 각 프로그램을 매우 짧은시간동안 번갈아가며 수행하여 각각의 사용자는 컴퓨터를 독점적으로 사용하는 것처럼 느낄 수 있도록 한다. 프로그램이 번갈아 수행되기 위해서 컴퓨터는 아주 짧은 시간마다 인터럽트를 발생시켜 운영체제에게 제어를 넘기고 다음 프로그램을 실행한다.

멀티프로그래밍과 시분할 시스템은 병렬처리라는 부분에서 유사하다. 하지만 멀티프로그래밍은 프로세서 이용률의 최대화를 목적으로 JCL을 처리하는데 반해, 시분할 시스템의 경우 사용자 응답시간을 최소화시키기 위해 터미널에서 입력되는 명령어를 처리한다는 차이가 있다.

2.3 운영체제의 주요 발전 내용

운영체제의 발전과정에서 이루어진 4가지 주요 이론적 진전은 다음과 같다.

프로세스

프로세스란 job보다 일반적인 개념으로 수행중인 프로그램 및 인스턴스, 프로세서에 의해 수행될 수 있는 엔티티등으로 정의할 수 있다.

컴퓨터의 등장 이후 컴퓨터 시스템은 크게 멀티프로그래밍, 시분할, 실시간 트랜잭션 3가지 계열로 발전해왔다. 이렇게 다양한 작업을 일관되게 처리하기 위한 운영체제를 만드는 것은 매우 어려운 작업이었고, 각 프로그램의 처리 순서에 따라 여러가지 이유로 오류가 발생하게 되었다. 오류의 원인은 크게 4가지로 나눌 수 있다.

  • 부적절한 동기화 : 프로그램 수행이 보류된 상태에서 잘못 동기화를 하면 신호가 분실되거나 중복될 수 있음
  • 상호배제 실패 : 다수의 사용자가 동시에 공유자원에 접근하는 경우
  • 비결정적인 프로그램 연산 : 여러 프로그램이 동일한 메모리 주소에 예측불가능하게 데이터를 덮어쓰는 경우
  • 교착상태 : 두개 이상의 프로그램이 서로가 가진 리소스를 기다리는 경우

이러한 문제들을 해결하기 위해서는 프로세서 상에서 수행중인 다양한 프로그램을 감시하고 제어하는 체계적인 방법이 필요했는데, 그 결과 프로세스라는 개념이 등장하게 되었다. 프로세스의 구성요소는 다음과 같다

  • 수행가능한 프로그램
  • 프로그램 수행에 필요한 데이터(변수, 작업공간, 버퍼 등)
  • 프로그램 수행 문맥(Context)

이중 Context는 프로세스에게 필수적인 것으로 운영체제가 프로세스를 관리하고 제어하기 위핸 내부적인 데이터로 PC나 데이터 레지스터등 프로세스의 상태가 포함된다.

운영체제는 각 프로세스에 메모리 블록을 할당하고 해당 블록의 위치를 프로세스 리스트라는 별도의 메모리공간에 저장하여 관리한다. 프로세스가 실행되면 프로세서의 레지스터에 프로세스의 context가 동기화되어 작업을 수행하고 다음 프로세스로 제어가 넘어갈 때 레지스터의 내용을 context에 보관한다. 프로세서의 레지스터 중에서 base와 limit는 각각 프로세스의 시작주소와 크기를 담고 있어 각 프로세스가 다른 프로세스의 영역을 침범하지 못하도록 제한한다.

메모리 관리

사용자는 모듈식 프로그래밍과 유연한 데이터 사용을 원하고, 시스템 관리자는 메모리에 대한 효율적이고 체계적인 제어를 원한다. 이를 위해 메모리를 관리하는 주체인 운영체제는 아래 5가지 기능을 가져야 한다.

  • 프로세스 분리 : 관계없는 프로세스들이 서로의 영역에 침법하지 못하도록 막아야 한다
  • 자원 할당 및 관리 : 메모리 영역은 자동으로 동적으로 할당되어야 한다
  • 모듈식 프로그래밍 지원 : 프로그램을 모듈화할 수 있어야 한다
  • 보호 및 접근제어 : 공유 메모리를 보호하면서 사용자가 다양한 방법으로 다양한 메모리에 접근할 수 있도록 해야 한다
  • 장기 저장 : 컴퓨터의 전원이 꺼진 후에도 데이터가 저장되어야 한다

운영체제는 파일시스템과 가상메모리 기법으로 위의 요구사항을 해결한다.
파일시스템이란 장기저장소에 파일이라는 객체를 통해 데이터를 저장하는 방법을 말한다.

가상메모리란 주기억장치를 확장하기 위한 방법으로 프로그램이 메모리의 주소를 논리적인 관점에서 참조하도록 하는 기법이다. 멀티프로그래밍 환경에서 동시에 수행되는 프로세스들이 주기억장치에 올라와있을 수 있는 수는 한정적이기 때문에 프로세스를 페이지라는 고정크기 블록으로 나누어 프로세스의 일부분만 주기억장치에 올려 수행한다. 프로그램은 프로세스의 페이지번호와 오프셋을 조합한 가상주소를 Memory Management Unit(MMU)를 통해 물리적 주소로 변환하여 페이지에 접근한다. 만약 주기억장치에 찾는 페이지가 없으면 보조기억장치에서 페이지를 찾아 데이터블록을 주기억장치로 올린다.이때, 프로세스의 분리는 두 프로세스에게 고유한 가상메모리를 제공함으로써 구현된다.

정보보호, 보안

시분할 시스템과 네트워크의 사용으로인해 정보보호의 중요성이 높아졌다. 운영체제는 정보보호를 위해 4가지 범주의 조치를 지원한다.

  • 가용성(Availablity) : 시스템이 중지되지 않도록 하는 것 과 관련된 조치
  • 기밀성(Confidentiality) : 접근권한이 없는 사용자가 데이터에 접근하는 것을 방지
  • 데이터 무결성(Integrity) : 데이터가 불법적으로 수정되지 못하게 보호
  • 신빙성(Authenticity) : 사용자, 데이터의 유효성에 대한 인증

스케줄링 및 자원관리

운영체제의 핵심 역할 중 하나는 자원을 관리하고 적절히 스케줄링하는 것이다. 이를 위해 운영체제가 고려해야 하는 것들은 다음과 같다.

  • 공정성 : 프로세스는 자원을 공정하고 동등하게 접근할 수 있어야 한다.
  • 반응 시간 차등화 : 운영체제는 동적으로 프로세스의 요구사항을 만족시키는 방향으로 자원을 할당하고 스케줄링 해야 한다.
  • 효율성 : 운영체제는 작업처리량을 극대화하고 반응시간을 최소화하며 많은 사용자를 동시에 수용하도록 동작해야 한다.

멀티 프로그래밍 환경에서 운영체제는 여러개의 큐를 통해 스케줄링을 지원한다. 각 큐는 자원을 사용하기 위해 대기중인 프로세스로 단기 큐, 장기 큐, 입출력 큐등이 있다.

단기 큐에는 현재 메모리에 올라와있는 프로세스들이 대기한다. 이 프로세스들은 자원을 받으면 바로 실행될 수 있는 상태이다. 따라서 이들은 단기 스케줄러(디스패쳐)에 의해 선택되면 바로 프로세서에 할당되어 일정한 시간동안 작업을 수행하고 다음 프로세스로 자원이 넘어간다. 이를 라운드 로빈 기법이라 하고, 원형 큐를 통해 구현한다.

장기 큐에는 프로세서를 사용하기 위해 대기하고 있는 프로세스들이 대기한다. 운영체제는 장기 큐에서 대기중인 프로세스를 단기 큐로 올려 프로세서가 할당될 수 있도록 한다. 이때, 메모리의 일부가 프로세스에게 할당된다.

입출력 큐에는 각 I/O장치를 사용하기 위한 프로세스들이 대기한다. I/O장치에는 각각 하나의 입출력 큐가 할당되고 프로세스는 장치에 요청한 순서대로 큐에 대기하는데, 운영체제는 이 경우에도 어느 프로세스에게 먼저 자원을 할당할지 결정한다.

만약 인터럽트가 발생하거나 프로세스에서 I/O장치를 사용하기 위해 시스템을 호출한 경우 운영체제는 프로세서에게 제어를 넘겨받고 인터럽트나 서비스 호출을 처리한 뒤 단기 스케줄러를 호출하여 다음으로 수행될 프로세스를 결정한다.

2.4 현대 운영체제의 특징

기술이 점점 발전함에 따라 운영체제에 대한 요구사항 또한 급변하였다. 이로인해 운영체제를 단순한 구조변경이나 성능 향상이 아니라 새롭게 구성해야 한다는 필요성이 제기되었다. 그 결과 아래와 같은 개념이 등장하게 되었다.

마이크로 커널

마이크로 커널이란 주소공간, 프로세스간 통신(Interprocess communication : IPC), 기본적인 스케줄링 등 소수의 핵심기능만을 커널에 포함시키고, 나머지 기능들은 서버라는 프로세스에 의해 제공되는 구조로 분할한 구조를 말한다. 서버에 의해 제공되는 서비스들은 사용자 모드에서 실행되며 일반 사용자 프로그램과 동일하게 취급된다.
이로인해 커널과 서버의 개발이 분리될 수 있고 구조가 간단하여 유지보수에 이점을 갖는다. 또한 마이크로 커널은 로컬과 원격 프로세스를 구분하지 않기 때문에 분산 시스템 구축에 용이하다.

멀티 쓰레딩

멀티쓰레딩이란 하나의 프로세스를 동시에 수행될 수 있는 쓰레드로 분할하는 기법이다. 프로세스와 쓰레드의 차이는 다음과 같다.

  • 쓰레드 : 작업의 디스패치 단위. context와 스택을 포함. 쓰레드는 순차적으로 수행되며 다른 쓰레드로의 컨텍스트 스위칭을 위해 인터럽트 당할 수 있다.
  • 프로세스 : 하나 이상의 쓰레드와 관련 시스템 자원(메모리, 파일, 장치 등)들로 구성. 수행중인 프로그램.

멀티 쓰레딩은 순차적으로 처리될 필요가 없는 독립적인 여러 task들을 처리할 때 유용하다.

그 외

마이크로 커널과 멀티 쓰레딩 이외에도 현대 운영체제는 다음과 같은 특징을 가진다.

  • 대칭형 멀티프로세싱(SMP)
  • 분산 운영체제
  • 객체 지향설계

2.5 Fault Tolerance

시스템의 신뢰성을 높이기 위해서는 시스템 전체 혹은 일부 하드웨어나 소프트웨어에 결함이 발생하더라도 정상작동할 수 있어야 한다. 하지만 허용수준을 높이면 비용은 높아지고 성능은 하락하기 때문에 결함을 허용할 적절한 수준을 찾는 것이 중요하다
결함을 허용하기 위한 수준을 결정하는 척도의 종류는 아래와 같다

  • 신뢰성 : 정상작동하던 시스템이 임의의 시간까지 정상작동할 확률
  • MTTF(Mean time to Failure) : 결함이 발생하기까지의 평균시간
  • MTTR(Mean time to Repair) : 수리 완료까지의 평균시간
  • 가용성 : 서비스가 가동된 후 특정 시점까지의 총 시간 대비 사용자의 요청을 처리할 수 있었던 시간

결함은 지속성에 따라 영구적 결함과 일시적 결함으로 나뉘고, 일시적 결함은 발생 횟수에 따라 단발적 결함과 간헐적 결함으로 나뉜다.

시스템의 결함을 허용하기 위해서는 여분의 설비(redundancy)를 추가하는 방법이 있다. 설비는 공간적(여러개의 부품), 시간적(동일한 동작을 반복)으로 추가하거나 여분의 정보(데이터 복사)를 준비할 수 있다.

운영체제는 시스템의 결함을 허용하기 위해 몇가지 방안을 마련한다.

  • 프로세스 분리
  • 병행성 제어(Concurrency controls)
  • 가상머신(Virtual Machine)
  • 체크포인트, 롤백

참고자료

  • Operating Systems : Internas and Design Principles - William Stallings

0개의 댓글