나무 숲
Input & Output 본문
* 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)
'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 |