호우동의 개발일지

Today :

article thumbnail

운영체제 설계 및 구현

 


설계 목표

  • 시스템 설계의 첫 번째 문제점 → 시스템의 목표와 명세를 정하는 일
    • 시스템 설계의 최상위 수준에서는 하드웨어와 시스템 유형의 선택에 영향을 받음
      • 시스템 유형 : 일괄처리, 시분할, 단일 사용자, 다중 사용자, 분산, 실시간, 범용 등

    • 최상위 설계 수준을 넘어서면 요구 조건을 일일이 명시하는 것이 훨씬 어려워짐

  • 요구 조건은 근본적으로 사용자 목적시스템 목적 2가지 그룹으로 나뉨

  • 사용자 목적 : 사용자들이 시스템에 기대하는 특징
    • 시스템은 사용하기 쉽고, 편리하고, 믿을 수 있고, 안전하고, 신속해야 함
    • 특징을 구현하는 방법에 대한 일반적인 합의 사항 X → 설계 명세에 쓸모없음

  • 시스템 목적 : 시스템에 관련된 사람들에 의해 요구조건들이 정의되는 것
    • 운영체제는 설계, 구현, 유지 보수가 쉬워야 함.
    • 적응성, 신뢰성, 무오류, 효율성을 가져가함 → 이것도 애매하게 해석될 수 있음

  • 운영체제 요구를 정의하는 문제를 해결하는 유일한 해법은 없음
    → 다른 환경을 위한 다양한 방법이 존재

  • 소프트웨어 공학분야에 의해 개발된 일반적인 원칙 존재

 


기법과 정책

  • 중요한 원칙 : 기법으로부터 정책을 분리시키는 것
    • 기법 : 어떻게(How) 할 것인가?를 결정
    • 정책 : 무엇(What)을 할 것인가?를 결정

      • 정책 결정은 모든 자원 할당 문제에 있어 중요

    • 예 : 타이머 구조는 CPU 보호를 위한 기법이지만,
      이를 얼마나 오랫동안 설정할지 결정하는 것은 정책

  • 정책과 기법의 분리는 융통성을 위해 중요 ← 정책은 장소나 시간에 따라 바뀔 수 있기 때문
    • 최악의 경우, 정책의 변경이 기법의 변경까지 요구하게 됨
    • 여러 정책에서 사용되기에 좋은 융통성 있는 일반적인 기법이 더 바람직함

  • Window와 macOs 및 iOS는 기법과 정책이 밀접해지도록 인코딩
    • 기법이 정책으로부터 자유롭지가 않음

  • 마이크로 커널 기반 운영체제는 기법과 정책의 분리를 극단적으로 추구
    • 블록들이 정책으로부터 자유로움
    • 고급의 기법과 정책들을 사용자 생성 커널 모듈이나 사용자 프로그램 자체를 통해 첨가 가능

 


구현

  • 초기 운영체제 : 어셈블리 언어로 작성
  • 현재 운영체제 : 고급 언어(C, C++ 등)로 작성

    • 장점
      • 간결하고, 이해하기 쉽고, 디버그 하기 쉬워서 코드를 더욱 빨리 작성할 수 있음
      • 컴파일러 기술의 향상으로 전체 운영체제를 위해 생성된 코드를 향상함
      • 다른 하드웨어로 이식하는 것이 훨씬 쉬워짐

    • 단점
      • 속도가 느리고 저장 장치를 많이 소요 → 현재는 문제가 안됨

  • 운영체제의 주요 성능 향상 요인은 좋은 자료구조와 알고리즘의 결과일 가능성이 크다.
    • 운영체제에서 고성능이 필요한 코드가 적음
      • 인터럽트 핸들러, 입출력 관리자, 메모리 관리자, CPU 스케줄러 정도?

운영체제 구조

  • 밀접하게 결합된(tightly coupled) 시스템
    • 시스템의 한 부분을 변경하면 다른 부분에 광범위한 영향을 줄 수 있는 시스템

  • 느슨하게 결합된(loosely coupled) 시스템
    • 모듈 방식이라고도 함
    • 시스템은 기능이 특정 기능 및 한정된 기능을 가진 개별적이며 작은 구성요소로 나뉨
      • 이 모든 구성요소가 합쳐져 커널을 구성

    • 장점
      • 한 구성요소의 변경이 다른 구성요소에는 영향을 미치지 않는다.
        → 시스템 구현자가 시스템 내부 작동을 더 자유롭게 변경할 수 있다.

 


모놀리식 구조(Monolithic Structure)

  • 커널의 모든 기능을 단일 주소 공간에서 실행되는 단일 정적 이진 파일에 넣는 것
    • 운영체제를 설계하는 일반적이자, 운영체제를 구성하는 가장 간단한 구조

  • 장점 → 성능 면에서 뚜렷한 이점
    • 시스템 콜 인터페이스에서 오버헤드가 거의 없고 커널 안에서의 통신 속도가 빠름
    • 여전히 UNIX, Linux 및 Windows 운영체제에서도 일부 사용

  • 단점
    • 구현 및 확장하기가 어려움

  • 예시 : 최초의 UNIX 운영체제
    • 시스템 콜 인터페이스 아래와 물리적 하드웨어 위의 모든 것이 커널
      linux 모놀리식 구조 그림
      리눅스 모놀리식 그림 구조
    • 커널은 시스템 콜을 통해 파일 시스템, CPU 스케줄링, 메모리 관리, 다른 운영체제 기능 제공
      → 하나의 주소 공간으로 결합하기에는 엄청나게 많은 기능을 제공

 


