운영체제(12) - I/O Systems -

Shy·2023년 5월 19일
0

운영체제

목록 보기
6/8

학습 목표 및 학습 내용

학습 목표

  • 입출력 시스템을 설명할 수 있다.

학습 내용

  • I/O Hardware
  • Application I/O Interface
  • Kernel I/O Subsystem

Modern I/O Systems

  • CPU interacts with a device controller.
    • Device controller contains a set of registers that can be read and written.
  • 운영체제에서의 I/O 시스템은 컴퓨터 하드웨어와 사용자 프로그램 간에 데이터를 전송하는 데 사용된다. 현대 I/O 시스템은 주로 세 가지 방식으로 데이터를 전송한다.
    • 프로그램 I/O
    • 메모리 맵핑된 I/O
    • 직접 메모리 접근(DMA)

Programmed I/O

Port I/O

  • Special processor instructions are used to transfer data.
    • in/out instructions in Intel architecture.
  • Each device uses a different I/O port. (port number)

Memory-mapped I/O

  • The registers in device controller are mapped into physical address space.
    • Addresses are set by hardware jumpers or programming at boot time.
  • I/O is accomplished with load and store instructions.
  • Since I/O address space occupies a range in the system memory address space, it is not available for processes.

프로그램 I/O

  • 포트 I/O: 특수 프로세서 명령을 사용하여 데이터를 전송한다. 인텔 아키텍처에서는 in/out 명령어를 사용한다. 각 장치는 고유한 I/O 포트(포트 번호)를 사용한다.
  • 메모리 맵핑된 I/O: 장치 컨트롤러의 레지스터가 물리적 주소 공간에 매핑된다. 주소는 하드웨어 점퍼 또는 부팅 시 프로그래밍에 의해 설정된다. I/O는 load 및 store 명령어를 사용하여 수행된다. I/O 주소 공간이 시스템 메모리 주소 공간의 범위를 차지하기 때문에 프로세스에 사용할 수 없다.

Direct Memory Access

Direct Memory Access

  • Used to avoid programmed I/O for large data movement.
  • Gives the access to memory bus to the DMA controller.
  • Bypasses CPU to transfer data directly between I/O device and memory.
  • Six Step Process to Perform DMA Transfer

직접 메모리 접근 (DMA): 큰 데이터 이동에 프로그램 I/O를 피하기 위해 사용된다. 메모리 버스에 DMA 컨트롤러에 대한 액세스 권한을 부여한다. I/O 장치와 메모리 간에 데이터를 직접 전송하기 위해 CPU를 우회한다. DMA 전송을 수행하는 데 여섯 단계의 프로세스가 있다.

  1. 디바이스 드라이버가 디스크 데이터를 주소 X의 버퍼로 전송하도록 지시한다.
  2. 디바이스 드라이버가 디스크 컨트롤러에게 디스크에서 주소 X의 버퍼로 C 바이트를 전송하도록 지시한다.
  3. 디스크 컨트롤러가 DMA 전송을 시작한다.
  4. 디스크 컨트롤러는 각 바이트를 DMA 컨트롤러에게 보낸다.
  5. DMA 컨트롤러는 버퍼 X로 바이트를 전송하고 메모리 주소를 증가시키고 C를 감소시킨다. C가 0이 될 때까지 이 과정을 반복한다.
  6. C가 0이 되면 DMA는 전송 완료를 알리기 위해 CPU에 인터럽트를 보낸다.

Polling vs. Interrupt

  • OS needs to know when I/O device has completed an operation.
  • Interrupt
    • I/O device generates an interrupt whenever it needs service.
    • Handles unpredictable events well.
    • Is handled in device driver.
  • Polling
    • I/O device puts completion information in status register.
    • OS periodically checks a device-specific status register.
    • It may waste many cycles if infrequent or unpredictable I/O operations.
  • Some devices combine both polling and interrupts.
    • E.g. High bandwidth network device
      • Interrupt for first incoming packet.
      • Polling for following packets.

