본문 바로가기
책/혼공 컴퓨터구조+운영체제

컴퓨터 구조 - 프로그램 입출력, 인터럽트 기반 입출력, DMA 입출력, 메모리 맵 입출력, 고립형 입출력, 입출력 버스

by 코딩하는 돼징 2023. 12. 6.
반응형

프로그램 입출력(Programming I/O)

프로그램 속 명령어로 입출력 장치를 제어하는 방법이다. CPU는 프로그램이 실행되는 동안 입출력 명렁어를 만나면 해당 명령어를 통해 입출력 장치에 여녈된 장치 컨트롤러와 상호작용하여 입출력 작업을 수행한다. 

 

메모리에 저장된 정보를 하드디스크에 백업하는 상황 가정 ( = 하드 디스크에 새로운 정보 쓰기)

1) CPU는 하드 디스크 컨트롤러의 제어 레지스터에 "쓰기 명령어"를 보낸다.

2) 하드 디스크 컨트롤러는 하드 디스크 상태 확인하고 상태 레지스터에 "준비완료" 표시한다.

3) 하드 디스크가 아직 준비되지 않은 경우

     3) - 1 CPU는 상태 레지스터를 주기적으로 읽어보며 하드 디스크의 준비 여부를 확인한다.

     3) - 2 하드 디스크가 준비되었다면 백업할 메모리의 정보를 데이터 레지스터에 쓰기작업을 수행한다.

4) 백업 작업(쓰기 작업)이 아직 끝나지 않았다면 다시 1번 부터 반복하고 끝났다면 작업을 종료한다.

 

CPU는 장치 컨틀롤러의 레지스터들을 어떻게 알까?

CPU내부에 있는 레지스터들과 달리 CPU는 여러 장치 컨트롤러 속 레지스터들을 모두 알고 있기란 어렵다. 그렇다면 아래와 같은 명령어들은 어떻게 명령어로 표현되고 메모리에 어떻게 저장되어있는지 알아보자

프린터 컨트롤러의 상태 레지스털르 읽어라
프린터 컨트롤러의 데이터 레지스터에 100을 써라
키보드 컨트롤러의 상태 레지스터를 읽어라
하드 디스크 컨트롤러의 데이터 레지스터에 'a'를 써라

 

여기에는 크게 두가지 방식이 있다. 메모리 맵 입출력과 고립형 입출력이다.


1. 메모리 맵 입출력(Memory - Mapped I/O)

메모리에 접근하기 위한 주소 공간과 입출력 장치에 접근하기 위한 주소 공간을 하나의 주소 공간으로 간주하는 방법이다. 

출처 : https://www.inflearn.com/course/%ED%98%BC%EC%9E%90-%EA%B3%B5%EB%B6%80%ED%95%98%EB%8A%94-%EC%BB%B4%ED%93%A8%ED%84%B0%EA%B5%AC%EC%A1%B0-%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C/dashboard

각 장치 컨트롤러의 레지스터는 특정 메모리 주소에 할당되어 있으며 CPU는 이 주소를 통해 해당 장치의 레지스터에 접근한다.

516번지 : 프린터 컨트롤러의 데이터 레지스터
517번지 : 프린터 컨트롤러의 상태 레지스터
518번지 : 하드 디스크 컨트롤러의 데이터 레지스터
519번지 : 하드 디스크 컨트롤러의 상태 레지스터

 

'517번지를 읽어 들여라' == 프린터 상태 읽기

'518번지에 a를 써라' == 하드 디스크에 a쓰

 

메모리 접근 명령어 == 입출력장치 접근 명령어

입출력 장치와 메모리가 동일한 주소 공간을 공유하므로 CPU는 일반적인 메모리 접근 명령어를 사용하여 입출력 명령어를 처리한다.


2. 고립형 입출력(Isolated I/O)

메모리를 위한 주소 공간과 입출력 장치를 위한 주소 공간을 분리하는 방법이다. 

