I/O device 즉, 입출력장치는 컴퓨터 외부에서 연결되어 컴퓨터 내부와 연결됩니다. I/O device는 CPU(주기억장치), 메모리보다 다루기가 더 까다롭습니다. 그 이유는 우선, 입출력장치들은 종류가 많아 데이터 전송 형식이나 속도 등도 다양합니다. 따라서 다양한 입출력 장치와 정보를 주고 받는 방식을 규격화하기가 어렵고, CPU에 비해 I/O device 의 데이터 전송률은 낮기 때문에 I/O device는 컴퓨터에 직접 연결되지 않고 '장치 컨트롤러'라는 하드웨어를 통해 연결됩니다.
01. 장치 컨트롤러
I/O device는 '장치 컨트롤러'라는 하드웨어를 통해 연결됩니다. 여기서, 장치 컨트롤러의 역할은 다음과 같습니다.
- CPU와 I/O device간의 통신을 중개 -> 일종의 번역가 역할을 수행
- I/O device의 오류 검출
- 데이터 버퍼링 기능 제공
버퍼링이란, 전송률이 높은 장치와 낮은 장치 사이에 주고받는 데이터를 '버퍼'라는 임시 저장 공간에 전송하여 전송률을 비슷하게 맞추는 방법입니다.
장치 컨트롤러는 결국 버스(입출력)에 연결되어 정보를 주고받게 됩니다. 이때 작은 cpu라고도 불리는 장치컨트롤러가 주고 받는 정보에는 상태레지스터, 제어레지스터, 데이터 레지스터 3 가지가 존재하고, 상태와 제어 레지스터는 하나의 레지스터로 사용되기도 합니다.
데이터 레지스터란, CPU와 I/O device 사이에 주고 받을 데이터를 저장하는 레지스터로 버퍼의 역할을 합니다. 최근에는 I/O device와 CPU간의 주고 받는 데이터가 증가하여 RAM을 사용하기도 합니다.
상태 레지스터란, I/O device가 입출력 작업을 할 준비가 되었는지, 완료되었는지, 오류가 없는지 등의 상태정보를 저장하는 레지스터 입니다.
제어레지스터란, 입출력장치가 수행할 내용에 대한 제어 정보가 담기는 레지스터 입니다.
02. 장치드라이버
장치드라이버란, CPU가 장치 컨트롤러에 연결된 장치를 어떻게 제어하고 동작시킬지 알려주는 프로그램입니다.
즉, 장치 컨트롤러가 I/O device를 연결하기 위한 '하드웨어'적인 통로라면, 장치 드라이버는 I/O device를 연결하기 위한 '소프트웨어'적인 통로입니다.
03. 다양한 입출력방법
03-1. 프로그램 입출력
프로그램 입출력 방법은 프로그램 속 명령어로 I/O device를 제어하는 방법으로 CPU가 프로그램 속 명령어를 실행하는 과정에서 입출력 명령어를 만나면 CPU는 I/O device에 연결된 장치 컨트롤러와 상호 작용하며 입출력 작업을 수행합니다.
프로그램 입출력 방식에서 입출력 작업은 CPU가 장치 컨트롤러의 레지스터 값을 읽고 씀으로써 이루어집니다.
하지만, CPU가 다양한 I/O device 장치 컨트롤러의 레지스터 값(I/O device 주소)을 어떻게 다 알 수가 있을가요..? 방법이 우선 두가지가 있습니다. 첫번째는 메모리맵 입출력방식과 둘째로 고립형 입출력 방식이 있습니다.
- 메모리 맵 입출력방식
- 메모리에 접근하기 위한 주소 공간과 I/O device에 접근하기 위한 주소 공간을 하나의 주소 공간으로 간주하는 방법입니다.
- 메모리 접근 명령어 == I/O device 접근 명령어
- -> 즉, 별도의 I/O device 명령어가 필요하지 않음
- 고립형 입출력방식
- 메모리 맵 입출력방식과 반대로 메모리를 위한 주소공간과 I/O device를 위한 주소 공간을 분리하는 방법입니다.
- 입출력 전용 명령어를 사용합니다.
메모리 맵 입출력 | 고립형 입출력 |
메모리와 I/O device는 같은 주소 공간 사용 | 메모리와 I/O device는 분리된 주소 공간 사용 |
메모리 주소 공간이 축소됨 | 메모리 주소 공간이 축소되지 않음 |
메모리와 I/O device에 같은 명령어 사용 가능 | 입출력 전용 명령어 사용 |
03-2. 인터럽트 기반 입출력
인터럽트란, CPU가 I/O device에 처리할 내용을 명령하면, I/O device가 명령어를 수행하는 동안 CPU는 다른일을 할 수 있고, 명령어를 수행후 작업을 완료한 I/O device는 CPU에 인터럽트를 보내서 이를 알린다라고 이전에 배웠습니다.
또한, I/O device 가 (사실은 장치 컨트롤러가) CPU에게 인터럽트 요청 신호를 보내면 CPU는 하던 일을 잠시 멈추고 해당 인터럽트를 처리하는 프로그램인 인터럽트 서비스 루틴을 실행한 뒤 다시 하던 일로 되돌아옵니다.
I/O device에 의한 하드웨어 인터럽트는 정확히 말하자면, I/O device가 아니라 장치 컨트롤러에 의해 발생합니다. CPU는 장치 컨트롤러에 입출력 작업을 명령하고, 장치 컨트롤러가 I/O device를 제어하며 입출력을 수행하는 동안 CPU는 다른 일을 할 수 있습니다. 이렇게 인터럽트를 기반으로 하는 입출력을 인터럽트 기반 입출력이라고 합니다.
I/O device가 여러개라면, 동시 다발적인 인터럽트가 발생할텐데 CPU는 이렇게 많은 인터럽트 요청을 어떻게 처리해야 할까요?
>> 인터럽트가 발생한 순서대로 처리하는 경우
>>>>CPU가 플래그 레지스터 내의 인터럽트 비트를 비활성화하고 인터럽트를 처리 == 다른 인터럽트는 받아들이지 않겠다.
>>>>>>-> 순차적으로 처리가 가능하다.
(단, 인터럽트 비트를 비활성화 해도 순차적으로 처리가 불가능한 NMI(:Non Maskable Interrupt)의 경우 -> NMI 먼저 처리 )
>> 우선순위를 반영하여 인터럽트를 처리하는 경우
>>>>플래그 레지스터 내의 인터럽트 비트를 활성화하고 인터럽트를 처리하는 경우
>>>>>>PIC(Programmable Interrupt Controller) 방식 : 여러 장치 컨트롤러에 연결되어 장치컨트롤러의 하드웨어 인터럽트의 우선순위를 판단하여 CPU에게 지금 처리해야 할 인터럽트가 무엇인지 알려주는 하드웨어
(NMI 발생시, PIC를 거치지 않고 CPU에 다이렉트로 인터럽트를 알려 처리)
03-3. DMA 입출력
프로그램 입출력방식과 인터럽트 기반 입출력 방식의 공통점은 I/O device와 메모리 간의 데이터 이동은 CPU가 주도하고 이동하는 데이터도 반드시 CPU를 거친다는 점입니다.
I/O device와 메모리 사이에 전송되는 모든 데이터가 반드시 CPU를 거쳐야 한다면, CPU는 I/O device를 위한 연산때문에 시간을 뺏기게 되고, 하드디스크(일종의 I/O device) 백업과 같이 대용량 데이터를 옮길 때는 CPU의 부담이 더더욱 커지게 됩니다.
그러므로 I/O device와 메모리가 CPU를 거치지 않고 상호작용 할 수 있는 입출력 방식인 DMA가 등장했습니다.
DMA란, Direct Memory Access의 약자로서, 직접 메모리에 접근할 수 잇는 입출력 기능입니다. DMA를 사용하기 위해서는 시스템 버스에 연결된 'DMA 컨트롤러'라는 하드웨어가 필요합니다.
DMA (Direct Memory Access)
- Used for high-speed I/O devices able to transmit information at close to memory speeds
- Device controller transfers blocks of data from buffer storage directly to main memory without CPU intervention.
- Only an interrupt is generated per block
[DMA 입출력 방식의 과정]
시스템 버스는 공용 자원이기에 동시 사용이 불가능합니다. CPU가 시스템 버스를 사용할 때 DMA 컨트롤러는 시스템 버스를 사용할 수 없고 DMA 컨트롤러가 시스템 버스를 사용할 때는 CPU가 시스템 버스를 사용할 수 없습니다. 그래서 DMA 컨트롤러는 CPU가 시스템 버스를 이용하지 않을 때마다 조금씩 시스템 버스를 사용하거나 CPU가 일시적으로 시스템 버스를 이용하지 않도록 허락을 구하고 시스템 버스를 이용하게 됩니다.
입출력 버스를 통해 시스템 버스의 이용 빈도를 낮추게 됩니다.
- CPU는 DMA 컨트롤러에 입출력 장치의 주소, 수행할 연산, 읽거나 쓸 메모리의 주소 등과 같은 정보로 입출력 작업을 명령합니다.
- DMA 컨트롤러는 CPU 대신 장치 컨트롤러와 상호작용하며 입출력 작업을 수행합니다. 이때 DMA 컨트롤러는 필요한 경우 메모리에 직접 접근하여 정보를 읽거나 씁니다.
- 입출력 작업이 끝나면 DMA 컨트롤러는 CPU에 인터럽트를 걸어 작업이 끝났음을 알립니다.
- I/O devices and the CPU can execute concurrently
- Each device controller is in charge of a particular device type
- Each device controller has a local buffer
- CPU moves data form/to main memory to/from local buffers
- Cf) DMA (Direct Memory Access)
- I/O is from the device to local buffer of controller
- Device controller informs CPU that it has finished its operation by causing an interrupt
본 글은 인프런의 [혼자공부하는 컴퓨터 구조 + 운영체제 ] 인강을 참고하였습니다.
'CS > 운영체제' 카테고리의 다른 글
[운영체제] 프로세스와 스레드 (0) | 2023.08.19 |
---|---|
[운영체제] 운영체제 기초 (0) | 2023.08.19 |
[컴퓨터구조]CPU의 성능향상기법 (0) | 2023.08.14 |
[컴퓨터구조] CPU의 작동원리 (0) | 2023.08.11 |
[컴퓨터구조] 소스 코드와 명령어 (0) | 2023.08.08 |