폴링(Polling) vs 인터럽트(Interrupt):
운영 체제는 I/O 장치가 작업을 완료했을 때 알아야 한다. 이를 위해 폴링과 인터럽트라는 두 가지 방법이 사용된다.

  • 인터럽트: I/O 장치가 서비스가 필요할 때마다 인터럽트를 생성한다. 예측할 수 없는 이벤트를 잘 처리하며, 디바이스 드라이버에서 처리된다.
  • 폴링: I/O 장치는 완료 정보를 상태 레지스터에 넣는다. 운영 체제는 주기적으로 장치별 상태 레지스터를 확인한다. 드문 또는 예측할 수 없는 I/O 작업의 경우 많은 사이클을 낭비할 수 있다.
  • 일부 장치는 폴링과 인터럽트를 결합하여 사용한다. 예를 들어, 고대역폭 네트워크 장치는 첫 번째 들어오는 패킷에 대해 인터럽트를 사용하고, 다음 패킷에 대해서는 폴링을 사용한다.

폴링(Polling)과 인터럽트(Interrupt) 모두 I/O 장치의 상태를 체크하는 방법입니다. 하지만 두 방법은 작동 원리와 적합한 사용 상황에서 차이가 있습니다.

폴링(Polling):
폴링은 CPU가 주기적으로 I/O 장치의 상태를 체크하는 방식입니다. CPU는 "작업이 완료되었나요?"라는 질문을 지속적으로 I/O 장치에게 보냅니다. 만약 작업이 완료되었다면, 데이터를 받아 처리합니다. 하지만 폴링 방식의 단점은, I/O 작업이 완료되지 않았음에도 불구하고 CPU가 계속 상태를 확인하기 때문에, CPU 자원이 낭비될 수 있습니다. 따라서 폴링 방식은 I/O 작업의 완료 시점을 정확히 예측할 수 없거나, 작업의 빈도가 낮은 경우에는 효율적이지 않습니다.

인터럽트(Interrupt):
인터럽트 방식에서는, I/O 장치가 작업을 완료하면 CPU에게 직접 신호를 보냅니다. 이 신호를 받은 CPU는 현재 진행 중인 작업을 일시 중단하고(이를 인터럽트라고 합니다), I/O 작업의 결과를 처리합니다. 처리가 끝나면 중단했던 작업을 다시 시작합니다. 인터럽트 방식의 장점은 CPU가 I/O 장치의 상태를 계속 확인하지 않아도 된다는 것입니다. 그러나 이 방식에서는 인터럽트 처리 오버헤드가 발생할 수 있습니다. 즉, 인터럽트가 발생할 때마다 CPU는 현재 작업을 중단하고, 인터럽트 처리를 위한 컨텍스트 스위칭을 수행해야 합니다.

폴링과 인터럽트 방식을 결합하여 사용하는 경우도 있습니다. 예를 들어, 데이터 패킷이 도착할 때마다 인터럽트를 발생시키는 대신, 패킷이 여러 개 도착했을 때 한 번에 인터럽트를 발생시키고, 그 사이에는 폴링을 수행하는 방식을 사용할 수 있습니다. 이런 방식은 고속 네트워크 인터페이스에서 효과적일 수 있습니다.

Standard Interfaces to Devices

Block Devices

  • Data is accessed in a block unit.
  • E.g. Hard disk, tape, SSD
  • Commands include read(), write(), and seek().
  • File system or raw I/O access.

Character Devices

  • E.g. keyboard, mouse, printer.
  • Single characters at a time.
  • Commands include get() and put().

Network Devices

  • E.g. Ethernet, Wireless, Bluetooth
  • Unix and Windows include socket interface.
  • Commands include create(), connect(), listen(), accept(), send(), and receive().

표준 장치 인터페이스:

  • 블록 장치(Block Devices): 데이터는 블록 단위로 접근된다. 하드 디스크, 테이프, SSD 등이 있으며, read(), write(), seek() 같은 명령어를 사용한다. 파일 시스템 또는 raw I/O 접근이 가능하다.
  • 캐릭터 장치(Character Devices): 키보드, 마우스, 프린터 등이 있으며 한 번에 하나의 문자를 처리한다. get() 및 put()과 같은 명령어를 사용한다.
  • 네트워크 장치(Network Devices): 이더넷, 무선, 블루투스 등이 있으며, 유닉스와 윈도우는 소켓 인터페이스를 포함한다. create(), connect(), listen(), accept(), send(), receive() 등의 명령어를 사용한다.

Blocking and Non-blocking I/O

