62_교착 상태 처리(Deadlock Handling)와 선출 알고리즘(Election Algorithm)

 

교착 상태 방지와 회피 알고리즘은 분산 시스템에서 자원들 간의 전역 순서화를 정의함으로써 자원 순서와 교착 방지 기법을 분산환경에 적용할 수 있다.

 

[교착 상태 방지와 회피(Deadlock Prevention and Avoidance)]

교착 상태 방지 기법은 다음 두 가지로 분류 된다.

  • Wait-Die 기법 : 비선점 기법에 기반을 둔다. P1가 보유한 자원을 프로세스P2가 요청 할 때 P2가 P1보다 더 작은 타임스탬프를 가진 경우에만 기다리는 것이 허용된다. 그렇지 않은 경우 P2는 롤백한다.
  • Wound-Wait 기법 : 선점 기법에 기반을 두며 wait-die 기법과는 상반된 특징을 가지고 있다. P2가 P1이 사용중인 자원을 요청할 경우 P2는 P1보다 타임스탬프가 클 때 기다리는 것이 허용 된다. 그렇지 않으면 P1은 롤백 된다.

 

두 기법 모두 롤백되는 프로세스에게 새로운 타임 스탬프를 다시 할당하지 않음으로써 기아 상태를 방지 할 수 있다. 타임스탬프는 항상 증가되므로 롤백되는 프로세스는 결국 가장 작은 타임 스탬프를 가지게 된다. 따라서 다시 롤백되지 않는다.

 

Wait-Die 와 Wound-Wait 차이점

Wait-Die

Wound-Wait

오래된 프로세스는 새로운 프로세스가 자원을 방출하기를 기다려야 한다. 따라서 프로세스가 오래되면 오래될수록 더 많은 시간을 기다리는 경향을 보인다.

오래된 프로세스가 결코 새로운 프로세스를 기다리지 않는다.

프로세스 P1가 프로세스 P2에 의해 점유된 자원을 요청해서 롤백되었다면 프로세스 P1는 다시 시작할 때 전과 같은 요청을 다시 행한다. 재요청시에 자원이 P2에 의해 점유되어 있으면 P1는 다시 롤백된다. 따라서 자원을 획득하기 전에 여러 번 롤백 될 수 있다.

프로세스 P2는 P1가 점유한 자원을 요청하면 P1가 자원을 방출하고 롤백된다. 이후 P1가 다시 시작해서 P2에 의해 점유된 자원을 요청하면 P1는 자원을 기다리는 상태가 된다. 따라서 롤백되는 경우가 적게 발생 한다.

 

이 두 가지의 가장 큰 문제점은 불필요한 롤백이 발생하는 것이다.

 

[교착 상태 탐지(Deladlock Detection)]

교착 상태 방지 알고리즘은 교착 상태가 발생하지 않았음에도 자원을 선점한다. 이러한 불필요한 선점을 방지 하기 위해 교착 상태 탐지 알고리즘을 사용한다.

 

분산 시스템에서 교착 상태 탐지를 위해 고려되어야 하는 중요한 문제는 대기 그래프를 어떻게 유지하는가이다.

 

어떤 지역 대기 그래프가 사이클을 가지면 교착 상태가 발생했음을 의미 한다. 그러나 역으로 어떤 지역 대기 그래프에서 사이클이 없다는 사실이 교착상태가 없다는 것을 의미하지는 않는다. 교착상태가 발생하지 않았음을 증명하기 위해서는 모든 지역 대기 그래프의 합집합에 사이클이 없음을 보여주어야 한다.

 

중앙 집중식 접근 방식에는 전역 대기 그래프가 모든 지역 대기 그래프의 합으로 이루어진다. 전역 대기 그래프는 교착 상태 탐지 코디네이터(Deadlock detection coordinator) 역할을 담당하는 단일 프로세스에 의해 유지된다.

 

중앙 집중식의 대기 그래프가 구성되는 시점은 다음 3가지가 있다.

  • 지역 대기 그래프에서 새로운 간선이 삽입되거나 제거될 때마다
  • 주기적으로 대기 그래프에서 많은 변화가 일어났을 때
  • 코디네이터가 사이클 탐지 알고리즘을 수행할 필요가 있을 때마다

 

 