계층적 접근(Layered Approach)

운영체제 계층적 접근 구조
계층적 접근 구조

  • 운영체제가 여러 개의 층으로 나뉨.
    • 최하위 층(0층) : 하드웨어
    • 최상위 층(N층) : 사용자 인터페이스
    • 운영체제 층 : 데이터와 이를 조작하는 연산으로 구성된 추상된 객체의 구현
      • 운영체제 층은 자료구조와 상위층에서 호출할 수 있는 루틴의 집합으로 구성
      • 운영체제 층은 다시 하위층에 대한 연산을 호출할 수 있음

  • 각 층은 자신보다 하위 수준의 층에 의해 제공된 연산들만 사용해 구현
    • 이러한 연산이 어떻게 구현됐는지 알 필요 없음
    • 이러한 연산이 무엇을 하는지만 알면 됨
    • 각 층은 특정 데이터 구조, 연산, 하드웨어의 존재를 상위층에 대해 숨김

  • 컴퓨터 네트워크(예 : TCP/IP) 및 웹 응용 프로그램에서 성공적으로 사용
    • 어느 정도의 계층화는 현대 운영체제에서 공통적

  • 장점
    • 구현과 디버깅의 간단함
      • 층들은 단지 자신의 하위층들의 서비스와 기능들만을 사용
        → 시스템의 검증과 디버깅 작업을 단순화
      •  어느 층의 디버깅 중 오류가 발견됐다면, 그 하위 층은 이미 디버깅했기 때문에, 오류는 반드시 해당 층에 있다.
  • 단점
    • 시스템의 전반적인 성능은 오버헤드로 인해 열악하다.
      • 사용자 프로그램이 운영체제 서비스를 얻기 위해 여러 계층을 통과하는 과정에서 발생

 


마이크로커널

전형적인 마이크로커널 구조
전형적인 마이크로커널 구조

  • 필수 요소만 커널에 남기고, 나머지는 별도의 주소 공간에 사용자 수준 프로그램으로 구현한 운영체제
  • 마이크로커널은 통신 설비 외에 추가로 최소한의 프로세스와 메모리 관리를 제공
  • 주 기능 : 클라이언트 프로그램과 사용자 공간에서 수행되는 다양한 서비스 간에 통신 제공
    • 통신은 메시지 전달 기법 사용
      • 클라이언트 프로그램이 파일에 접근하기를 원하면, 파일 서버는 반드시 응답해야 함
        → 클라이언트 프로그램과 서비스는 직접 상호작용 하지 않음
        → 마이크로커널을 통한 메시지 교환으로 간접적으로 상호 작용

  • 장점
    • 운영체제의 확장이 쉬움
      • 모든 새로운 서비스는 사용자 공간에 추가 → 커널을 변경할 필요 없음
    • 마이크로커널로 만들어진 운영체제는 다른 하드웨어로 이식이 쉽다.
    • 서비스 대부분이 사용자 프로세스로 수행되기 때문에 높은 보안성과 신뢰성 제공
      ← 서비스가 잘못돼도, 운영체제의 다른 부분은 영향받지 않음

  • 단점
    • 가중된 시스템 기능 오버헤드로 인해 성능이 나빠짐

  • 대표적인 마이크로커널 운영체제
    • macOS 및 iOS 운영체제의 커널 구성요소인 Darwin
    • 실시간 운영체제인 QNX
    • Windows NT의 첫 번째 릴리스

 


모듈

  • 적재가능 커널 모듈(LKM) 방식
    • 커널은 핵심적인 구성요소를 가지고 있고, 부팅/실행 중에 부가 서비스를 모듈을 통해 링크하는 것
    • Linux, Mac OS X, Solaris 및 Windows 등의 현대 UNIX를 구현하는 일반적인 추세

  • 설계의 주안점 : 커널은 핵심 서비스를 제공하고, 다른 서비스들은 커널이 실행되는 동안 동적으로 구현
    • 서비스를 동적으로 링크하는 것이 새로운 기능을 직접 커널에 추가하는 것보다 나음
      • 후자의 경우 수정할 때마다 커널을 다시 컴파일해야 함

  • 전체적으로 커널의 각 부분이 정의되고 보호된 인터페이스를 가짐 → 계층 구조를 닮음
    • 모듈에서 임의의 다른 모듈을 호출할 수 있다는 점에서 계층구조보다 유연

  • 중심 모듈이 핵심 기능만 가지고 있고, 다른 모듈의 적재 방법과 모듈들과 어떻게 통신하는지 앎
    → 마이크로 커널과 유사
    • LKM은 통신을 위해 메시지 전달이 필요 없음 → 더 효율적

  • Linux는 주로 장치 드라이버와 파일 시스템을 지원하기 위해 적재가능 커널 모듈을 사용
    • Linux의 경우, LKM은 동적 및 모듈식 커널을 허용하면서, 모놀리식 시스템의 성능 이점을 유지

 


하이브리드 시스템

  • 사실 하나의 구조를 채택한 운영체제는 거의 존재하지 않는다.
  • 대부분 다양한 구조를 결합하여 성능, 보안 및 편리성 문제를 해결하려는 혼용 구조로 구성됨
     
    • Linux : 모놀리식 구조 + 적재가능 커널 모듈
    • Windows : 대체적으로 모놀리식 구조 + 마이크로커널 + 적재가능 커널 모듈