출처 : https://www.inflearn.com/course/%ED%98%BC%EC%9E%90-%EA%B3%B5%EB%B6%80%ED%95%98%EB%8A%94-%EC%BB%B4%ED%93%A8%ED%84%B0%EA%B5%AC%EC%A1%B0-%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C/dashboard

각 장치 컨트롤러의 레지스터는 특정 메모리 주소에 할당되어있으며 CPU는 이 주소를 통해 해당 장치의 레지스터에 직접 접근한다. CPU는 입출력 장치에 접근하기 위해 접근하는 명령어와는 다른 (입출력 쓰기/쓰기 선을 활성시키는) 입출력 명령어를 사용한다.


정리


3. 인터럽트 기반 입출력(Interrupt-Driven I/O)

인터럽트 기반 입출력은 입출력 장치가 CPU에게 처리할 내용이 있을 때 장치 컨트롤러가 인터럽트를 발생시켜 CPU에게 알리는 방식이다. 이때 CPU는 현재 실행 중인 작업을 중단하고 인터럽트 서비스 루틴(Interrupt Service Routine, ISR)을 실행한다. 인터럽트 서비스 루틴은 해당 입출력 장치의 상태를 확인하고 필요한 처리를 수행한 후, CPU는 원래 작업으로 돌아가게 된다.


폴링(Polling) vs 인터럽트

폴링(Polling)

CPU는 주기적으로 장치 컨트롤러의 상태 레지스터를 확인하여 입출력 장치의 상태를 폴링한다. 입출력 작업이 완료되었는지 주기적으로 확인하는 방식이기 때문에 CPU의 부담이 크다. 폴링은 입출력 장치가 주기적으로 확인되기 때문에 입출력 작업에 따른 지연이 발생할 수 있다.

인터럽트

장치 컨트롤러는 입출력 작업이 완료되면 CPU에게 인터럽트 신호를 보낸다. CPU는 인터럽트를 받으면 현재 실행 중인 작업을 중단하고, 해당 인터럽트를 처리하는 인터럽트 서비스 루틴을 실행한다. 인터럽트 방식은 CPU가 다른 작업을 수행하다가도 장치 컨트롤러로부터 인터럽트를 받으면 즉시 처리할 수 있어 효율적이다. 입출력 작업이 완료될 때까지 CPU는 대기하지 않고 다른 작업을 수행할 수 있다.


4. 동시다발적인 인터럽트

입출력 장치가 많은 경우

01 인터럽트가 발생한 순서대로 인터럽트를 처리

일반적으로 인터럽트는 발생한 순서대로 처리한다. 인터럽트 A가 발생하면 CPU는 A의 서비스 루틴을 실행하고 그 중간에 다른 인터럽트 B가 발생하면 B의 서비스 루틴은 무시되고 A의 서비스 루틴이 끝난 후 B의 서비스 루틴이 실행된다.

출처 : https://www.inflearn.com/course/%ED%98%BC%EC%9E%90-%EA%B3%B5%EB%B6%80%ED%95%98%EB%8A%94-%EC%BB%B4%ED%93%A8%ED%84%B0%EA%B5%AC%EC%A1%B0-%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C/dashboard

CPU가 플래그 레지스터 속 인터럽트 비트를 비활성화한 채 인터럽트를 처리하는 경우 다른 입출력에 의한 하드웨어 인터럽트를 받아들이지 않기 때문에 CPU는 이렇듯 순차적으로 하드웨어 인터럽트를 처리하게 된다.

 

하지만 현실적으로 모든 인터럽트를 전부 순차적으로 해결할 수 없다. 인터럽트 중에서도 더 빨리 처리해야하는 인터럽트가 있기 때문이다. 즉 CPU는 인터럽트 간에 우선순위를 고려하여 우선순위가 높은 인터럽트 순으로 여러 인터럽트를 처리할 수 있다.


02 우선순위를 반영한 인터럽트