교착 상태 탐지 알고리즘이 수행되면 코디네이터는 전역 그래프를 탐색한다. 만약 사이클이 발견되면 롤백 될 희생자가 선택된다. 이후 코디네이터는 모든 사이트에게 특정 프로세스가 희생자로 선택되었다는 사실을 알려 주어야 한다. 그리고 사이트들은 희생자를 롤백한다.

  1. 간선이 지역 대기 그래프에 삽입되거나 제거될 때마다 지역 사이트는 지역 그래프의 변경 사실을 알리는 메시지를 코디네이터에게 보내야만 한다. 이런 메시지를 받게 되면 코디네이터는 자신의 전역 그래프를 수정한다.
  2. 한 지역 사이트가 여러 번의 그래프 변경 사실을 하나의 메시지에 담아 주기적으로 보내게 할 수도 있다.
  3. 실제로 발생하는 모든 교착 상태를 탐지하고 거짓 교착 상태는 탐지하지 않는다. 거짓 교착 상태의 보고를 방지하기 위해서는 다른 사이트로부터 요청 메시지에 고유의 식별자(타임스탬프)가 붙어 있어야 한다.

 

탐지 알고리즘은 다음과 같다.

  1. 코디네이터는 시스템 내의 모든 사이트에 초기화 메시지를 보낸다.
  2. 이 메지시를 받으면 각 사이트는 자신의 지역 대기 그래프를 코디네이터에게 보낸다.
  3. 코디네이터가 각 사이트로부터 회신을 받으면 전체 그래프를 구성 한다.
  4. 구성된 그래프에 사이클이 있다면 시스템은 교착 상태에 있다고 볼 수 있다.

 

그래프에 사이클이 없다면 적어도 1단계에서 코디네이터에 의해 초기화 메시지가 보내진 후 탐지 알고리즘이 수행되는 동안에 교착 상태가 발생하지 않았음을 보장할 수 있다.

 

 

[완전 분산형 접근(Fully Distributed Approach)]

완전 분산형 교착 상태 탐지 알고리즘에서는 모든 사이트가 교착 상태 탐지에 대한 동등한 역할을 한다. 이 기법에서는 모든 사이트가 전체 그래프의 일부를 표현하는 대기 그래프를 동적으로 구성한다.

 

교착 상태가 존재하면 부분 그래프 중에서 적어도 어느 하나에는 사이클이 존재하도록 하는 것이 이 기법의 기본 원리이다.

 

각 사이트는 자신의 지역 대기 그래프를 유지하는데 지역 대기 그래프는 특수한 노드를 포함하는 것으로 앞에서 설명한 지역 그래프와는 다르다. 임의의 프로세스가 점유하고 있을 동안 다른 사이트의 한 자원을 기다린다면 간선 지역 대기 그래프에 표시 된다. 마찬가지로 현재 자신의 지역 사이트에 의해 점유되어 있는 자원을 다른 사이트의 프로세스가 기다리고 있다면 지역 대기 그래프가 표시 된다.

 

 

[선출 알고리즘(Election Algorithm)]

분산 알고리즘들은 시스템 내의 다른 프로세스들과의 공동 작업을 위해 필요한 기능을 담당하는 코디네이터 프로세스(coordinator process)를 가지고 있다. 상호 배재의 보장, 교착 상태의 탐지를 위한 전역 대기 그래프의 유지, 분실된 토큰의 재생성, 그리고 시스템 내의 입/출력 장치의 제어 등이 코디네이터 프로세스의 역할에 포함 된다.

 

사이트의 결함으로 코디네이터 프로세스의 수행이 불가능해지면 다른 사이트에 코디네이터 기능을 이전시킴으로써 시스템을 계속 작동시키는데 선출을 결정하는 알고리즘을 선출 알고리즘이라고 부른다. 이 선출 알고리즘에서는 시스템 내에서 활동하는 각각의 프로세스에 고유의 우선순위가 할당되어 있다고 가정한다.

 

