공부한거 정리하는 노트에요

[OS] I/O Device

by 구설구설

I/O 디바이스: 컴퓨터와 외부 세계 간의 데이터 입력과 출력을 담당하는 장치이다.

 

전형적인 I/O 디바이스

디바이스 인터페이스

I/O 디바이스한테 명령어를 보내고 I/O 디바이스로부터 데이터를 가져오는 CPU와 연결되어 있는 부분.

레지스터: I/O 디바이스의 상태 및 데이터를 저장하는 장소.

  • 상태 (Status): 디바이스의 현재 상태를 나타냄.
  • 명령 (Command): 디바이스에 특정 작업을 수행하도록 지시하는 명령.
  • 데이터 (Data): 디바이스와 교환되는 실제 데이터.

 

디바이스 내부의 숨어있는 디테일

디바이스의 기능을 수행하는 여러 요소가 디바이스 내부에 있으며, 이는 OS가 다룰 수 없다.

마이크로컨트롤러: I/O 디바이스의 제어 및 동작을 담당하는 마이크로컨트롤러. 일종의 CPU이다.

메모리: 디바이스의 작업 중 데이터를 저장하는 DRAM 또는 SRAM 메모리.

펌웨어: 디바이스의 CPU나 메모리를 활용하여 디바이스의 동작을 제어하는 소프트웨어.

 

I/O 저장 공간

I/O 디바이스에 값을 쓰거나 읽기 위해 디바이스 인터페이스에 있는 레지스터를 식별하는 방법이다.
디바이스의 레지스터를 포트(Port)라고 부르기도 한다.

 

Port-mapped I/O (Special Instruction)

Port-mapped I/O에서는 포트가 모여있는 자체 주소 공간이 있다.
예를 들어, 첫 번째 하드디스크의 스테이터스 레지스터는 0부터 1바이트에 위치한다고 지정할 수 있다.
이 방법을 통해 I/O 포트에 특정 주소를 지정하면 해당 디바이스와 연결되어 명령어를 보내거나 데이터를 읽어올 수 있다.

 

Memory-mapped I/O

디바이스 포트를 물리 메모리의 일부 위치에 매핑을 하는 방법이다.
이 방법을 통해 Special Instruction을 쓰지 않고 load/store 명령어로만 I/O 명령어를 수행할 수 있다.

물리 메모리에 매핑되어 있는 포트를 가상 메모리의 커널 영역의 일부분에 매핑하여 가상주소를 획득하고,
이를 통해 프로세스에서 I/O 디바이스에 접근할 수 있다.

 

Hybrid 

위의 두가지를 함께 사용하는 방법이다.

 

과거에는 Port-mapped I/O를 썼지만 요즘에는 Memory-mapped I/O를 사용한다.

 

Data Transfer Modes (데이터 전송 모드)

PIO (Programmed I/O) 

CPU가 I/O 장치와 메모리 간 데이터 이동에 관여한다.

특별한 I/O 명령어 또는 메모리 매핑된 I/O를 통해 수행한다.

I/O 디바이스가 CPU에 비해 너무 느리기 때문에 CPU가 낭비되는 시간이 발생한다.

 

DMA (Direct Memory Access)

DMA 컨트롤러가 로컬 버퍼의 데이터 블록을 CPU 개입 없이 직접 메인 메모리로 전송 

 

Event Notification to CPU

Polling

CPU가 while 루프를 계속 돌면서 I/O 디바이스가 Ready상태인지 Busy상태인지 계속 체크하는 방법이다.

CPU의 시간을 낭비하게 된다.

 

Interrupt

디바이스가 CPU에 I/O 작업이 끝났음을 알려주는 방법이다.

 

 

I/O 디바이스의 분류

Block Device - 하드디스크, 테이프 등

데이터를 크기 블록이라고 지칭하는 특정한 단위로 저장한다.

각 블록은 주소가 존재하고, 디바이스는 주소를 통해 데이터에 접근해 저장하고 읽는 행위를 할 수 있다.

블록의 크기는 다양하다.

 

 

Character Device - 마우스, 키보드 등

주소를 통해 데이터에 접근할 수 없는 디바이스이다.

일련의 Character 형태로 데이터를 주고 받는다.

 

I/O Stack (I/O 스택)

I/O 스택

OS 내부에서 I/O 디바이스와의 상호작용을 위해 소프트웨어를 계층적으로 쌓아 관리하는 것

 

User Process가 I/O 요청을 보내기 위해 read, write와 같은 명령어를 사용한다.

예를 들어, 프린터를 여러 사용자가 공유할 경우, 동시에 출력 명령을 보내면 출력물이 뒤섞일 수 있다.

이를 방지하기 위해 스풀링(spooling)을 사용하여 출력물을 순서대로 처리한다.

 

Device-independent software는 디바이스에 무관하게 공통으로 필요한 작업들을 처리한다. 예를 들어, 디바이스의 이름을 찾거나, 디바이스가 사용 중이면 대기하고, 버퍼링 및 버퍼 할당 등을 수행한다.

 

사용자 입장에서는 모든 디스크가 동일해 보이지만,실제로는 각 디바이스에 따라 명령어 전달 방식이 다르다.

이를 처리하는 레이어가 Device Driver이다.

디바이스 드라이버는 각 디바이스의 특성에 맞게 프로그래밍되어야 하며,

디바이스 드라이버 레이어에서 이 작업을 수행한다.

 

Device Driver

