운영체제 설계 및 구현
설계 목표
- 시스템 설계의 첫 번째 문제점 → 시스템의 목표와 명세를 정하는 일
- 시스템 설계의 최상위 수준에서는 하드웨어와 시스템 유형의 선택에 영향을 받음
- 시스템 유형 : 일괄처리, 시분할, 단일 사용자, 다중 사용자, 분산, 실시간, 범용 등
- 시스템 유형 : 일괄처리, 시분할, 단일 사용자, 다중 사용자, 분산, 실시간, 범용 등
- 최상위 설계 수준을 넘어서면 요구 조건을 일일이 명시하는 것이 훨씬 어려워짐
- 시스템 설계의 최상위 수준에서는 하드웨어와 시스템 유형의 선택에 영향을 받음
- 요구 조건은 근본적으로 사용자 목적과 시스템 목적 2가지 그룹으로 나뉨
사용자 목적
: 사용자들이 시스템에 기대하는 특징- 시스템은 사용하기 쉽고, 편리하고, 믿을 수 있고, 안전하고, 신속해야 함
- 특징을 구현하는 방법에 대한 일반적인 합의 사항 X → 설계 명세에 쓸모없음
시스템 목적
: 시스템에 관련된 사람들에 의해 요구조건들이 정의되는 것- 운영체제는 설계, 구현, 유지 보수가 쉬워야 함.
- 적응성, 신뢰성, 무오류, 효율성을 가져가함 → 이것도 애매하게 해석될 수 있음
- 운영체제 요구를 정의하는 문제를 해결하는 유일한 해법은 없음
→ 다른 환경을 위한 다양한 방법이 존재
- 소프트웨어 공학분야에 의해 개발된 일반적인 원칙 존재
기법과 정책
- 중요한 원칙 : 기법으로부터 정책을 분리시키는 것
기법
: 어떻게(How) 할 것인가?를 결정정책
: 무엇(What)을 할 것인가?를 결정
- 정책 결정은 모든 자원 할당 문제에 있어 중요
- 정책 결정은 모든 자원 할당 문제에 있어 중요
- 예 : 타이머 구조는 CPU 보호를 위한 기법이지만,
이를 얼마나 오랫동안 설정할지 결정하는 것은 정책
- 정책과 기법의 분리는 융통성을 위해 중요 ← 정책은 장소나 시간에 따라 바뀔 수 있기 때문
- 최악의 경우, 정책의 변경이 기법의 변경까지 요구하게 됨
- 여러 정책에서 사용되기에 좋은 융통성 있는 일반적인 기법이 더 바람직함
- Window와 macOs 및 iOS는 기법과 정책이 밀접해지도록 인코딩
- 기법이 정책으로부터 자유롭지가 않음
- 기법이 정책으로부터 자유롭지가 않음
- 마이크로 커널 기반 운영체제는 기법과 정책의 분리를 극단적으로 추구
- 블록들이 정책으로부터 자유로움
- 고급의 기법과 정책들을 사용자 생성 커널 모듈이나 사용자 프로그램 자체를 통해 첨가 가능
구현
- 초기 운영체제 : 어셈블리 언어로 작성
- 현재 운영체제 : 고급 언어(C, C++ 등)로 작성
- 장점
- 간결하고, 이해하기 쉽고, 디버그 하기 쉬워서 코드를 더욱 빨리 작성할 수 있음
- 컴파일러 기술의 향상으로 전체 운영체제를 위해 생성된 코드를 향상함
- 다른 하드웨어로 이식하는 것이 훨씬 쉬워짐
- 단점
- 속도가 느리고 저장 장치를 많이 소요 → 현재는 문제가 안됨
- 속도가 느리고 저장 장치를 많이 소요 → 현재는 문제가 안됨
- 장점
- 운영체제의 주요 성능 향상 요인은 좋은 자료구조와 알고리즘의 결과일 가능성이 크다.
- 운영체제에서 고성능이 필요한 코드가 적음
- 인터럽트 핸들러, 입출력 관리자, 메모리 관리자, CPU 스케줄러 정도?
- 운영체제에서 고성능이 필요한 코드가 적음
운영체제 구조
밀접하게 결합된(tightly coupled) 시스템
- 시스템의 한 부분을 변경하면 다른 부분에 광범위한 영향을 줄 수 있는 시스템
- 시스템의 한 부분을 변경하면 다른 부분에 광범위한 영향을 줄 수 있는 시스템
느슨하게 결합된(loosely coupled) 시스템
- 모듈 방식이라고도 함
- 시스템은 기능이 특정 기능 및 한정된 기능을 가진 개별적이며 작은 구성요소로 나뉨
- 이 모든 구성요소가 합쳐져 커널을 구성
- 이 모든 구성요소가 합쳐져 커널을 구성
- 장점
- 한 구성요소의 변경이 다른 구성요소에는 영향을 미치지 않는다.
→ 시스템 구현자가 시스템 내부 작동을 더 자유롭게 변경할 수 있다.
- 한 구성요소의 변경이 다른 구성요소에는 영향을 미치지 않는다.
모놀리식 구조(Monolithic Structure)
- 커널의 모든 기능을 단일 주소 공간에서 실행되는 단일 정적 이진 파일에 넣는 것
- 운영체제를 설계하는 일반적이자, 운영체제를 구성하는 가장 간단한 구조
- 운영체제를 설계하는 일반적이자, 운영체제를 구성하는 가장 간단한 구조
- 장점 → 성능 면에서 뚜렷한 이점
- 시스템 콜 인터페이스에서 오버헤드가 거의 없고 커널 안에서의 통신 속도가 빠름
- 여전히 UNIX, Linux 및 Windows 운영체제에서도 일부 사용
- 단점
- 구현 및 확장하기가 어려움
- 구현 및 확장하기가 어려움
- 예시 : 최초의 UNIX 운영체제
- 시스템 콜 인터페이스 아래와 물리적 하드웨어 위의 모든 것이 커널
리눅스 모놀리식 그림 구조 - 커널은 시스템 콜을 통해 파일 시스템, CPU 스케줄링, 메모리 관리, 다른 운영체제 기능 제공
→ 하나의 주소 공간으로 결합하기에는 엄청나게 많은 기능을 제공
- 시스템 콜 인터페이스 아래와 물리적 하드웨어 위의 모든 것이 커널
계층적 접근(Layered Approach)
- 운영체제가 여러 개의 층으로 나뉨.
- 최하위 층(0층) : 하드웨어
- 최상위 층(N층) : 사용자 인터페이스
- 운영체제 층 : 데이터와 이를 조작하는 연산으로 구성된 추상된 객체의 구현
- 운영체제 층은 자료구조와 상위층에서 호출할 수 있는 루틴의 집합으로 구성
- 운영체제 층은 다시 하위층에 대한 연산을 호출할 수 있음
- 각 층은 자신보다 하위 수준의 층에 의해 제공된 연산들만 사용해 구현
- 이러한 연산이 어떻게 구현됐는지 알 필요 없음
- 이러한 연산이 무엇을 하는지만 알면 됨
- 각 층은 특정 데이터 구조, 연산, 하드웨어의 존재를 상위층에 대해 숨김
- 컴퓨터 네트워크(예 : TCP/IP) 및 웹 응용 프로그램에서 성공적으로 사용
- 어느 정도의 계층화는 현대 운영체제에서 공통적
- 어느 정도의 계층화는 현대 운영체제에서 공통적
- 장점
- 구현과 디버깅의 간단함
- 층들은 단지 자신의 하위층들의 서비스와 기능들만을 사용
→ 시스템의 검증과 디버깅 작업을 단순화 - 어느 층의 디버깅 중 오류가 발견됐다면, 그 하위 층은 이미 디버깅했기 때문에, 오류는 반드시 해당 층에 있다.
- 층들은 단지 자신의 하위층들의 서비스와 기능들만을 사용
- 구현과 디버깅의 간단함
- 단점
- 시스템의 전반적인 성능은 오버헤드로 인해 열악하다.
- 사용자 프로그램이 운영체제 서비스를 얻기 위해 여러 계층을 통과하는 과정에서 발생
- 시스템의 전반적인 성능은 오버헤드로 인해 열악하다.
마이크로커널
- 필수 요소만 커널에 남기고, 나머지는 별도의 주소 공간에 사용자 수준 프로그램으로 구현한 운영체제
- 마이크로커널은 통신 설비 외에 추가로 최소한의 프로세스와 메모리 관리를 제공
- 주 기능 : 클라이언트 프로그램과 사용자 공간에서 수행되는 다양한 서비스 간에 통신 제공
- 통신은 메시지 전달 기법 사용
- 클라이언트 프로그램이 파일에 접근하기를 원하면, 파일 서버는 반드시 응답해야 함
→ 클라이언트 프로그램과 서비스는 직접 상호작용 하지 않음
→ 마이크로커널을 통한 메시지 교환으로 간접적으로 상호 작용
- 클라이언트 프로그램이 파일에 접근하기를 원하면, 파일 서버는 반드시 응답해야 함
- 통신은 메시지 전달 기법 사용
- 장점
- 운영체제의 확장이 쉬움
- 모든 새로운 서비스는 사용자 공간에 추가 → 커널을 변경할 필요 없음
- 마이크로커널로 만들어진 운영체제는 다른 하드웨어로 이식이 쉽다.
- 서비스 대부분이 사용자 프로세스로 수행되기 때문에 높은 보안성과 신뢰성 제공
← 서비스가 잘못돼도, 운영체제의 다른 부분은 영향받지 않음
- 운영체제의 확장이 쉬움
- 단점
- 가중된 시스템 기능 오버헤드로 인해 성능이 나빠짐
- 가중된 시스템 기능 오버헤드로 인해 성능이 나빠짐
- 대표적인 마이크로커널 운영체제
- macOS 및 iOS 운영체제의 커널 구성요소인 Darwin
- 실시간 운영체제인 QNX
- Windows NT의 첫 번째 릴리스
모듈
적재가능 커널 모듈(LKM)
방식- 커널은 핵심적인 구성요소를 가지고 있고, 부팅/실행 중에 부가 서비스를 모듈을 통해 링크하는 것
- Linux, Mac OS X, Solaris 및 Windows 등의 현대 UNIX를 구현하는 일반적인 추세
- 설계의 주안점 : 커널은 핵심 서비스를 제공하고, 다른 서비스들은 커널이 실행되는 동안 동적으로 구현
- 서비스를 동적으로 링크하는 것이 새로운 기능을 직접 커널에 추가하는 것보다 나음
- 후자의 경우 수정할 때마다 커널을 다시 컴파일해야 함
- 후자의 경우 수정할 때마다 커널을 다시 컴파일해야 함
- 서비스를 동적으로 링크하는 것이 새로운 기능을 직접 커널에 추가하는 것보다 나음
- 전체적으로 커널의 각 부분이 정의되고 보호된 인터페이스를 가짐 → 계층 구조를 닮음
- 모듈에서 임의의 다른 모듈을 호출할 수 있다는 점에서 계층구조보다 유연
- 모듈에서 임의의 다른 모듈을 호출할 수 있다는 점에서 계층구조보다 유연
- 중심 모듈이 핵심 기능만 가지고 있고, 다른 모듈의 적재 방법과 모듈들과 어떻게 통신하는지 앎
→ 마이크로 커널과 유사- LKM은 통신을 위해 메시지 전달이 필요 없음 → 더 효율적
- LKM은 통신을 위해 메시지 전달이 필요 없음 → 더 효율적
- Linux는 주로 장치 드라이버와 파일 시스템을 지원하기 위해 적재가능 커널 모듈을 사용
- Linux의 경우, LKM은 동적 및 모듈식 커널을 허용하면서, 모놀리식 시스템의 성능 이점을 유지
하이브리드 시스템
- 사실 하나의 구조를 채택한 운영체제는 거의 존재하지 않는다.
- 대부분 다양한 구조를 결합하여 성능, 보안 및 편리성 문제를 해결하려는 혼용 구조로 구성됨
- Linux : 모놀리식 구조 + 적재가능 커널 모듈
- Windows : 대체적으로 모놀리식 구조 + 마이크로커널 + 적재가능 커널 모듈