Blocking I/O - “Wait”

  • Process is suspended until I/O completed.
  • When request data (e.g. read() system call), process goes to sleep until data is
    ready.
  • When write data (e.g. write() system call), process goes to sleep until data is
    written.

Non-blocking I/O - “Don’t Wait”

  • Returns quickly from read or write request with count of bytes successfully
    transferred.

블로킹 I/O와 논블로킹 I/O:

  • 블로킹 I/O(Blocking I/O): 프로세스는 I/O가 완료될 때까지 중단된다. 데이터를 요청할 때 (예: read() 시스템 호출), 데이터가 준비될 때까지 프로세스는 대기 상태가 된다. 데이터를 쓸 때 (예: write() 시스템 호출), 데이터가 기록될 때까지 프로세스는 대기 상태가 된다.
  • 논블로킹 I/O(Non-blocking I/O): 논블로킹 I/O는 read 또는 write 요청에서 빠르게 반환하며, 성공적으로 전송된 바이트 수를 알려준다. 이 방식에서 프로세스는 I/O 작업이 완료될 때까지 기다리지 않고 다른 작업을 계속 수행할 수 있다. 데이터가 준비되지 않은 상태에서 read()를 호출하면 논블로킹 I/O는 즉시 반환하고, 읽을 수 있는 데이터가 없음을 알려준다. 비슷하게, write()를 호출할 때 논블로킹 I/O는 가능한 한 빨리 데이터를 쓰고 성공적으로 기록된 바이트 수를 반환한다. 이를 통해 프로세스가 I/O 작업과 병렬로 다른 작업을 수행하도록 해서 전체적인 성능 향상을 이룰 수 있다.

Kernel I/O Subsystem

I/O subsystem

  • A simple example for output to device.
  • This code works on many different devices.
  • I/O subsystem provides the standard interface to different devices.
  • create, open, read, write, close, etc.
  • I/O subsystem provides a framework for cooperating with device drivers.

Device Driver

  • Device-specific code in the kernel that interacts directly with the device hardware.

커널 I/O 서브시스템
커널 I/O 서브시스템은 운영체제의 일부로, 다양한 I/O 장치와의 표준 인터페이스를 제공하며, 장치 드라이버와 협력하는 프레임워크를 제공한다.

  • I/O 서브시스템: 다양한 장치에서 작동하는 간단한 출력 예제를 사용하여 I/O 서브시스템이 표준 인터페이스를 제공하는 방식을 확인할 수 있다. 이 인터페이스에는 create, open, read, write, close 등의 함수가 포함되어 있다.
  • 장치 드라이버: 장치 드라이버는 커널 내의 장치별 코드로, 장치 하드웨어와 직접 상호작용한다.

Kernel I/O Subsystem

  • A kernel I/O structure

커널 I/O 서브시스템 구조: 커널 I/O 구조는 프로세스와 커널의 I/O 서브시스템, 그리고 각 장치 드라이버와의 연결을 보여준다. 예를 들어, 프로세스 2의 애플리케이션에서 마우스로부터 read() 함수를 호출하면 커널 I/O 서브시스템의 read() 함수와 연결되고, 마우스 장치 드라이버의 mouse_read() 함수와 연결된다. 프로세스 3에서는 프린터로 write() 함수를 호출하면 커널 I/O 서브시스템의 write() 함수와 연결되고, 프린터 장치 드라이버의 printer_write() 함수와 연결된다.

Kernel I/O Subsystem

  • I/O Scheduling
    • Reorders the I/O requests for I/O performance improvement.
    • E.g. disk I/O scheduling – SSTF, SCAN, C-SCAN, etc.
  • Buffering
    • Stores data in memory while transferring between devices
      • to cope with device speed mismatch.
      • to cope with device transfer size mismatch.
  • Caching
    • Holds copies of data in fast memory for I/O performance improvement.
  • Spooling
    • Holds output for a device that cannot accept interleaved data streams.
    • E.g. printer

