*소프트웨어 공학 관련 글이지만 화일구조와 관련이 있어 게시글을 끌어옴.
커널 입/출력 서브시스템 (Kernel I/O Subsystem)
커널은 입/출력과 관련된 많은 서비스를 제공한다. 입/출력 스케줄링, 버퍼링, 캐싱, 스풀링, 장치 예약 및 에러 처리등의 서비스가 제공되며 이들은 하드웨어와 장치 드라이버 구조를 바탕으로 한다.
[입출력 스케줄링 (I/O Scheduling)]
입/출력 요청을 스케줄 한다는 것은 그 요청들을 실행할 순서를 결정하는 것을 의미 한다. 응용프로그램이 입/출력을 요청하는 순서대로 처리하는 것은 비효율 적이다. 운영체제 개발자들은 각 장치마다 대기 큐를 유지함으로써 스케줄링을 구현하고 있다.
응용프로그램이 봉쇄형 입/출력 시스템을 호출 하면 그 입/출력 요청은 해당 장치의 큐에 넣어진다. 입/출력 스케줄러는 시스템의 성능과 각 응용에 대한 평균 응답 시간을 향상하기 위해 큐 안의 순서를 재배치 한다.
커널이 비동기적 입/출력을 제공한다면 커널은 동시에 많은 입/출력 요청을 추적해야 한다. 이를 위해 운영체제는 각 장치 상태 테이블(device status table)에 대기 큐를 연동한다. 이 테이블에는 각 입/출력 장치에 대한 정보가 있다. 각 테이블 항목은 장치의 종류, 주소, 상태, 유휴, 동작중 등을 나타낸다. 장치가 요청을 처리하느라 동작중 상태이면 같은 장치에 대한 요청은 그 장치에 해당하는 테이블 항목에 저장된다.
입/출력 서브시스템의 효율을 높이는 방법으로는 스케줄링외에 버퍼링, 캐싱, 스풀링처럼 디스크의 저장장치 공간을 이용하는 것이다.
[버퍼링 (Buffering)]
버퍼는 입/출력 장치와 응용프로그램 사이에 자료가 전송되는 동안 그 자료를 임시로 저장하는 메모리 영역을 말한다. 버퍼링이 필요한 이유는 다음과 같이 정리 할 수 있다.
l 자료의 생산자와 소비자 사이에 속도가 다른 것에 대처하기 위함이다. 이중버퍼링(double buffering)을 이용하여 자료의 생산자와 소비자간의 속도 차이를 흡수 할 수 있다.
l 서로 다른 장치들 사이에 사용되는 자료 전송 크기가 다른 것을 극복하기 위한 것이다. 특히 컴퓨터 네트워킹에서 많이 발생하며 송신자의 큰 패킷을 작은 패킷으로 나누어 전송하며 수신자는 나누어진 패킷을 버퍼에서 결합한다.
l 응용프로그램의 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에서는 입/출력 서비스를 커널이 직접 해주지 않고 커널 밖의 입/출력 관리자라는 프로그램에게 넘겨준다. 커널에게 입/출력 요청이 오면 그것은 메시지로 바뀌어 커널을 통해 입/출력 관리자에게 전달되고 다시 장치 드라이버에게 전달 된다.
[참고자료]
l Operating System Concepts / 홍릉과학출판사
l http://msdn.microsoft.com/en-us/library/windows/hardware/ff544248(v=vs.85).aspx
'C.E > File processing' 카테고리의 다른 글
C++ 합병정렬 소스(merge sort in have data) (0) | 2014.05.20 |
---|---|
C++ 퀵정렬 소스(quick sort in have data) (0) | 2014.05.20 |
C++ 정렬에 쓸 데이터 생성 (0) | 2014.05.20 |
C++ 합병정렬 소스(merge sort) (1) | 2014.05.20 |
C++ 퀵정렬 소스(quick sort) (0) | 2014.05.20 |