나무 숲

Input & Output 본문

Career

Input & Output

wood.forest 2016. 6. 10. 17:54


* CPU와 I/O 장치들을 바로 direct로 연결할 수 있을까?

주변기기Peripheral의 종류가 많고, 다 다른 양의 데이터를 이동시키고, 다 속도가 다르고(CPU, RAM이  I/O 장치보다 빠르다 ) format이 다 다르다 

=> 속도별로 묶어서 버스Bus를 태우자!

I/O module이 필요하다

=> Interface to CPU~Memory, 여러 주변기기 (연결해주는 매개체같은 것)


옆 그림에서 System bus는 Internal device, Links to peripheral devices는 External device이다





External Devices

- 사람이 읽을 수 있는 것 : 스크린, 프린터, 키보드..

  기계가 읽을 수 있는 것 : Monitoring, control

  => 소통 : Modem & Network Interface Card


옆 그림에서 Buffer는 디지털, 환경으로부터 왔다갔다 하는 데이터는 아날로그이므로 중간의 Transducer가 변환+a 수행한다




I/O Modules

- 기능 : Control, Timing, CPU 커뮤니케이션, 장치 커뮤니케이션, 데이터 버퍼링, 에러 탐지


- 절차:

CPU가 I/O Module device 상태를 체크 -> I/O Module은 상태를 리턴 -> 준비되었으면 CPU는 Data transfer 요청 -> I/O Module은 장치로부터 데이터를 겟 -> I/O Module은 CPU에게 데이터를 transfer


- I/O Channel, I/O Processor라고 불리기도 한다

- CPU에게 장치의 속성을 숨기거나 드러낸다.

  다수의 혹은 하나의 장치를 support





- Input Output Techniques


 

 No Interrupts

 Use of Interrupts

 I/O -> memory

transfer through processor

 Programmed I/O

 Interrupt-driven I/O

 Direct I/O -> memory

transfer

 

 DMA




1 Programmed I/O

- CPU는 I/O에게 direct control (상태 감지, r/w 명령, 데이터 전송) 을 하고 I/O module이 연산을 끝내길 기다린다

    => CPU 시간 낭비! 

- 위 표를 보면 : CPU는 I/O 연산 요청 -> I/O module은 연산 수행 -> I/O module이 상태 비트 set -> CPU는 상태 비트 정기적으로 확인(polling) -> I/O module는 CPU에게 다이렉트로 알려주지 않는다, I/O module은 CPU를 interrupt 하지 않는다 -> CPU는 기다리거나 나중에 다시 와야 한다

- I/O instruction을 실행하기 위해 CPU는 

* Address - 모듈을 identify

* CPU issues command

Control (모듈에게 뭘 할지 말해주는것), Test (power인지 에러인지 상태 체크), Read/Write(모듈은 버퍼를 통해 장치와 데이터를 전송한다)


- Programmed I/O에서 데이터 전송Data transfer은 CPU관점에서 메모리 액세스와 비슷하다. 각 장치Device들이 unique identifier을 가졌고, CPU 명령어Command들은 identifier을 포함하고 있다 (Address)


- I/O Mapping

1) Memory Mapped I/O

- 장치와 메모리가 같은 address space를 공유한다

- I/O는 메모리 접근하듯 접근한다

- I/O에게 특별한 명령이 없다 (메모리 명령어로 I/O동작 수행)

- 더 효율적인 프로그래밍 가능 but valuable memory space가 사용되어 버린다


2) Isolated I/O

- address space가 분리되어 있다

- 라인을 선택하기 위해 I/O나 메모리가 필요하다

- I/O 명령어가 따로 있다 (Limited set)




2 Interrupt driven I/O

- CPU waiting을 극복! 장치에 대해 CPU 체킹이 반복적으로 이루어지지 않는다. 또한 I/O module이 준비되면 interrupt를 발생시킨다

- 위 표를 보면 : (예시에서는)CPU가 읽기 명령을 발생 (명령 발생 후 바로 다른일 한다) -> I/O 모듈은 명령을 받아들이고 CPU가 다른 작업을 하는 동안(각 instruction cycle이 끝나면 interrupt를 체크한다) 주변장치로부터 데이터를 겟 -> I/O이 데이터 교환Data exchange할 준비가 되면(예를 들어 데이터가 데이터 레지스터 안에서 준비되었을 때) CPU를 interrupt (Interrupt 되면 레지스터에 context를 저장하고 I/O모듈로부터 fetch data 후 메모리에 저장) -> CPU는 데이터를 요청(I/O 모듈은 CPU가 데이터를 요청하기 전까지 기다림. 데이터를 data bus에 놓고 다른 I/O operation을 기다림) -> I/O모듈은 데이터 전송 (CPU가 I/O로부터 데이터를 fetch하고 나면 restore context)


