본문 바로가기
👨‍💻Computer Science/운영체제[OS]

[운영체제] 13장 I/O Systems

by 코푸는 개발자 2021. 6. 29.
728x90

I/O Hardware

I/O devices -> 모니터, 마우스 와 같이 입출력을 담당하는 장치

Common concepts

>Port 포트번호와 연결

>Bus (daisy chain or shared direct access) - I/O 디바이스 끼리 연결을 도와줌

>Controller (host adapter) - I/O장치의 제어와 타이밍을 조절함

 

A Typical PC Bus Structure -> I/O 디바이스 구조

데이터를 주고받을 때 디바이스 안에 내장되어 있는 컨트롤러를 통해서 디바이스를 제어를 하고 PCI bus를 통해 전송함

 

 

Device Controller -> 디바이스 간의 통신을 도와줌

>I/O devices 구성요소

기계적인 요소

전기적인 요소 - > Device Controller라고 함

>The electronic component is the device controller

- 전기적인 요소를 Device Controller라고 함

>Controller’s tasks

들어오는 데이터를 디스크에 쓰는 역할을 하고 하드웨어적인 에러 컬렉션기능도 수행함

메인메모리를 사용하게끔 만들어줌

 

 

Direct I/O(메인메모리의 주소체계에 속하지 않는 주소체계인 I/O 포트 넘버를 사용하여 할당함 -> I/O 포트 넘버에 접근하기 위해서는 다른 방식이 필요함, 인텔프로세스에서 사용 중) -> I/O디바이스에서 데이터를 받아올 때 어떻게 해야할까?

-> 어떠한 주소를 가지고 데이터를 불러오게 해야함.

-> 표에 나와 있는 주소 값을 통해서 정보를 가지고 오는 동작을 진행할 수 있음.

 

 

Memory-Mapped I/O

->Direct I/O 방식과 반대되는 방식

->메인메모리의 주소체계와 I/O 디바이스의 주소체계를 하나로 통합해서 같이 사용하는 것

장점 : 하나로 통합해서 사용하기 때문에 주소 값 자체로 메인메모리 주소인지 I/O디바이스 주소인지 구분이 가능함 -> 일반적인 명령어를 사용하여 I/O디바이스에 접근이 가능함

 

I/O 디바이스 I/O 디바이스에서 이벤트가 들어오면 Interrupt가 걸림

Polling vs. Interrupts

Polled I/O

-> I/O 디바이스에 변화가 있는지 지속적으로 감시를 하는 방식

-> CPUI/O 컨트롤러의 작업이 끝났는지 주기적으로 loop를 돌면서 전달을 반복하는 방시

-> 반복적으로 진행되기 때문에 상당히 비효율적임 -> 이에 따라 Interrupt이 나옴

-> 네트워크 장치에서 많이 사용

 

Interrupt-driven I/O

-> HW 컨트롤러가 자신의 상태가 바뀔 때마다 CPU에게 통보를 하는 방식

->Polling보다는 효율적임

단점

높은 처리량을 요구하는 I/O 장치에서는 오버헤드가 많아짐

 

>>키보드와, 마우스 같이 대기시간이 긴 장치에 대해서는 interrupt방식을 사용함

 

Interrupt-Driven I/O Cycle -> Interrupt 과정

앞에서 배움

 

Intel Pentium Processor Event-Vector Table

-> Interrupt 예제

 

 

Direct Memory Access(DMA)

-> 디스크가 데이터를 읽어서 메모리에 가져다 놓을 때 CPU가 계속해서 중재를 하게 되면 CPU가 하는 일이 많아지기 때문에 디스크 컨트롤러가 직접메모리에 올려놓는 방식

I/O 디바이스가 직접 메모리에 접근을 해서 데이터를 올려놓고 받아옴.

-> CPU의 개입 없이 주변장치에 데이터를 직접 전송할 수 있음(장점)

Interrupt 발생 횟수를 줄여주어 시스템 효율을 높여줌.

 

DMA 데이터 전송 과정

-> DMA 컨트롤러가 CPU memory bus를 통해서 CPU와 통신을 하고 있음.

DMA 컨트롤러는 PCI bus를 통해서 다른 I/O 장치와 통신할 수 있게 해줌

-> CPU가 명령을 DMA에게 주어서 수행하게 함

-> DMACPU의 일을 대신해줌

 

 

DMA

DMA의 동작 모드

>Cycle stealing

- DMA 컨트롤러와 CPU가 동시에 bus를 사용하고자 할 때 속도가 빠른 CPU가 속도가 느린 DMA에게 bus 사용 우선순위를 주어서 빠른 입출력을 가능하게 하는 것

>Burst mode

- 전체 데이터 블록을 하나의 연속된 시퀀스로 전송을 하는 방식

- CPU로부터 전송 권한을 받아서 전송함 -> 블록 전송모드라고 말하기도 함

>>DMA는 각 디바이스가 I/O장치에 직접 접근을 가능하게 하는 것

 

 

Addressing in DMA -> DMA에서 사용하는 주소

-> Physical address 대부분 사용

-> Virtual address 거의 사용x

 

Application I/O Interface