디바이스 드라이버는 OS의 일부분으로, 커널 모드에서 동작한다.

OS와 인터페이스를 통해 표준화된 모델을 사용하여 동작한다.

시스템 부팅 중, 실행 중에 선택적이고 동적으로 로딩될 수 있다.

 

디바이스가 작업을 끝내면 보통 인터럽트가 발생한다.

인터럽트는 디바이스가 작업을 완료했음을 CPU에 알리는 신호이다.

Interrupt handler는 이러한 신호를 받아서 하드웨어를 깨운다.

 

Interrupt Handling

 

인터럽트 핸들링은 보통 다음과 같은 세 가지 파트로 구성된다:

  1. 크리티컬 액션 수행: 인터럽트가 발생하면 즉시 중요한 작업을 수행한다.
    먼저 인터럽트 컨트롤러에게 신호를 보낸다. 이 신호는 인터럽트를 받았음을 확인하는 과정이다.
    이후 디바이스 컨트롤러에게도 인터럽트를 받았다는 신호를 보낸다.
    이 과정에서 디바이스와 CPU가 동시에 참조하는 구조체를 업데이트한다.
  2. 논 크리티컬 액션 수행: 중요한 작업이 완료된 후 덜 중요한 작업을 수행한다.
    필요한 경우 인터럽트를 다시 활성화한다.
    CPU만 접근할 수 있는 데이터 구조체를 업데이트한다.
  3. 인터럽트 컨텍스트 종료: 마지막으로 인터럽트 컨텍스트를 종료한다. 
    이 작업은 지연될 수 있다.
    버퍼에 저장되어 있는 내용을 프로세스로 전달한다.

 

I/O Methods

유저 프로세스 관점에서 I/O를 수행하는 세 가지 방법.

 

동기적 I/O (Synchronous I/O)

  1. 블로킹 I/O (Blocking I/O):
    • 예를 들어 유저가 read 시스템 호출을 요청하면,
      read 함수가 리턴될 때까지 요청한 데이터가 모두 버퍼에 읽혀 있어야 한다.
    • 블로킹 I/O는 요청이 끝날 때까지 프로세스가 대기 상태가 된다.
      즉, 프로세스가 I/O 작업이 완료될 때까지 실행을 멈춘다.
    • 블로킹 I/O는 요청한 작업이 완료될 때까지 프로세스가 기다리기 때문에 간단하고 직관적이다.
  2. 논블로킹 I/O (Non-blocking I/O):
    • I/O 요청을 보내면, 가능한 만큼의 데이터를 즉시 반환하고 리턴한다.
      예를 들어, 4KB를 읽기 요청했지만, 커널 버퍼에 1KB만 있으면 1KB만 반환하고 리턴한다.
    • 프로세스는 I/O 작업이 완료될 때까지 기다리지 않고, 남은 작업은 다음 호출에서 계속 처리한다.
    • 논블로킹 I/O는 요청한 작업을 즉시 처리하지만, 모든 데이터를 처리하지 못할 수 있다.
      이 경우 프로그래머가 추가적인 처리를 해야 한다.

 

비동기 I/O (Asynchronous I/O)

  1. 비동기 I/O (Asynchronous I/O):
    • I/O 요청을 보내면, 즉시 리턴하고 프로세스는 계속 실행된다.
    • I/O 작업이 완료되면, 나중에 알림을 받거나 결과를 확인할 수 있다.
    • 비동기 I/O는 I/O 작업과 프로세스 실행을 동시에 수행할 수 있어 효율적이지만, 프로그래밍이 복잡할 수 있다.

 

 

Device Drivers and OS Reliability

디바이스 드라이버의 역할

  • 다양한 디바이스를 제어하며, 각 디바이스마다 고유한 프로토콜이 있다.
  • OS의 상당 부분을 차지하는 것은 디바이스 드라이버 코드이다.디바이스 드라이버와 OS:
    • 커널 모드에서 동작하며, 시스템의 보안과 안정성을 유지해야 한다.
    • 덜 숙련된 프로그래머가 작성하거나, 새로운 디바이스에 빠르게 대응해야 해서 안정화에 시간이 걸릴 수 있다.
    • OS에서 발생하는 블루 스크린 등의 문제는 종종 디바이스 드라이버와 관련이 있다.

디바이스 드라이버의 중요성

  • OS의 기능을 확장하며, 커널 코드의 약 70%를 차지한다.
  • 윈도우즈 OS에는 약 35,000개의 드라이버가 120,000개의 버전으로 존재한다.
  • 안전성과 안정성을 확보하는 것이 중요하다.

디바이스 드라이버와 OS

  • 커널 모드에서 동작하며, 시스템의 보안과 안정성을 유지해야 한다.
  • 덜 숙련된 프로그래머가 작성하거나, 새로운 디바이스에 빠르게 대응해야 해서 안정화에 시간이 걸릴 수 있다.
  • OS에서 발생하는 블루 스크린 등의 문제는 종종 디바이스 드라이버와 관련이 있다.

'CS > OS' 카테고리의 다른 글

[OS] 듀얼 모드 (Dual Mode, 이중 모드)  (0) 2024.12.12
[OS] 프로세스  (0) 2024.12.11
[OS] 운영체제란?  (0) 2024.12.11
[OS] SSD  (0) 2024.05.24
[OS] 하드 디스크  (0) 2024.05.23

블로그의 정보

공부중임

구설구설

활동하기