플래그 레지스터 속 인터럽트 비트가 활성화 되어 있는 경우 혹은 인터럽트 비트를 비활성화해도 무시할 수 없는 인터럽트인 NMI(Non-Maskable Interrupt)가 발생한 경우 CPU는 이렇게 우선순위가 높은 인터럽트부터 처리한다.

출처 : https://www.inflearn.com/course/%ED%98%BC%EC%9E%90-%EA%B3%B5%EB%B6%80%ED%95%98%EB%8A%94-%EC%BB%B4%ED%93%A8%ED%84%B0%EA%B5%AC%EC%A1%B0-%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C/dashboard


03 프로그래머블 인터럽트 컨트롤러(PIC; Programmable Interrupt Controller)

PIC는 여러 장치 컨트롤러에 연결되어 있는데 이 장치 컨트롤러들이 동시에 하드웨어 인터럽트 요청을 보내면 PIC는 이들의 우선순위를 판별하여 CPU에 가장 먼저 처리할 인터럽트를 알려준다. NMI우선순위까지 판단하지 않는다.

출처 : https://www.inflearn.com/course/%ED%98%BC%EC%9E%90-%EA%B3%B5%EB%B6%80%ED%95%98%EB%8A%94-%EC%BB%B4%ED%93%A8%ED%84%B0%EA%B5%AC%EC%A1%B0-%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C/dashboard

 

PIC의 다중 인터럽트 처리과정

1) PIC가 장치 컨트롤러에서 인터럽트 요청 신호를 받아들인다.

2) PIC는 인터럽트 우선순위를 판단한 뒤 CPU에 처리해야할 인터럽트 요청 신호를 보낸다.

3) CPU는 PIC에 인터럽트 확인 신호를 보낸다.

4) PIC는 데이터 버스를 통해 CPU에 인터럽트 벡터를 보낸다.

5) CPU는 인터럽트 벡터를 통해 인터럽트 요청의 주체를 알게 되고 해당 장치의 인터럽트 서비스 루틴을 실행한다.


프로그램 입출력과 인터럽트 기반 입출력의 공통점은 데이터 이동이 CPU를 거쳐 이루어진다는 점이다.

 

01 입출력장치 데이터를 메모리에 저장하는 경우

1) CPU는 장치 컨트롤러에서 입출력 장치 데이터를 하나씩 읽어 레지스터에 적재

2) 적재한 데이터를 메모리에 저장

출처 : https://www.inflearn.com/course/%ED%98%BC%EC%9E%90-%EA%B3%B5%EB%B6%80%ED%95%98%EB%8A%94-%EC%BB%B4%ED%93%A8%ED%84%B0%EA%B5%AC%EC%A1%B0-%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C/dashboard


02 메모리의 데이터를 입출력에 저장하는 경우

1) 메모리에서 데이털르 하나씩 읽어 레지스터에 적재한다.

2) 적재한 데이터를 하나씩 입출력 장치에 내보낸다.

출처 : https://www.inflearn.com/course/%ED%98%BC%EC%9E%90-%EA%B3%B5%EB%B6%80%ED%95%98%EB%8A%94-%EC%BB%B4%ED%93%A8%ED%84%B0%EA%B5%AC%EC%A1%B0-%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C/dashboard


DMA(Direct Memory Access) 입출력

입출력 장치와 메모리가 CPU를 거치지 않고 입출력 장치와 메모리 간의 데이터 전송을 수행하는 입출력 방식이다. DMA를 사용하려면 시스템 버스에 연결된 DMA컨트롤러가 필요하다. 

출처 : https://www.inflearn.com/course/%ED%98%BC%EC%9E%90-%EA%B3%B5%EB%B6%80%ED%95%98%EB%8A%94-%EC%BB%B4%ED%93%A8%ED%84%B0%EA%B5%AC%EC%A1%B0-%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C/dashboard

 

DMA 입출력 과정

1) CPU 명령어 전달 : CPU는 DMA컨트롤러에 입출력장치의 주소, 수행할 연산(읽기/쓰기), 읽거나 쓸 메모리의 주소 등과 같은 정보로 입출력 작업을 명령한다.

