운영체제 공룡책

[운영체제 공룡책] 12장 I/O Systems

studyingalone 2025. 3. 22. 17:24

12.2 I/O Hardware

A typical PC bus structure

 

I/O 장치 연결 및 버스 구조

  • 장치는 케이블 또는 무선으로 컴퓨터와 신호를 주고받으며, 포트(Port) 또는 버스를 통해 연결됨.
  • 버스(Bus): 여러 장치가 동일한 통신선을 공유하며, PCIe(PCI Express)와 같은 고속 버스가 주로 사용됨.
  • 데이지 체인(Daisy Chain): 여러 장치를 순차적으로 연결하는 방식.

컨트롤러 (Controller)

  • 컨트롤러는 포트, 버스 또는 장치를 작동시키는 전자 장치임.
  • 단순 컨트롤러: 직렬 포트 컨트롤러(Serial Port Controller)처럼 특정 신호만을 조작하는 간단한 장치.
  • 고급 컨트롤러: 파이버 채널(Fiber Channel, FC) 컨트롤러처럼 별도 회로 기판(HBA 포함)과 프로세서를 가지고 있는 복잡한 장치.

12.2.1 Memory-Mapped I/O

 

  • CPU가 장치 컨트롤러의 특정 레지스터(Registers) 에 데이터를 읽고 쓰는 방식으로 I/O 작업 수행.
  • 메모리 맵드 I/O 방식: 장치의 제어 레지스터가 물리적 메모리 주소 공간에 매핑됨.
    • 표준 데이터 전송 명령으로 I/O를 수행하여 속도가 빠름.
    • 그래픽 컨트롤러는 화면 내용을 저장하는 대형 메모리 맵 영역을 사용함.
    • 대부분의 현대 시스템은 메모리 맵드 I/O 방식 사용.

 

 

I/O 장치의 주요 레지스터

  1. 데이터 입력 레지스터(Data-in Register): 장치에서 입력 데이터를 저장하며, CPU가 이를 읽음.
  2. 데이터 출력 레지스터(Data-out Register): CPU가 장치로 데이터를 출력할 때 사용.
  3. 상태 레지스터(Status Register): 현재 명령의 완료 여부, 오류 발생 여부 등을 나타내는 비트 정보 포함.
  4. 제어 레지스터(Control Register): 장치의 동작 모드를 설정하는 역할.

12.2.2 폴링 (Polling)

호스트와 컨트롤러 간의 상호작용은 복잡할 수 있지만, 기본적인 핸드셰이킹(handshaking) 개념은 간단하다. 컨트롤러는 상태 레지스터의 busy 비트를 사용하여 작업 중인지 여부를 나타내고, 호스트는 command-ready 비트를 통해 명령이 준비되었음을 알린다.
호스트가 데이터를 출력할 때의 과정:

  1. 호스트가 busy 비트가 클리어될 때까지 지속적으로 읽음 (즉, 컨트롤러가 준비될 때까지 기다림).
  2. write 비트를 설정하고 데이터를 data-out 레지스터에 기록.
  3. command-ready 비트를 설정.
  4. 컨트롤러는 command-ready 비트를 감지하고 busy 비트를 설정.
  5. 컨트롤러는 명령을 읽고, 데이터를 가져와 I/O 작업을 수행.
  6. 작업이 끝나면 command-ready 비트와 busy 비트를 클리어.
  • 이 과정이 반복되며, 초기 단계에서 호스트는 바쁜 대기(busy-waiting) 혹은 폴링(Polling)을 수행한다.
  • 폴링은 짧은 시간 간격으로 계속해서 반복적으로 입력 신호를 읽어서 신호의 변화를 감지하는 방법이다.
  • 하지만 컨트롤러가 느릴 경우 CPU가 불필요하게 자원을 낭비할 수 있어 비효율적이다. 이를 해결하기 위해 인터럽트(interrupt) 방식이 도입된다.

12.2.3 인터럽트 Interrupts

  • 인터럽트는 하드웨어가 CPU에 특정 이벤트가 발생했음을 알리는 메커니즘이다.
  • 폴링보다 효율적이며, 특히 빠르게 처리해야 하는 I/O 장치(예: 키보드 입력, 네트워크 패킷 수신 등)에서 유용하다.

Interrupt-driven I/O cycle

 

기본 인터럽트 처리 과정

  1. CPU는 명령어를 실행할 때마다 인터럽트 요청(interrupt-request) 라인을 확인.
  2. 인터럽트가 발생하면 CPU는 현재 상태를 저장하고 인터럽트 핸들러로 점프.
  3. 인터럽트 핸들러가 원인을 확인한 후 처리.
  4. 인터럽트 처리가 완료되면 원래 실행 중이던 작업으로 복귀

 

인터럽트 벡터와 인터럽트 체이닝

  • CPU는 인터럽트 벡터(interrupt vector) 를 통해 어떤 핸들러를 실행할지 결정함.
  • 하지만 인터럽트 벡터가 충분하지 않을 경우, 인터럽트 체이닝(interrupt chaining) 을 사용하여 여러 핸들러를 연결하여 처리함.