코디네이터는 항상 큰 우선순위 번호를 가진 프로세스이다. 따라서 코디네이터에 결함이 발생하면 알고리즘은 활동중인 프로세스 중에서 우선순위가 가장 큰 프로세스를 선출해야 하고 이 번호는 시스템 내의 모든 활동중인 모든 프로세스에게 보내야 한다. 또한 이 알고리즘은 결함으로 복구된 프로세스가 현재의 코디네이터를 알 수 있는 방법도 제공해 주어야 한다.

  • Bully 알고리즘 : 이 알고리즘을 끝낸 프로세스는 코디네이터로 선출되었음을 의미하고 우선순위가 가장 높다. 이 프로세스는 낮은 우선순위를 가진 모든 활동하는 프로세스에게 자신의 순위 번호를 알려준다. 고장난 프로세스가 복구되면 같은 알고리즘을 수행한다. 자신보다 높은 순위 번호의 프로세스가 없으면 현재 낮은 순위의 코디네이터가 있더라도 자신이 코디네이터가 된다는 사실을 알려주어야 한다.
  • Ring 알고리즘 : 링크는 단방향이며 프로세스는 자신의 오른쪽 프로세스에게만 메시지를 보낸다. 이 알고리즘에 사용되는 자료구조는 활동 리스트(active list)인데 이 리스트는 알고리즘일 끝날 때 시스템 내의 활동하는 모든 프로세스의 우선순위 번호를 가진다. 각 프로세스는 자신의 활동 리스트를 유지하고 연산을 수행 한다. 이 알고리즘은 고장난 프로세스가 복구되었을 때 현재 코디네이터 프로세스의 순위를 결정하는 방법을 규정하지는 않는다. 한 가지 해결방법은 복구된 프로세스가 코디네이터에게 메지시를 보내 코디네이터가 자신의 번호를 수록한 응답을 보내도록 한다.

 

 

[참고자료]

Operating System Concepts / 홍릉과학출판사

 

61_분산 조정 (Distributed Coordination)

 

중앙 집중식 시스템에서는 하나의 공유 메모리와 클록을 사용하므로 두 개의 사건이 발생해도 그 순서를 결정하는 것이 가능하다. 많은 응용 분야에서 순서를 결정할 수 있다는 것은 매우 중요 하다.

 

분산 시스템에서는 공유 메모리와 공유 클록이 존재하지 않기 때문에 두 사건의 순서를 결정하기가 불가능한 경우가 있다. 사건의 전후 발생 관계는 분산 시스템에서 사건의 부분적인 순서(partial order)만을 정의 한다.

 

순차적인 프로세스들만 고려할 때 하나의 프로세스에서 수행되는 모든 사건들은 완전 순서화된다. 또한 인과 법칙에 따라 메시지가 보내진 후에 그 메시지는 수신된다. 사건은 자기 자신이 발생하기 전에는 발생될 수 없으므로 관계는 비반사적 부분 순서(irreflexive partial ordering)이다.

 

만약 두 사건 A와 B에서 A가 B이전에 발생하지 않았고 B도 A이전에 발생하지 않았으면 이는 병행으로 수행되었다고 한다. 우리는 각 시스템 사건들에 하나의 타임스탬프를 연관시켜 전역 순서화(global ordering)를 정의하면 모든 사건 쌍 A와B에 대해 A->B 이면 A의 타임스탬프는 B보다 작다. 그 역이 참일 필요는 없다.

 

분산환경에서는 전역 순서화 조건을 만족하기 위해 각 프로세스내에 논리 클록을 정의 한다. 논리 클록은 간단한 카운터로 사건 발생때마다 증가한다.

 

 

[상호 배제(mutual Exclusion)]

중앙 집중식 접근에서는 하나의 프로세스가 임계구역으로 진입을 조정하는 역할을 전담하도록 함으로써 상호 배제를 구현 한다. 상호 배제를 원하는 각 프로세스는 조정자에게 요청 메시지를 보낸다. 프로세스가 조정자로부터 응답 메시지를 받으면 임계 구역으로 진입할 수 있다. 조정자는 응답을 받으면 임계 구역에 다른 프로세스가 있는지를 검사한다. 임계 구역을 실행중인 프로세스가 없으면 조정자는 응답 메시지를 바로 보낸다. 그렇지 않으면 큐에 대기 한다.

 