2) DMA컨트롤러 작업 수행 : DMA컨트롤러는 CPU대신 장치 컨트롤러와 상호작용하며 입출력 작업을 수행한다. 이때 DMA컨트롤러는 필요한 경우 메모리에 직접 접근하여 정보를 읽거나 쓴다.

3) 작업 완료 및 인터럽트 : 입출력 작업이 끝나면 DMA컨트롤러는 CPU에 인터럽트를 걸어 작업이 끝났음을 알린다.

결과적으로 CPU는 입출력의 시작과 끝만 관여한다. 


사이클 스틸링(Cycle Stealing)

DMA컨트롤러와 CPU는 모두 시스템 버스를 사용해야 하는데 이는 공용자원이기 때문에 동시에 사용할 수 없다. 그러므로 DMA컨트롤러는 CPU가 사용중이지 않을 때 조금씩 시스템 버스를 사용하거나 CPU가 일시적으로 시스템 버스를 양도하도록 허용을 구한다. 이는 CPU의 주기전인 시스템 버스 이용을 도둑 맞는 것처럼 보일 수 있다.

출처 : https://www.inflearn.com/course/%ED%98%BC%EC%9E%90-%EA%B3%B5%EB%B6%80%ED%95%98%EB%8A%94-%EC%BB%B4%ED%93%A8%ED%84%B0%EA%B5%AC%EC%A1%B0-%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C/dashboard


입출력 버스(Input/Output Bus)

주로 입출력 장치들이 시스템 버스에 연결되기 위한 특수한 버스이다. 이 버스를 통해 입출력 장치들이 CPU및 메모리와 통신하고 데이터를 주고 받는다. 시스템 버스를 효율적으로 사용하기 위해 DMA컨트롤러와 장치 컨트롤러들이 입출력 버스를 통해 시스템과 상호작용한다.

 

입출력 버스를 통해 시스템 버스의 이용 빈도 낮추기

출처 : https://www.inflearn.com/course/%ED%98%BC%EC%9E%90-%EA%B3%B5%EB%B6%80%ED%95%98%EB%8A%94-%EC%BB%B4%ED%93%A8%ED%84%B0%EA%B5%AC%EC%A1%B0-%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C/dashboard

 

입출력 버스를 통해 시스템 버스의 이용빈도를 낮추는 것은 시스템 성능을 최적하는데 도움이 된다.


PCI(Periphearal Component Interconnect)버스, PIC Express(PCIe) 버스

대표적인 입출력 버스의 종류 중 하나이다. 이러한 버스들ㅇ느 여러 종류의 입출력 장치들을 연결하는 표준화된 인터페이스를 제공하여 시스템을 확장고 성능을 향상시킨다.

PCIe 슬롯

아래 이미지는 여러 입출력장치들을 PCIe 버스와 연결해 주는 통로인 PCIe슬롯이다. 우리가 사용한느 거의 모든 입출력 장치들은 이렇게 입출력 버스와 연결되는 통로를 통해 시스템 버스를 타고 CPU와 정보를 주고 받는다.

출처 : https://www.inflearn.com/course/%ED%98%BC%EC%9E%90-%EA%B3%B5%EB%B6%80%ED%95%98%EB%8A%94-%EC%BB%B4%ED%93%A8%ED%84%B0%EA%B5%AC%EC%A1%B0-%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C/dashboard

 

 

 

 

 

참고 :  본 내용은개발자를 위한 컴퓨터공학 1: 혼자 공부하는 컴퓨터구조 + 운영체제강의를 수강하여 작성하였습니다. https://www.inflearn.com/course/%ED%98%BC%EC%9E%90-%EA%B3%B5%EB%B6%80%ED%95%98%EB%8A%94-%EC%BB%B4%ED%93%A8%ED%84%B0%EA%B5%AC%EC%A1%B0-%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C/dashboard 

 

 

 

반응형

댓글