[Computer Science]/[운영체제(OS)]

[운영체제(OS)] 12-3) 커널 입출력 서브시스템, 입출력 요청 주기

극꼼 2023. 4. 6. 10:18
반응형


<커널 입출력 서브시스템>

: 커널에서 제공하는 입출력과 관련된 서비스들입니다. 하드웨어와 장치 드라이버 구조를 바탕으로 합니다.

 

1) I/O 스케줄링 : 입출력을 실행할 순서를 결정합니다. 응용 프로그램이 봉쇄형 입출력 시스템 콜을 하면 그 입출력 요청은 해당 장치의 큐에 들어갑니다. 입출력 스케줄러는 성능과 평균 응답 시간을 향상시키기 위해 큐 안의 순서를 재배치해줍니다.

 

2) 버퍼링 : 두 장치 사이 또는 장치와 응용 프로그램 사이에서 데이터가 전송되는 동안 전송 데이터를 임시로 저장하는 메모리 영역입니다.

버퍼링이 필요한 이유에는 세가지가 있습니다.

  • 데이터의 생산자와 소비자 사이의 속도 차이에 대처하기 위해.
  • 데이터 전송 크기가 다른 장치들 사이의 완충을 제공할 때. (ex) 네트워킹에서 송신 측 큰 메시지는 보다 작은 네트워크 패킷으로 나눠집니다. 이 패킷은 망을 통해 전송되고, 수신 측에서 원래 자료를 복원하기 위해 버퍼에서 결합시킵니다.
  • 응용 프로그램의 입출력 복제 시맨틱(copy semantics)을 지원하기 위해. 응용 프로그램이 시스템 호출을 한 시점의 버퍼 버전만이 디스크에 저장되는 것을 보장합니다.

3) 캐싱 : 자주 사용될 자료의 복사본을 저장하는 빠른 메모리 영역입니다.

캐싱과 버퍼링은 서로 다른 기능이지만, 메모리 영역을 두 용도 모두로 사용할 수 있습니다. 

 

4) 스풀링(Spooling) 및 장치 예약

  • 스풀 : 인터리브(interleave)하게 동작할 수 없는 프린터같은 장치를 위해 출력 데이터를 저장하는 버퍼입니다. 각 응용 프로그램의 출력은 각각 대응되는 보조저장장치 파일에 저장(스풀)되고, 응용 프로그램이 출력 데이터 만들기를 끝내면 스풀링 시스템은 모아놓은 출력 데이터를 프린터 출력용 대기 열에 삽입합니다.

* 메모리 인터리빙 : 성능을 높이기 위해 데이터가 서로 인접하지 않게 배열해서 동시에 여러 곳을 접근할 수 있게 합니다. 메모리 인터리빙은 블록 단위의 전송이 가능하게 해서 빠른 데이터 전송을 위한 DMA에서 많이 사용합니다.

 

5) 오류 처리

 

6) 입출력 보호 : 사용자 프로세스가 입출력 명령 시도로 정상 동작을 방해하지 못하게 합니다. 모든 입출력 명령은 특권 명령(privileged instruction)으로 정의하여 사용자가 입출력 명령을 직접 수행할 수 없고, 운영체제가 대신 수행하도록 시스템 콜을 호출합니다. 운영체제는 그 요청이 유효한지 검사한 후 수행합니다. 

 

7) 커널 자료구조 : 커널은 입출력 활동을 관리하기 위해 여러 비슷한 구조를 사용해 입출력 구성요소의 상태 정보를 유지합니다. 

 

8) 전원 관리 : 운영체제는 부하를 분석하여 CPU나 외부 입출력 장치같은 구성요소의 전원을 끊을 수 있습니다. 시스템 부하가 필요로 하지 않으면 CPU 코어는 일시중단될 수 있고, 부하가 증가하고 스레드 큐를 실행하기 위한 더 많은 큐가 필요할 때 재개될 수 있습니다.


<입출력 요청을 하드웨어 연산으로 변환>

아래 이미지는 입출력 요청의 생애 주기입니다.

1) 사용자 영역에서 입출력 요청 -> 커널에 시스템 콜을 보냄

2) 입출력 요청이 이미 충족되었는가?

  • 충족됨 -> 7번으로 이동.
  • 충족되지 않음 -> 장치 드라이버에 요청을 보냄. 필요하면 처리를 봉쇄.

3) 장치 드라이버에서 요청을 처리하고, 컨트롤러에 명령을 내림. 인터럽트가 전달될 때까지 컨트롤러가 봉쇄됨.

4) 장치 컨트롤러가 명령을 실행하고(커널 버퍼를 확보하고 입출력을 스케줄함) 장치를 감시 -> 입출력을 완료시키고 인터럽트를 발생시킴.

5) 인터럽트 홴들러가 인터럽트를 받아서 장치 드라이버에 봉쇄를 해제하도록 신호를 보냄. 입력일 경우 장치 드라이버 버퍼에 데이터를 저장.

6) 장치 드라이버는 컨트롤러 봉쇄를 해제하고 입출력 서브시스템에 상태 변화를 알림

7) 커널은 자신의 버퍼로부터 요구된 프로세스의 버퍼를 데이터로 옮기고, 그 프로세스를 blocked queue에서 ready queue로 옮김(= 시스템 콜에서 복귀)


<STREAMS>

: 응용 프로그램이 동적으로 드라이버 코드의 파이프라인을 조립할 수 있게 해줍니다. 스트림은 디바이스 드라이버와 사용자 레벨 프로세스 사이의 완전 양방향 연결을 의미합니다. 

  • 스트림 헤드 : 사용자 프로세스와 상호 연동
  • 드라이버 엔드 : 디바이스를 제어
  • 스트림 모듈 : 스트림 헤드와 드라이버 엔드 사이에 0개 이상 존재

각 구성요소들은 읽기와 쓰기를 위한 한 쌍의 큐를 가집니다.

  • 흐름 제어(flow control) : 인접한 모듈의 큐 사이에서 메시지가 교환되기 때문에 한 모듈의 큐가 인접 큐를 오버플로우(수신할 수 있는 것보다 데이터 양이 과해서 데이터가 손실될 수 있음) 시킬 수 있습니다. 그럴 때 오버플로우를 방지하기 위해 흐름 제어가 필요합니다. 흐름 제어는 인접 모듈의 큐 사이에 제어 메시지를 교환함으로써 지원됩니다. 

 

반응형