이 방법은 상호 배제를 보장하며 기아 상태가 발생하지 않는다. 대신 한 번의 임계 구역 진입을 위해 세 개의 메시지(요청, 응답, 해제)를 필요로 한다.

 

완전 분산형 접근(Fully Distributed Approach)은 프로세스가 임계 구역에 들어가고자 할 때 그 프로세스는 새로운 타임스탬프를 생성하고 자신을 포함한 시스템 내의 모든 프로세스에게 요청 메시지를 보낸다. 상호 배제가 보장되며 교착 상태를 방지 한다. 임계 구역의 출입이 타임스탬프 순서에 의해 스케줄되므로 기아 상태가 발생하지 않는다.

 

토큰 패싱 접근은 하나의 토큰을 프로세스들 사이를 순환시키는 방법이다. 임의의 프로세스가 토큰을 받으면 그 토큰을 가지고 임계 구역에 진입할 수 있다. 그 프로세스가 임계구역에서 나오면 토큰을 다시 전달시킨다. 토큰을 받은 프로세스가 임계 구역에 진입을 시도중이 아니라면 그 토큰을 다시 전달 시킨다.

 

 

[동시성 제어 (Concurrency Control)]

분산 데이터베이스 시스템에서 트랜잭션 관리자의 기능은 지역 사이트에 저장된 자료를 접근하는 트랜잭션들의 수행을 관리하기 위한 것이다. 실행되는 트랜잭션들의 병행 실행을 조정하기 위해 적절한 병행성 제어 방법을 채택해야 한다.

 

락킹 프로토콜(Locking Protocol)은 자신의 사이트에 저장되어 있는 자료 항목들에 대해 락(lock)과 언락(Unlock) 요청들을 관리하기 위한 기능으로 지역 락 관리자를 가진다. 락 관리자에게 특정락 요청 메시지를 전송하면 각 관리자는 상태에 따라 락을 허용 또는 대기 시킨다.

 

  • 자료 중복을 허용하는 시스템에서는 다수의 동시성 제어 기법이 사용될 수 있다. 단일 조정자 접근(Single coordinator Approach)라 하여 단일 락 관리자를 가지고 있다. 이 방법은 구현이 단순하며 교착상태 취급이 단순하지만 병목이나 병행성에는 취약하다. 이를 절충하기 위해 다중 조정자 접근(Multiple coordinator approach)방법을 통해서 달성 할 수 다.

 

  • 다수결 프로토콜(Majority Protocol)은 비중복 방법을 다소 변경한 것이다. 시스템은 각 사이트에 락 관리자를 유지 한다. 각 관리자는 자신의 사이트에 저장되어 있는 모든 자료 혹은 자료의 복사본들에 대한 락을 관리한다. 다수결 프로토콜은 단일 조정자 접근보다 구현이 복잡하다

 

  • 편견 프로토콜(Biased Protocol)은 다수결 프로토콜과 유사하지만 공유 락 요청이 배타적 락 요청보다 더 호의적인 취급을 받는 다는 부분에서 차이가 있다. 시스템은 각 사이트에 락 관리자를 두고 각 관리자는 해당 사이트에 저장된 모든 자료 항목에 대해 락을 관리한다. 공유와 배타적 락은 다르게 취급한다.
    • 공유 락 : 트랜잭션이 락을 요청 할 때 단순히 복사본을 가지고 있는 한 사이트의 락 관리자에게 락을 요청 한다.
    • 배타적 락 : 트랜잭션이 락을 요청 할 때 복사본을 가지고 있는 모든 사이트의 락 관리자에게 락을 요청 한다.

 

 

[참고자료]

Operating System Concepts / 홍릉과학출판사

 

 

60_분산 시스템 구조 (Distributed System Structure)

 

분산 시스템이란 통신 네트워크를 통하여 서로 약결합된(loosely coupled) 처리기들의 집합이다. 분산 시스템 내의 처리기 관점에서 그 처리기가 가지고 있는 자원을 지역(local)이라 하고 그 처리기 외의 나머지 모든 처리기들과 그들에게 속해 있는 자원들은 원격(remote)이라고 한다.

 