커널 I/O 서브시스템 기능:

  • I/O 스케줄링: I/O 성능 향상을 위해 I/O 요청을 재정렬한다. 예를 들어, 디스크 I/O 스케줄링에는 SSTF, SCAN, C-SCAN 등의 알고리즘이 있다.
  • 버퍼링: 장치 간 데이터 전송 중에 메모리에 데이터를 저장한다. 장치 속도 불일치와 장치 전송 크기 불일치를 처리하는 데 사용된다.
  • 캐싱: I/O 성능 향상을 위해 빠른 메모리에 데이터 사본을 유지한다.
  • 스풀링: 중첩된 데이터 스트림을 수용할 수 없는 장치(예: 프린터)에 대한 출력을 보유한다. 이를 통해 한 장치에서 다른 장치로 데이터가 전송되는 동안 출력을 관리할 수 있다.

Kernel I/O Subsystem

  • A blocking read request example

이 그림은 커널 I/O 서브시스템에서 블로킹 리드 요청을 처리하는 과정을 보여준다. 각 단계는 다음과 같다.

  1. I/O 요청: 프로세스가 I/O를 요청한다 (예: read() 시스템 호출).
  2. 요청을 이미 만족시킬 수 있는지 확인: 만약 이미 요청을 충족시킬 수 있는 데이터가 있다면, 곧바로 9단계로 이동한다.
  3. 장치 드라이버에 요청 전달, 필요한 경우 프로세스 차단: 요청을 장치 드라이버로 전달하고, 블로킹 모드의 경우 프로세스를 차단한다.
  4. 요청 처리 및 컨트롤러 명령 발행: 장치 드라이버가 요청을 처리하고, 컨트롤러에 명령을 전달하여 I/O 작업이 완료될 때까지 컨트롤러를 차단한다.
  5. 장치 모니터링 및 I/O 완료 시 인터럽트 발생: I/O 서브시스템이 장치를 모니터링하고, I/O 작업이 완료되면 인터럽트를 발생시킨다.
  6. I/O 작업 완료 및 인터럽트 발생: I/O 작업이 완료되고 인터럽트가 발생한다.
  7. 인터럽트 수신, 입력 데이터의 경우 장치 드라이버 버퍼에 데이터 저장 및 장치 드라이버 차단 해제 신호 전달: 인터럽트를 수신하고, 입력 데이터가 있는 경우 장치 드라이버 버퍼에 데이터를 저장한 다음, 장치 드라이버의 차단을 해제하도록 신호를 전달한다.
  8. 완료된 I/O 작업 식별 및 I/O 서브시스템에 상태 변경 표시: 완료된 I/O 작업을 확인하고, I/O 서브시스템에 상태 변경을 나타낸다.
  9. 필요한 경우 프로세스에 데이터 전송 및 완료 또는 오류 코드 반환: 데이터를 프로세스에 전송하고(입력의 경우), 완료 또는 오류 코드를 반환한다.
  10. I/O 완료, 입력 데이터 사용 가능 또는 출력 완료: I/O 작업이 완료되어 입력 데이터가 사용 가능하거나 출력이 완료된다.

만약 2단계에서 이미 요청을 충족시킬 수 있는 경우, 곧바로 9단계로 이동하여 데이터를 전송하고 작업을 완료한다.

Summary

  • Moving data between devices and memory is performed by CPU as programmed I/O or is offloaded to a DMA controller.
  • OS knows when I/O device has completed an operation by means of interrupt and polling.
  • For application interface, I/O devices can be divided into block devices, character devices, and network devices.
  • I/O subsystem provides the standard interface to different devices as well as a framework for cooperating with device drivers.
  • I/O subsystem also provides numerous services: I/O scheduling, buffering, caching, and spooling.
  • CPU는 프로그래밍된 I/O로 장치와 메모리 간 데이터를 이동시키거나, DMA 컨트롤러에 오프로드할 수 있다.
  • 운영체제는 인터럽트와 폴링을 통해 I/O 장치가 작업을 완료했는지 확인한다.
  • 애플리케이션 인터페이스 관점에서 I/O 장치는 블록 장치, 문자 장치, 네트워크 장치로 나눌 수 있다.
  • I/O 서브시스템은 다양한 장치에 대한 표준 인터페이스를 제공하며, 장치 드라이버와 협력하는 프레임워크를 제공한다.
  • I/O 서브시스템은 또한 다양한 서비스를 제공한다: I/O 스케줄링, 버퍼링, 캐싱, 스풀링.
profile
스벨트 자바스크립트 익히는중...

0개의 댓글