동일한 기기를 묶어서 동일하게 하드웨어기능을 수행 할 수 있게 명령어를 system call을 통해 내림. -> I/O 시스템 콜을 통해서 하드웨어를 제어함 -> 캡슐활 필요

-> 회사별로 구분이 없이 장치로만 인식해서 사용 가능하게 해줌

디바이스들을 분류할 수 있음 (읽어볼 것)

 

A Kernel I/O Structure -> 커널 입출력 구조(계층적 구조)

각각의 디바이스를 컨트롤러가 제어를 함

->여러 입출력 하드웨어들의 차이를 숨기고 간단한 표준 인터페이스로 제어를 가능하게 해서 상위의 커널 입출력 서브시스템에게 제공함. -> 입출력 서브시스템은 하드웨어와 독립적인 운영이 되어서 운영체제 개발자의 작업을 간단하게 해줌

ex. cin을 입력했을 때 모든 기종의 키보드로 입력이 가능한 이유

 

 

Block and Character Devices

Block Devices 개별 장치 바이트 단위가 아닌 블록단위로 접근하는 장치, H/D, 대용량 저장장치 -> 명령어 read, write, seek

Character Devices 한 번에 한문자 씩 전송하는 장치

명령어 get, put을 통해 제어를 함

 

 

Network Devices -> 데이터를 패킷 단위로 받아옴

-> 패킷을 IP 프로토콜을 처리해 주어야함(운영체제에서 처리를 해서 운영 단으로 보내는 처리를 해야함)

 

 

Clocks and Timers

Clocks 컴퓨터를 끄더라도 시간은 지속적으로 카운트되게 해주는 것(현재 시간 유지)

Timers RR등에서 정해진 타임퀀텀만큼 지속적으로 인터럽트를 거는 것

 

 

Blocking(어떠한 것을 막는 것) and Nonblocking I/O

>Blocking I/O

-> 시스템 콜이 들어오면 커널은 I/O작업이 완료되기 전에는 응답을 하지 않는 것(다른 작업을 수행하지 못하게 하는 것, ex. cin)

-> I/O작업 수행이 완료되기 전까지는 권한을 커널이 가지고 있음

>Nonblocking I/O

-> 시스템 콜이 들어오면 커널이 I/O 작업을 하는 것과 무관하게 응답을 줌 -> 커널이 권한을 바로 유저 프로세스에게 넘김 -> 유저 프로세스는 I/O작업이 완료되기 전에도 다른 작업을 수행할 수 있음, 유저 프로세스가 중간 중간 시스템 콜을 보내서 I/O가 완료가 되었는지(커널에게 물어봄) 확인하는 과정이 있음

 

 

Kernel I/O Subsystem

-> 커널과 디바이스 드라이버 사이에 존재

-> I/O 디바이스 장치(느림)CPU(빠름) 간에 처리속도 동기를 맞춰주는 역할을 함

 

Sun Enterprise 6000 Device-Transfer Rates

-> 각 기기들 전송비율이 다름

 

 

Kernel I/O Subsystem

-> 성능을 높이기 위한 방법

>Caching 앞에서 많이 배움

>Spooling 버퍼(메인메모리에서 수행)와 유사, 파일로 저장을 해서 버퍼기능 수행, ex. printing(파일단위로 스케줄이 정리됨)

>Device reservation

 

 

Error Handling -> 에러 발생을 잘 처리해야함

 

 

Life Cycle of An I/O Request

-> 시스템 콜을 통해서 커널 모드로 들어가서 처리가 필요

-> 캐시메모리부터 확인(요청이 오면 우선적으로 수행)

 

 

Device-Functionality Progression

운영체제 위에서 프로그램을 구현하는 것이 좋음

-> 아래쪽으로 갈수록 코딩이 어려워짐

-> but 아래쪽에서 구현하는 것이 빠름

-> 아래쪽이 비용(시간)이 많이 나옴

-> 추상화는 위로 갈수록 편해짐 -> 그러나 아래로 갈수록 추상화가 많아짐

-> read와 같은 명령을 application 단에서 구현한다면 세세한 작동들도 구현을 해주어야함 -> 이렇게 되면 더 번거로워진 것임 -> 아래에서 구현이 되어있지 않다면 위로 갈 수 록 번거로워짐 -> 알고리즘 소스코드는 하드웨어 단에 있어야 손쉽게 사용이 가능함 -> 어느 레벨 단에서 구현하는지가 중요한 아래 레벨에서 구현될수록 위에서 사용될 때 추상화정도가 높아짐

-> 위로 갈수록 수정에 대한 유연성이 높아짐

 

 

I/O Systems Layers

13장에서 가장 중요한 그림

프로그램에서 I/O를 요청하게 되면 -> Device-independent software를 통해서 디바이스 드라이브 요청을 보냄 -> Device drivers는 하드웨어로 컨트롤러에 의해서 보내게 됨 -> 하드웨어는 컨트롤러에 의해서 제어가 되어서 결과 값을 받아오게 되면 결과 값을 Interrupt handlers를 통해서 데이터를 주고 Interrupt handlers의한 결과는 Device driver를 통해서 올려 보내고 Device-independent software를 통해서 유저프로세스에게 I/O에 대한 응답을 줌

>>핵심내용

728x90

댓글