분산시스템을 구축하는 목적은 크게 4가지로 분류 할 수 있다.

  • 자원 공유(Resource Sharing) : 다른 기종의 사이트가 서로 연결되어 있다면 한 사이트의 사용자는 다른 사이트의 자원들을 사용할 수 있을 것이다.
  • 연산 속도 향상(Computation Speedup) : 하나의 특정 연산이 동시에 처리될 수 있는 여러 개의 부분 연산(subcomputation)으로 분할된다면 분산 시스템의 여러 사이트에그 연산을 분산시켜 처리 할 수 있다. 이때 동시에 처리 되므로 연산 속도의 향상을 가져온다. 이러한 작업 분배를 부하공유(load sharing)이라 한다.
  • 신뢰성(Reliability) : 분산시스템에서 결함이 발생하더라도 나머지 사이트들은 동작을 계속 할 수 있다. 사이트의 결함은 시스템에 의해 감지되어야 하며 결함을 복구하기 위한 적절한 조치가 필요하다.
  • 통신(Communition) : 여러 사이트들이 통신 네트워크를 통해 서로 연결되어 있을 때 다른 사이트에 있는 사용자들 간에 정보교환이 가능하다. 저수준에서는 메시지(message)들이 시스템들간에 전달된다. 이러한 분산 시스템의 장점은 다운사이징(downsizing)이라는 새로운 산업화 문화를 만들어 냈다.

 

통신 네트워크 설계는 다음 4가지 기본 문제를 고려 한다.

  • 명명과 이름 해결(naming and name resolution) : 상호 통신을 하는 두 프로세스의 위치를 어떻게 찾을 것인가?
  • 라우팅 전략(routing strategies) : 네트워크를 통하여 어떻게 메시지를 보낼 것인가?
  • 패킷 전략(Packet strategies) : 패킷들이 개별적 또는 순서대로 보내지는가?
  • 연결 전략(Connection strategies) : 두 프로세스가 일련의 메시지들을 어떻게 보낼 것인가?
  • 경쟁(Contention) : 네트워크가 공유 자원일 때 네트워크 사용 요구의 충돌(conflict)을 어떻게 해결할 것인가?

 

[명명과 이름 해결(Naming and Name Resolution)]

시스템들간에 이름을 부여하는 방법이다. 이를 명명(naming)이라고 한다. 사이트 A에 있는 프로세스가 사이트 B에 있는 프로세스와 정보를 교환하기 위해서는 서로를 식별할 수 있어야 한다. 컴퓨터 시스템 내에서 각 프로세스는 고유의 Process-ID를 가지고 있고 메시지들은 Process-ID로 수신 주소가 지정된다. 네트워크로 구성된 시스템은 메모리를 공유하지 않기 때문에 시스템의 호스트는 처음에 다른 호스트에 있는 프로세스 정보를 가지고 있지 않다.

 

이를 해결하기 위해서 원격 시스템 상에 존재하는 프로세스는 일반적으로 <호스트 이름, 식별자>에 의해 식별 된다. 여기서 호스트 이름은 네트워크 내에서 유일하고 식별자는 해당 호스트 내의 Process-ID나 혹은 고유한 번호 이다. 호스트 이름은 사용자가 쉽게 사용할 수 있도록 숫자보다는 알파벳과 숫자의 조합으로 표현한다.

 

[라우팅 전략(Routing Strategy)]

여러 개의 물리적 경로가 존재한다면 여러 가지 라우팅 방법들이 있다. 각 사이트들은 각자 라우팅 테이블을 가지고 있고 이 테이블은 다른 사이트들에게 메시지를 보내기 위해 사용될 수 있는 경로들을 가진다.

 