12.2.4 직접 메모리 접근 (Direct Memory Access, DMA)

대량 데이터를 전송하는 장치(예: 디스크 드라이브)에서 일반적인 CPU가 하나씩 데이터를 전송하는 프로그램된 I/O(Programmed I/O, PIO) 방식은 비효율적이다. 이를 해결하기 위해 직접 메모리 접근(DMA) 컨트롤러가 사용된다.

  1. DMA 전송 과정
    1. 호스트가 DMA 명령 블록을 메모리에 작성함.
    2. 이 블록에는 전송 소스 주소, 목적지 주소, 전송 크기 등의 정보가 포함됨.
    3. CPU는 DMA 컨트롤러에 이 명령 블록의 주소를 전달한 후 다른 작업 수행 가능.
    4. DMA 컨트롤러가 CPU 개입 없이 메모리 버스를 직접 제어하여 데이터 전송 수행.
    5. 전송이 완료되면 DMA 컨트롤러가 CPU에 인터럽트를 발생시켜 작업 완료를 알림.
      DMA 전송 단계
  2. CPU와 DMA의 관계
    • DMA 컨트롤러가 메모리 버스를 점유하면 CPU는 메모리에 접근할 수 없지만, 캐시된 데이터는 사용할 수 있음.
    • 이 과정에서 CPU 성능이 일시적으로 저하될 수 있으나, CPU의 부담을 줄여 전체 시스템 성능을 향상시킴.
  3. DMA와 메모리 보호
    • 물리적 메모리 주소 사용 vs. 직접 가상 메모리 접근(DVMA): 일부 시스템은 DMA가 가상 주소를 직접 사용하도록 지원함.
    • 일반적으로 보호 모드(Protected Mode) 커널에서는 사용자 프로세스가 장치 명령을 직접 실행하지 못하도록 제한함.
    • 메모리 보호 기능이 없는 커널에서는 장치에 직접 접근이 가능하지만, 보안 및 안정성 문제가 발생할 위험이 있음.

12.3 Application I/O Interface

운영체제는 I/O 장치를 표준적이고 통일된 방식으로 다룰 수 있도록 여러 계층과 인터페이스를 사용한다. 이를 통해 응용 프로그램은 디스크 종류에 관계없이 파일을 열거나, 새로운 장치를 추가할 때 운영체제 변경 없이 사용할 수 있다.

A kernel I/O structure

  1. I/O 시스템 구조
    • 추상화, 캡슐화, 소프트웨어 계층화 기법을 활용하여 하드웨어의 차이를 감춤.
    • 장치 드라이버: 각 장치에 맞게 설계되지만 표준 인터페이스를 제공하여 커널의 I/O 서브시스템과 하드웨어의 차이를 중재
  2. I/O 장치의 주요 특성
    • 문자 스트림 vs. 블록 전송: 데이터를 한 바이트씩 전송하는 문자 스트림 장치와, 블록 단위로 전송하는 블록 장치.
    • 순차 접근 vs. 랜덤 접근: 정해진 순서대로 데이터를 읽는 순차 접근 장치와, 원하는 위치에서 데이터를 읽을 수 있는 랜덤 접근 장치.
    • 동기식 vs. 비동기식: 일정한 응답 시간을 갖는 동기식 장치와, 응답 시간이 불규칙한 비동기식 장치.
    • 공유 가능 vs. 전용 사용: 여러 프로세스가 동시에 사용할 수 있는 공유 장치와, 단독으로만 사용할 수 있는 전용 장치.
    • 읽기-쓰기, 읽기 전용, 단일 쓰기: 읽기와 쓰기가 가능한 장치, 읽기만 가능한 장치, 한 번만 기록할 수 있는 장치 등.
  3. 운영체제의 장치 접근 방식
    • 블록 I/O (디스크 같은 저장 장치)
    • 문자 스트림 I/O (키보드, 마우스 같은 입력 장치)
    • 메모리 매핑 파일 접근 (파일을 메모리에 직접 매핑하여 사용)
    • 네트워크 소켓 (네트워크 통신 장치)

12.3.1 블록 및 문자 장치 (Block and Character Devices)

  • 블록 장치는 디스크 드라이브와 같은 블록 단위로 데이터를 처리하는 장치이며, read(), write(), seek() 등의 명령을 지원함.
  • 문자 장치(예: 키보드, 마우스)는 get() 및 put()과 같은 인터페이스를 통해 문자 단위로 데이터를 처리함.

12.3.2 네트워크 장치 ( Network Devices)

  • 디스크 I/O와 달리 네트워크 I/O는 주소 지정 및 성능 특성이 다르므로 별도의 소켓(socket) 인터페이스를 제공함.
  • 소켓을 생성하고 원격 주소와 연결하며, 패킷을 송수신하는 등의 기능을 제공함.

12.3.3 Clocks and Timers

 

  • 운영체제는 현재 시간 조회, 경과 시간 측정, 특정 시점에 작업 실행과 같은 기능을 제공함.
  • 하드웨어 타이머(프로그램 가능 인터벌 타이머, HPET 등)는 특정 시간이 지나면 인터럽트를 발생시켜 프로세스 스케줄링, 디스크 캐시 플러시, 네트워크 시간 초과 등의 작업을 수행함.
  • NTP(Network Time Protocol)와 같은 프로토콜을 통해 시스템 시계의 시간 오차를 보정할 수 있음.

 