- 모듈이 interrupt 발생시켰는지 어떻게 알지? Identifying interrupting module

* 각 모듈에 다른 라인을... ->장치 개수를 제한한다

* Software poll : CPU가 각 모듈의 차례를 묻기 위해 branches to ISR... -> 느리다

* Daisy Chain or Hardware poll : chain으로 Interrupt acknowledge가 전송된다. module responsible places vector(메모리 주소) on bus, CPU는 handler routine을 identify하기 위해 vector 이용

* Bus Master : 모듈은 interrupt 하기 전 버스에게 미리 말한다 (e.g PCI, SCSI)


- multiple interrupt에 대해서는 어떻게 하지? (예를 들어 interrupt handler가 interrupt 될 수도)

* 만약 각 모듈에 다른 라인을 준다면 -> 각 interrupt 라인은 우선순위를 가진다. 높은 우선순위를 가진 라인은 낮은 우선순위를 가진 라인을 interrupt 할 수 있다

* 만약 software polling -> polling order according to priority

* 만약 daisy chaining -> 장치들은 chained based on priority

* 만약 bus mastering -> multiple interrupt를 고려하지 않고, 오직 현재의 마스터만 interrupt 가능



3 Direct memory Access (DMA)

- Interrupt driven, Programmed I/O는 CPU의 활발한 개입을 원한다 -> transfer rate가 한정되어 있고 CPU is tied up. 또한 Block transfer에 비효율적이므로 large volume of data를 전송하기 위해서는

  => DMA!


- (memory) bus에 추가적 모듈 탑재(h/w, DMA module). DMA module은 CPU가 사용하지 않을 때 버스를 사용하거나 CPU에게 강제로 일시적으로 중단하게 하여 cycle stealing (CPU와 DMA module 은 memory bus 접근 경쟁하며 CPU가 접근 안할 때 버스 사용하면 좋겠지만 CPU가 사용하면 접근 불가)


- CPU는 DMA controller에게 r/w, 장치 주소, 메모리 블럭이나 데이터의 시작 주소, 전송되어야 할 데이터 양을 말해주고, CPU는 다른 일을 한다. DMA controller은 deals with transfer 하고 끝나면 interrupt를 보낸다


- DMA transfer cycle stealing : DMA controller은 한 사이클동안 버스를 점거. Transfer of one word of data. interrupt가 아니다!!! (CPU가 context switch 하지 않는다) CPU는 버스에 액세스하기 전 멈춘다. CPU의 속도를 늦추지만 CPU가 전송하는 것만큼은 아니다.

- DMA configurations

* Single Bus, Detached DMA controller

* 각 전송은 버스를 두 번 이용한다 (I/O에서 DMA로, DMA에서 메모리로)

* CPU는 두 번 멈춘다 (메모리 접근해야 하므로)


* Single Bus, Integrated DMA controller

* Controller은 하나 이상의 장치를 support할 수 있다

* 각 transfer은 버스를 한 번만 사용한다 (DMA에서 메모리로)

* CPU는 한 번만 멈춘다

* Separate I/O Bus

* 버스는 모든 DMA 가능한 장치를 support

* 각 전송은 버스를 한 번 이용 (DMA에서 메모리로)

* CPU는 한 번만 멈춘다




I/O Channels

- I/O 장치들은 3D 그래픽 카드.. 등과 같이 점점 복잡해진다. CPU는 I/O controller가 전송하도록 하고(Execute I/O program in memory), I/O controller는 그렇게 한다. ->속도 향상

- 앞으로의 발전 : I/O processor (I/O module has local memory)

- I/O channel, I/O processor 둘 다 옆 그림같은 상황에 쓰일 수 있다




Interfacing

- 장치들을 연결해 peripheral들의 연산에 맞게 한다


- Parallel interface

다수의 비트들이 I/O 모듈과 주변장치 사이에서 전송된다 (SCSI)

- Serial interface

한 번에 하나의 비트만 전송된다 (Firewire)

728x90
반응형

'Career' 카테고리의 다른 글

Processor Structure and Function  (0) 2016.06.11
Computer Arithmetic  (0) 2016.06.10
Kernel Memory Allocation  (0) 2016.06.09
자주 쓰는 단축키  (0) 2016.06.09
[Java] 에러/ No enclosing instance of type Defines is accessible...  (0) 2016.06.09
Comments