가장 흔하게 사용되는 라우팅으로는 고정 라우팅(Fixed routing), 가상 라우팅(Virtual routing), 동적 라우팅(dynamic routing)등이 있다.

  • 고정 라우팅 : A에서 B로의 경로가 미리 정해져 있으며 하드웨어 고장이 발생하여 그 경로를 사용하지 못하게 되지 않는 한 경로를 바꾸지 않는다. 통신비용을 최소화 하기 위해서 최단 거리 경로가 지정 된다.
  • 가상 라우팅 : A에서 B로의 경로가 한 세션(session)동안만 고정 된다. 다른 세션에서는 A에서 B로의 경로가 달라질 수 있다. 세션은 파일 전송처럼 짧을 수도 있고 원격 로그인처럼 길 수도 있다.
  • 동적 라우팅 : A에서 B로의 경로가 메시지가 보내질 때 결정 된다. 경로 선택이 동적으로 결정되기 때문에 메시지들은 다른 경로들을 배정 받을 수 있다. 일반적으로 메시지 사용률이 가장 낮은 링크를 통해서 다른 사이트로 전송 한다.

 

고정 라우팅은 링크 고장이나 부하의 변화에 적응 할 수 없다. 이 문제는 가상 라우팅이나 동적 라우팅을 통하여 해결이 가능하다. 동적 라우팅에서는 전송 순서와는 다른 순서로 메시지가 도착할 수 있다. 이 문제는 메시지에 일련번호를 붙임으로써 해결 한다.

 

[패킷 전략(Packet Strategy)]

일반적으로 메시지의 길이는 가변적이다. 패킷 형태로 구현된 통신은 무연결(connectionless)메시지 형태로 자료를 전송한다. 무연결 메시지는 신뢰성이 없다고 할 수 있다. 즉 목적지로의 전송을 보장 받을 수 없다. 메시지가 하나 이상의 패킷으로 구성되거나 두 통신자 사이에 양방향으로 진행될 필요가 있을 경우에는 여러 개의 패킷 교환을 신뢰성 있게 하기 위하여 연결(connection)이 구축되어야 한다.

 

[연결 전략(Connection Strategy)]

일단 메시지들이 상대방에게 도달하면 프로세스들은 통신 세션을 만들어 정보를 교환한다. 두 프로세스를 연결하는 방식은 일반적으로 회선교환(Circuit switching), 메시지 교환(Message switching), 패킷 교환(Packet switching)방식이 있다.

  • 회선 교환 : 두 프로세스가 통신 할 때 고정된 물리적인 링크가 설정 되고 그 링크는 세션동안 할당 된다. 이 두 프로세스는 실제 통신을 수행하지 않는다 해도 한 번 설정된 세션 동안은 다른 프로세스들은 이 할당된 링크를 사용 할 수 없다.
  • 메시지 교환 : 두 프로세스가 통신 할 때 임시 링크가 하나의 메시지 전송 기간 동안 설정 된다. 물리적인 링크들은 필요할 때마다 동적으로 할당되고 아주 짧은 시간 동안만 할당 된다. 각 메시지는 시스템 정보를 가진 블록들이며 목적지까지 정확히 전달되기 위한 정보들이다.
  • 패킷 교환 : 하나의 논리 매시지는 여러 개의 패킷으로 나뉘어 진다. 각 패킷들은 독립적으로 해당 목적지로 전송되며 각 패킷은 출발지와 목적지를 가지고 있다. 패킷은 서로 다른 경로로 전달 될 수 있으며 목적지에서 재결합된다.

 

 

통신 네트워크 설계는 여러 계층으로 문제를 분할함으로써 단순화 할 수 있다. 한 시스템의 각 계층은 다른 시스템에 존재하는 동등한 계층과 통신한다. 각 계층은 자신의 고유한 프로토콜을 가질 수 있고 특정 프로토콜을 사용하여 피어 계층간 통신을 한다.

 

  1. 물리 계층(Physical layer) : 비트 스트림(bit stream)을 물리적으로 전송하기 위한 기계적, 전기적 사항들을 담당한다.
  2. 데이터 링크 계층(Data link layer) : 물리 계층에서 발생되는 오류에 대한 감지와 복구 등 프레임(frame) 관련 작업을 한다.
  3. 네트워크 계층(Network layer) : 통신 네트워크 내의 연결 및 패킷 라우팅을 담당한다.
  4. 트랜스포트 계층(Transport layer) : 네트워크로의 저수준 접근 및 클라이언트간 메시지 전달을 담당한다. 메시지를 패킷으로 분할하고 패킷의 순서를 유지하며 흐름 제어와 물리적인 주소를 생성한다.
  5. 세션 계층(Session layer) : 세션을 구현하고 프로세스간 통신 프로토콜을 담당한다. 원격로그인, 파일 및 메일 전송 등을 위한 실제적인 통신을 다룬다.
  6. 프리젠테이션 계층(Presentation layer) : 문자 변환이나 반이중(half duplex), 전이중(full duplex) 모드 등을 포함해 사이트들 간 포맷의 차이의 해결을 담당한다.
  7. 응용 계층(Application layer) : 사용자들이 직접 교신 하는 것을 담당한다.

 

 