12.3.4 논블로킹 및 비동기 I/O

  • 블로킹 I/O: 시스템 호출을 실행하면 프로세스 실행이 중단되며, 완료 후 재개됨.
  • 논블로킹 I/O: 호출 즉시 반환되며, 전송된 바이트 수를 반환함.
  • 비동기 I/O: 요청 즉시 반환되지만, 작업 완료 후 별도의 방식(콜백, 신호 등)으로 완료 여부를 알림.
  • select() 시스템 호출을 활용하면 여러 개의 I/O 장치에서 동시에 데이터를 감지할 수 있음.

12.3.5 벡터 I/O (Vectored I/O)

  • 벡터 I/O(readv, writev)는 한 번의 시스템 호출로 여러 개의 버퍼를 처리하는 방식임.
  • 단일 시스템 호출로 여러 개의 데이터를 읽거나 쓸 수 있어 성능 향상 및 시스템 호출 오버헤드 감소에 유리함.
  • 데이터 전송을 원자적으로 처리할 수 있어 동시 I/O 작업에서도 데이터 무결성을 유지할 수 있음.

 


12.4 Kernel I/O Subsystem

12.4.1 I/O 스케줄링

  • 운영체제는 I/O 요청을 최적의 순서로 처리하여 성능을 향상하고, 프로세스 간 공정한 장치 접근을 보장하며, 평균 대기 시간을 줄인다.
  • 이를 위해 각 장치별 대기 큐를 유지하며, 요청 순서를 조정한다. 가상 메모리 서브시스템의 요청이 애플리케이션보다 우선시될 수도 있다.

12.4.2 버퍼링 (Buffering)

  • 버퍼는 두 장치 간 또는 장치와 애플리케이션 간 데이터 전송을 저장하는 메모리 영역이다.
  • 버퍼링의 주요 목적:
    1. 속도 차이 조정: 네트워크에서 SSD로 파일을 받을 때, 네트워크 속도가 SSD보다 훨씬 느리므로 데이터를 일시적으로 저장할 버퍼가 필요하다. 이를 위해 더블 버퍼링(double buffering) 기법이 사용된다.
    2. 전송 크기 차이 해결: 네트워크에서 작은 패킷으로 분할된 데이터를 다시 조립하기 위한 버퍼 사용.
    3. 복사 의미 보장(copy semantics): 애플리케이션이 데이터를 디스크에 쓰기 전에 내용이 변경될 경우, 운영체제가 별도 커널 버퍼에 데이터를 저장하여 원본 데이터를 보호한다.

12.4.3 캐싱 (Caching)

  • 캐시는 빠른 메모리에 데이터를 저장하여 원본 접근보다 빠르게 제공하는 기술이다.
  • 캐시와 버퍼의 차이:
    • 버퍼: 원본 데이터의 유일한 사본을 보관.
    • 캐시: 기존 데이터의 복사본을 저장하여 빠른 접근을 가능하게 함.

12.4.4 스풀링과 장치 예약 (Spooling and Device Reservation)

  • 스풀(spool)은 프린터와 같은 장치가 여러 개의 데이터 스트림을 동시에 처리할 수 없을 때 사용하는 버퍼다.
  • 운영체제는 모든 프린터 출력을 가로채어 개별 파일로 저장한 후, 순차적으로 출력한다. 일부 운영체제에서는 이를 시스템 데몬이 관리하고, 다른 운영체제에서는 커널 스레드가 처리한다. 

12.4.5 오류 처리(Error Handling)

  • 운영체제는 메모리 보호 기능을 통해 시스템 장애를 방지할 수 있다.
  • 하드웨어 및 소프트웨어 오류는 일시적인 경우(예: 네트워크 과부하)와 영구적인 경우(예: 디스크 컨트롤러 고장)로 나뉜다.
  • 일시적인 오류는 재시도(retry)로 복구될 수 있지만, 영구적인 오류는 복구가 어렵다.
  • 대부분의 I/O 시스템 호출은 성공 또는 실패 여부만 반환한다.

12.4.6 I/O 보호 (I/O Protection)

  • 사용자가 불법적인 I/O 명령을 실행하는 것을 방지하기 위해, 운영체제는 I/O 명령을 특권 명령으로 지정한다.
  • 즉, 사용자는 직접 I/O 명령을 실행할 수 없으며, 운영체제에 시스템 호출을 요청해야 한다.
  • 운영체제는 요청의 유효성을 확인한 후 I/O를 수행한다.
  • 또한, 메모리 매핑 및 I/O 포트에 대한 접근을 보호하여 무단 접근을 차단한다. 다만, 그래픽 게임이나 동영상 편집 소프트웨어의 성능을 고려해 일부 메모리에 대한 접근을 허용하는 경우도 있다.

아래는 생략.. 그냥 이러쿵 저러쿵