D. The Mach System

이 장에서는 Mach 운영 체제를 알아보자. 많은 실험적 운영 체제들이 설계되고, 개발되고, 사용되었지만, Mach는 UNIX 4.3 BSD와의 완전 호환성을 제공하기 때문에 다른 것들에 비해 많은 사용자들의 필요를 충족하였다.

D.1. History of the Mach System

Mach의 기원은 CMU에서 개발된 Accent 운영체제로 올라간다. Mach의 개발은 BSD UNIX 시스템으로부터 혁신적 경로를 따라왔다. 릴리즈 2에서 Mach는 BSD 코드의 많은 부분을 커널에 포함시켜 대응하는 BSD 시스템과의 호환성을 제공하였다. Mach는 오픈 소프트웨어 재단 (OSF)이 1989년에 그 새 운영 체제인 OSF/1을 Mach 2.5 기반으로 사용하겠다고 발표한 때부터 산업계의 첨단 주목을 끌었다.

D.2. Design Principles

Mach 운영 체제는 대다수 현대 운영 체제가 부족한 기본 메커니즘을 제공하기 위해 설계되었다. Mach의 설계자들은 BSD로부터 매우 크게 영향 받았다. 물론, 설계자들은 BSD에서 본 단점들도 시정하고자 하였다. Mach의 개발은 지속된 부담이 되었다.

D.3. System Components

Mach의 설계 목표를 이루기 위해, 개발자들은 운영 체제 기능을 적은 집합의 기본 추상화로 제한하였고 다른 모든 기능들은 파생되도록 하였다. Mach의 설계 철학은 간단한, 확장 가능한 커널을 가져 통신 기능에 집중하는 것이다. Mach는 데이터와 동작이 추상된 오브젝트로 캡슐화된 데이터를 조작하는 객체 지향 시스템의 예이다. Mach의 주된 추상화들은 태스크, 스레드, 포트 (포트 권리에 의해 보호됨), 포트 집합, 메시지, 메모리 오브젝트 등이 있다. Mach의 비범한 특성이자 시스템의 효율성의 핵심은 메모리와 프로세스간 통신 특성의 혼합이다. Mach는 메모리 관리와 프로세스간 통신을 각각이 다른 쪽의 구현 내에서 사용될 수 있게 하여 연결시킨다. 프로세스간 통신은 적지 않은 시스템 오버헤드를 포함한다. 뒤에서는 프로세스 관리, 프로세스간 통신, 메모리 관리 동작의 세부 사항을 알아보자.

D.4. Process Management

태스크는 명령 포인터나 레지스터 집합을 갖지 않은 전통적 프로세스로 볼 수 있다.

D.4.1. Basic Structure

새 태스크 메모리는 부모의 주소 공간의 복제이며, 부모 메모리의 상속 특성에 의해 결정된다. 스레드는 UNIX에서 흔한 서버 애플리케이션에 특히 유용한데, 한 태스크는 그 태스크에 대한 복수 요청을 서비스하기 위해 복수 스레드를 가질 수 있기 떄문이다. 스레드는 사용자 레벨에서 동작 중이거나 중지 중일 수 있다. 이것은 태스크에도 적용 가능하다. Mach는 스레드 동기화 도구가 만들어질 수 있는 기본 단위들을 제공한다.

D.4.2. The C Threads Package

Mach는 세련되고 크고 더 제한적인 함수보다는 저수준의 유연한 루틴을 제공한다. 상호 배제는 스핀락의 사용을 통해 얻어진다. 바쁜 대기 없는 일반적 동기화는 조건 변수의 사용을 통해 얻어지며, 이는 모니터를 구현할 수 있다. C 스레드 루틴의 예로는 한계 있는 버퍼 동기화 문제를 고려할 수 있다. 프로그램이 끝날 때는 뮤텍스와 조건 변수는 해제되어야 한다.

D.4.3. The CPU Scheduler

스레드 기반 멀티프로세서 운영 체제를 위한 CPU 스케쥴러는 프로세스 기반에 비해 어렵다. 각 스레드는 0부터 127까지의 우선도 값을 갖고 있으며 이는 그의 지수적 평균 CPU 사용량에 기반한다. 스레드를 프로세서에 할당하는 중심 디스패쳐 대신 각 프로세서는 지역/전역 수행 큐를 참고하여 실행할 다음 스레드를 선택한다. 추가적인 스케쥴링 어려움은 Mach의 멀티프로세서 특성으로부터 발생한다. 이외에도 여러 복잡함이 존재한다.

D.4.4. Exception Handling