[참고자료]

Operating System Concepts / 홍릉과학출판사

 

 

 

 

 

 

 

59_커널 입/출력 서브시스템 (Kernel I/O Subsystem)

 

커널은 입/출력과 관련된 많은 서비스를 제공한다. 입/출력 스케줄링, 버퍼링, 캐싱, 스풀링, 장치 예약 및 에러 처리등의 서비스가 제공되며 이들은 하드웨어와 장치 드라이버 구조를 바탕으로 한다.

 

[입출력 스케줄링 (I/O Scheduling)]

입/출력 요청을 스케줄 한다는 것은 그 요청들을 실행할 순서를 결정하는 것을 의미 한다. 응용프로그램이 입/출력을 요청하는 순서대로 처리하는 것은 비효율 적이다. 운영체제 개발자들은 각 장치마다 대기 큐를 유지함으로써 스케줄링을 구현하고 있다.

 

응용프로그램이 봉쇄형 입/출력 시스템을 호출 하면 그 입/출력 요청은 해당 장치의 큐에 넣어진다. 입/출력 스케줄러는 시스템의 성능과 각 응용에 대한 평균 응답 시간을 향상하기 위해 큐 안의 순서를 재배치 한다.

 

커널이 비동기적 입/출력을 제공한다면 커널은 동시에 많은 입/출력 요청을 추적해야 한다. 이를 위해 운영체제는 각 장치 상태 테이블(device status table)에 대기 큐를 연동한다. 이 테이블에는 각 입/출력 장치에 대한 정보가 있다. 각 테이블 항목은 장치의 종류, 주소, 상태, 유휴, 동작중 등을 나타낸다. 장치가 요청을 처리하느라 동작중 상태이면 같은 장치에 대한 요청은 그 장치에 해당하는 테이블 항목에 저장된다.

 

 

입/출력 서브시스템의 효율을 높이는 방법으로는 스케줄링외에 버퍼링, 캐싱, 스풀링처럼 디스크의 저장장치 공간을 이용하는 것이다.

 

[버퍼링 (Buffering)]

버퍼는 입/출력 장치와 응용프로그램 사이에 자료가 전송되는 동안 그 자료를 임시로 저장하는 메모리 영역을 말한다. 버퍼링이 필요한 이유는 다음과 같이 정리 할 수 있다.

  • 자료의 생산자와 소비자 사이에 속도가 다른 것에 대처하기 위함이다. 이중버퍼링(double buffering)을 이용하여 자료의 생산자와 소비자간의 속도 차이를 흡수 할 수 있다.
  • 서로 다른 장치들 사이에 사용되는 자료 전송 크기가 다른 것을 극복하기 위한 것이다. 특히 컴퓨터 네트워킹에서 많이 발생하며 송신자의 큰 패킷을 작은 패킷으로 나누어 전송하며 수신자는 나누어진 패킷을 버퍼에서 결합한다.
  • 응용프로그램의 copy semantic를 지원하기 위함이다. 이는 디스크에 쓰기를 할 때 호출할 시점의 버퍼에 있는 내용만 디스크에 쓴다는 것을 보장한다.

 

 

[캐싱 (Caching)]

캐시는 자주 사용될 자료의 복사본을 저장하는 빠른 메모리 영역이다. 캐시된 복사본을 사용하는 것이 원래 자료를 사용하는 것보다 더 효율적이다.

 