Mach는 단일, 간단한, 일관적인 예외 처리 시스템을 표준과 사용자 정의 예외를 같이 제공하기 위해 설계되었다. 일반적 프로그램 실행에 대한 중지는 내부에서 생성된 예외와 외부의 인터럽트, 둘에 의해 이루어진다. Mach는 예외 처리에 대한 2개의 다른 입자성을 갖는다. 예외 처리 과정은 원격 프로시져 호출과 핸들러를 통해 이루어진다. BSD 프로그램의 실행을 지원하기 위해 Mach는 BSD 스타일 시그널도 지원할 필요가 있다. 시그널 시스템은 Mach가 4.3 BSD 프로그램을 가동시키기 위해 멀티스레드 환경에서 올바르게 작동해야 하므로, 시그널은 무시될 수 없다. 외부에서 생성된 시그널은 BSD 프로세스에서 다른 프로세스로 보내진 것을 포함해서 Mach 2.5 커널의 BSD 서버 섹션에서 처리된다.

D.5. Interprocess Communication

UNIX와 같은 대부분의 상업적 운영 체제는 프로세스간 통신과 호스트간 통신을 고정된 전역 이름을 통해 제공한다. Mach IPC의 두 부분은 포트와 메시지이다. Mach는 메시지 발신자와 수신자에 권한을 요구해서 보안을 보장한다.

D.5.1. Ports

포트는 오브젝트가 자리하는 시스템의 커널 내에 보호된, 제한된 큐로 구현된다. 포트에 여러 기능을 지원하기 위해 여러 시스템 호출이 지원될 수 있다. 태스크가 만들어질 때, 커널은 그를 위한 여러 포트를 만든다. 포트는 포트 집합으로 모아질 수 있다.

D.5.2. Messages

메시지는 고정 크기 헤더와 가변 개수의 타입이 정해진 데이터 오브젝트로 구성된다. 메시지 내의 포인터의 사용은 태스크의 전체 주소 공간을 단일 메시지 내에서 전송할 수 있게끔 한다. 버전 2.5에서 이 동작은 두 단계로 구현되었다. 버전 3에서 이는 단순화되었다. 태스크에서 새로 할당된 영역은 이전 할당과 연속될 필요가 없기 때문에 Mach의 가상 메모리는 희박하다. 즉, 할당되지 않은 주소로 데이터 영역이 분할되어 있다.

D.5.3. The NetMsgServer

컴퓨터간 전송된 메시지에 대해서는 메시지의 도착지는 위치되어야 하며 메시지는 그 도착지로 전송되어야 한다. 이 명명과 전송은 네트워크 메시지 서버 (NetMsgServer)에 의해 수행되는데 이것은 사용자 수준의 기능 기반 네트워킹 데몬으로 호스트 사이의 메시지를 전달한다. 커널은 메시지가 커널의 컴퓨터에 없는 포트로 전송되어야 할 때 네트워크 메시지 서버를 사용한다. 지역 프로세스간 통신을 노드간으로 투명하게 확장할 수 있는 능력은 프록시 포트의 사용을 통해 지원된다. MAch는 불균일한 시스템의 네트워크 내에서 기능하도록 설계되었으므로, 이는 시스템에 데이터가 발신자와 수신자 모두에게 이해받을 수 있는 식으로 서식화되는 방법을 제공해야 한다. 컴퓨터의 네트워크 메시지 서버는 네트워크 메시지 서버의 이름 서비스로부터 네트워크 포트를 추가, 탐색, 제거할 수 있는 원격 프로시져 호출을 수용한다. 네트워크 메시지 서버의 동작의 예를 간단히 알아볼 수 있다. Mach 3.0은 네트워크 메시지 서버에 대한 대안을 NORMA 멀티프로세서에 대한 개선된 지원의 일부로 제공하였다.

D.5.4. Synchronization Through IPC

프로세스간 통신 메커니즘은 매우 유연하며 Mach에서 통틀어 사용된다.

D.6. Memory Management

Mach의 객체 지향적 특성으로 인해, Mach의 주 추상화는 메모리 오브젝트이다.

D.6.1. Basic Structure

태스크의 가상 주소 공간은 일반적으로 희박하며, 할당되지 않은 많은 구멍 공간들을 갖고 있다. Mach는 태스크가 주소 공간 내에 요청된 영역에 자리가 없어 실패하더라도 주소 공간을 압축하려는 시도는 하지 않는다. Mach는 할당, 해제, 가상 메모리 복사 등 표준 가상 메모리 기능을 지원하기 위한 시스템 호출도 갖고 있다. 연관된 시스템 호출은 태스크의 주소 공간 내의 메모리 오브젝트에 대한 정보를 반환한다.

D.6.2. User-Level Memory Managers