캐싱과 버퍼링은 두 가지 서로 다른 기능이지만 메모리의 한 영역이 두 가지 목적 모두를 위해 사용될 수도 있다. 버퍼들은 읽기/쓰기가 빈번하거나 또는 프로세스들 간에 공유되어야 하는 파일들을 위한 캐시로도 사용될 수 있다.

 

커널이 파일 입/출력 요구를 받게 되면 커널은 먼저 그 자료가 버퍼 캐시에 올라와 있는지를 검사한다. 만약 이미 있으면 디스크 입/출력을 생략하거나 연기할 수 있다. 디스크 쓰기의 경우 버퍼에 모아 놓았다가 한번에 쓰기를 실행함으로써 효율을 높일 수도 있다.

 

[스풀링 및 장치 예약 (spooling and Device Reservation)]

스풀(spool)은 교차(interleave)해서 동작될 수 없는 프린터 같은 장치를 위해 출력 자료를 보관하는 버퍼이다. 많은 응용프로그램들이 출력 자료를 만들어 내면 각 출력들이 다른 프로그램의 출력과 섞이지 않도록 운영체제는 모든 출력을 가로챔으로써 이 문제를 해결한다. 각 응용프로그램의 출력은 각각 대응되는 디스크 파일에 저장(스풀) 된다.

 

일부 운영체제에서는 스풀링은 시스템 데몬(daemon) 프로세스의 의해 관리 되거나 커널 스레드에 의해 처리 된다.

 

 

[에러 처리(Error Handling)]

보호되는(protected) 메모리를 사용하는 운영체제는 많은 종류의 하드웨어 및 응용 프로그램 오류에 대처할 수 있으며 그러한 오류가 일어나도 시스템 전체의 마비로까지 확대되지 않는다.

 

일반적으로 입/출력 시스템 호출은 성공/실패를 나타내는 한 비트 정보를 복귀 한다. UNIX는 복귀 값 외에도 errno라 부르는 변수를 사용한다.이 변수는 100가지 종류의 오류를 구분하여 보여 준다.

 

[입/출력 보호 (I/O Protection)]

에러는 보호 문제와 밀접한 관련이 있다. 사용자 프로세스는 고의든 아니든 불법적인 입/출력 명령을 시도함으로써 정상적인 동작을 방해 할 수 있다. 사용자가 불법적인 입/출력을 못하게 하기 위해 모든 입/출력 명령은 특권 명령(privileged instruction)으로 정의한다. 따라서 사용자는 입/출력 명령을 직접 실행할 수 없다. 대신 운영체제가 입/출력을 실행하도록 시스템 호출을 실행 한다.

 

메모리 매핑 또는 입/출력 포트 메모리의 위치는 메모리 보호 시스템에 의해 사용자로부터 보호되어야 하지만 무조건 모든 사용자의 접근을 거부해서는 안 된다. 예를 들어 그래픽 성능을 높이기 위해선 그래픽 제어기 메모리에 직접 접근을 할 필요가 있기 때문이다. 이러한 경우 커널은 한 번에 한 프로세스에 할당되도록 잠금 기법을 제공해야 한다.

 

 

[커널 자료 구조(Kernel Data Structure)]

커널은 입/출력 구성 요소에 대한 상태 정보를 유지해야 한다. 커널은 네트워크 연결, 문자 장치 통신 그리고 다른 입/출력 활동을 관리하기 위해 여러 비슷한 구조를 사용한다.

 

UNIX는 파일 시스템 인터페이스를 사용하여 다양한 개체에 접근할 수 있게 해준다. 사용자 파일, 비가공 장치, 프로세스의 주소 공간과 같은 다양한 개체들을 파일 시스템처럼 접근할 수 있게 해준다.

 

Windows NT에서는 입/출력 서비스를 커널이 직접 해주지 않고 커널 밖의 입/출력 관리자라는 프로그램에게 넘겨준다. 커널에게 입/출력 요청이 오면 그것은 메시지로 바뀌어 커널을 통해 입/출력 관리자에게 전달되고 다시 장치 드라이버에게 전달 된다.

 

 

[참고자료]

 

 

+ Recent posts