이차 저장소 오브젝트는 태스크의 가상 주소 공간으로 매핑된다. 여러 환경에서 사용자 레벨 메모리 관리자는 불충분하다. 페이지아웃 정책은 내부 커널 스레드인 페이지아웃 데몬으로 구현된다. 스레드가 메모리 오브젝트 내의 데이터에 접근할 필요가 있다면 vm_map() 시스템 호출을 실행한다. 메모리 관리자는 다른 기기에서의 작업으로 매핑된 메모리 오븢게트의 내용들의 일관성에 대한 책임이 있다. 메모리 관리자에 전달되는 두 개의 포트는 제어 포트이름 포트이다. 여러 커널 호출은 외부 메모리 관리자를 지원하기 위해 필요하다. 메모리 관리자 그 자신은 오브젝트를 지원할 수 있도록 여러 호출을 지원해야 한다. 현 버전에서는 Mach는 외부 메모리 관리자가 페이지 대체 알고리즘을 직접적으로 영향을 끼치도록 하지 않는다.

D.6.3. Shared Memory

Mach는 공유 메모리를 사용해 여러 시스템 기능의 복잡도를 줄이고 이 특성들을 효율적인 방식으로 제공한다. 복수 기기에서의 작업이 메모리를 공유하게 하면서 데이터 일관성을 유지하게 하기는 매우 어렵다. 분리된 기기간 공유되는 메모리의 경우, Mach는 외부 메모리 관리자의 사용을 허용한다.

D.7. Programmer Interface

프로그래머는 Mach 내 여러 수준에서 작업할 수 있다. Mach 3.0은 복수 서버를 지원하기 위해 단일 서버 모델로 이동하였다. 에뮬레이션 라이브러리는 프로그램의 주소공간 내의 읽기 전용 영역에서 존재하는 루틴의 집합이다. 더 복잡한 운영 체제는 라이브러리와 하나 이상의 서버를 사용해 에뮬레이트될 수 있다. 기능적으로 시스템 호출은 태스크에서 시작해 재배치되기 전 커널을 통해 전달되며, 적절하다면 태스크의 주소 공간이나 서버 내 라이브러리로 전달된다. 그 다음 높은 프로그래밍 수준은 C 스레드 패키지이다. 기본 단위의 사용이 Mach를 유연하게 만들어 주기는 하지만 많은 프로그래밍 작업들을 반복화한다.

D.8. Summary

Mach 운영 체제는 최근의 많은 운영 체제 연구의 혁신들을 포함해 완전히 기능하고 기술적으로 발전된 운영 체제를 제공하기 위해 설계되었다. Mach 운영 체제는 3개의 핵심 목표를 염두에 두고 설계되었다:

  • 4.3 BSD UNIX를 에뮬레이트해서 UNIX 시스템의 실행 파일이 Mach에서 올바르게 동작할 수 있도록 한다.
  • 많은 메모리 모델을 지원하고 병렬, 분산형 컴퓨팅을 지원하는 현대적 운영 체제를 갖는다.
  • 4.3 BSD보다 더 단순하고 수정하기 쉬운 커널을 설계한다.

볼 수 있듯, Mach는 이들 목표들을 얻는 데 있어 성공적이었다. Mach 2.5는 4.3 BSD를 그 커널에 포함시켜, 필요한 에뮬레이션을 제공하였으나 커널의 크기는 커졌다. 4.3 BSD 코드는 다시 쓰여져서 같은 4.3 기능을 제공하였으나 Mach 기본 단위들을 사용하게 되었다. 이 변화들은 4.3 BSD를 지원하는 코드가 Mach 3.0 시스템의 사용자 공간에서 동작할 수 있도록 하였다.

Mach는 경량 프로세스를 한 태스크 (또는 주소 공간) 내 복수의 스레드가 실행 중인 형태로 사용하여 멀티프로세싱과 병렬 연산을 지원한다. 이것이 메시지를 유일한 통신 방식으로 폭넓게 사용하는 것은 보호 메커니즘이 완전하고 효율적이도록 보장한다. 메시지를 가상 메모리 시스템과 통합해, Mach는 메시지가 효율적으로 다뤄질 수 있도록 보장한다. 마지막으로, 가상 메모리 시스템이 메시지를 사용해 기반 저장소를 관리하는 데몬과 통신하게 함으로써, Mach는 이 메모리 오브젝트 관리 태스크를 설계하고 구현하는 데 있어 큰 유연성을 갖는다.

저수준 또는 근원적의 시스템 호출을 제공해 더 복잡한 함수를 만들 수 있게 함으로써, Mach는 커널의 크기를 줄이면서도 운영 체제 에뮬레이션을 사용자 수준에서 허가할 수 있도록 한다. 이는 IBM의 가상 기기 시스템과 비슷하다.

답글 남기기

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

WordPress.com 로고

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

Google photo

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

Twitter 사진

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

Facebook 사진

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

%s에 연결하는 중