혼공컴운
[혼공컴운] 8장. 입출력장치
게으른 the lazy
2024. 7. 22. 02:08
8. 입출력장치
- 아...
- 꼭 알아야 할까.
- 꼭 이렇게까지 알아야 할까.
- 정말 이렇게까지 자세히 알아야 할까.
- 그런데 모르고 넘어가자니 찝찝하다.
- 현재 시간 밤 1시 18분... 족장님 보고 계시죠?
출처: https://www.madtimes.org/news/articleView.html?idxno=18767
8.1 장치 컨트롤러와 장치 드라이버
- 내가(CPU가) 사무실에서(메인보드 위에서) 일한다.
- 내가 사장이면 좋겠다만 (좋은게 맞을까)
- 사장이 아니므로 사장에게 보고를 해야 한다.
- 사장은 입력 장치를 통해 지시사항을 보내고
- 나는 출력 장치를 통해 보고를 한다.
- 입력 장치는 키보드, 마우스 등이다.
- 출력 장치는 모니터, 프린터, 스피커 등이다.
- 그런데 도대체 어떻게 동작할까?
- 내가 누르는 키가 어떻게 정보가 되어 메인보드, 시스템 버스, 제어 장치, CPU를 거쳐 다시 모니터까지 전달될까?
- 이럴 때 필요한 것이 중개인이다.
- 이것을 우리는 장치 컨트롤러라고 부른다.
- 장치 컨트롤러는 3가지 일을 한다.
- CPU와 입출력장치 간의 통신 중개
- 오류 검출
- 데이터 버퍼링
- CD 플레이어에도 버퍼링 기능이 있다.
- CD도 HDD처럼 헤드가 정보를 읽는데, 외부에서 충격이 가해지면 정보를 잘 읽지 못한다.
- 그래서 CD에서 정보를 미리 읽어서 버퍼링 해두고 이어폰으로 전달한다.
- 그래야 충격이 가해져도 소리가 끊기지 않고 나온다.
- 입출력장치에도 버퍼가 있는데, 목적이 조금 다르다.
- 전달할 정보를 모아서 한번에 주고받는다.
- 안 그러면 빠른 CPU가 느린 입출력장치를 기다려야 한다.
- 장치 컨트롤러는 입출력장치와 시스템 버스 간의 중개자 역할을 한다.
- 데이터 레지스터, 상태 레지스터, 제어 레지스터로 구성된다.
- 데이터 레지스터: CPU와 입출력장치가 주고받을 데이터를 담는다. 버퍼도 여기에 있다.
- 상태 레지스터: 입출력장치의 준비 상태, 오류 상태 등을 저장한다.
- 제어 레지스터: 입출력장치가 수행할 내용에 대한 제어 정보와 명령을 저장한다.
- 장치 컨트롤러는 하드웨어다.
- 장치 컨트롤러를 돌리는 소프트웨어가 필요하다.
- 이 소프트웨어가 장치 드라이버이다.
- 그래픽 카드를 바꿀 때 장치 드라이버를 새로 설치해야 하는 이유이다.
- 장치 드라이버도 당연히 메모리게 올라간다.
8.2 다양한 입출력 방법
- 앞 절 서두에 던졌던 질문이다.
- 장치 컨트롤러와 CPU는 정보를 어떻게 주고받을까?
- 세 가지 방법이 있다.
- 프로그램 입출력, 인터럽트 기반 입출력, DMA 입출력.
- 주변기기인 주제에(?) 분량이 많다.
8.2.1 프로그램 입출력 (programmed I/O)
- 프로그램 속 명령어로 입출력장치를 제어하는 방법이다.
- 아래는 메모리의 정보를 HDD로 저장하는 과정이다. 중개인은 HDD의 장치 컨트롤러이다.
- CPU가 HDD 컨트롤러에게 말한다. "나 이제 너한테 쓸거야." (CPU -> 제어 레지스터)
- HDD 컨트롤러가 HDD 상태를 확인한다. (HDD -> 상태 레지스터)
- CPU가 상태 레지스터를 지속적으로 확인하면서 데이터 레지스터를 통해 데이터를 쓴다.
- 여기서 문제: CPU는 장치 컨트롤러 속 레지스터의 주소를 어떻게 알까?
- 두 가지 방식이 있다: 메모리 맵 입출력, 고립형 입출력
- 메모리 맵 입출력 (memory-mapped I/O)
- 메모리 접근을 위한 주소 공간과 입출력장치 접근을 위한 주소 공간을 하나의 주소 공간으로 관리한다.
- CPU는 두 장치(메모리, 입출력장치)의 주소를 똑같이 대한다.
- 고립형 입출력 (isolated I/O)
- 메모리 맵 입출력과 반대로, 두 장치의 주소를 분리한다.
- 어디서 분리되냐면, 제어 버스에서 두 개의 선으로 분리한다.
- 하나의 선에서는 메모리 주소를 주고받고,
- 다른 선에서는 입출력장치의 주소를 주고받는다.
8.2.2 인터럽트 기반 입출력
- 4장에서 봤던 그 인터럽트 맞다.
- 영어 단어로 interrupt는 방해한다는 뜻이다.
- 정말로 CPU를 방해한다.
- CPU가 일을 하는 도중에 "해줘"라고 말하는 것이다.
- 이것을 인터럽트 기반 입출력이라고 부른다.
- 문제는 인터럽트를 거는 장치가 많을 때인데...
- 간단하게는 인터럽트가 들어온 순서대로 처리하는 것을 생각해볼 수 있다.
- 하지만 병목 현상 발생이 자명해 보인다.
- 그래서 인터럽트마다 우선순위를 둔다.
- 컴퓨터에는 프로그래머블 인터럽트 컨트롤러라는게 있는데
- Programmable Interrupt Controller; PIC
- 우선순위 기반으로 인터럽트를 처리한다.
- 실제로 PIC는 여러 입력 핀이 있고, 각 핀은 하드웨어와 연결되어 있다.
출처: https://www.geeksforgeeks.org/8259-pic-microprocessor/
- 그런데 PIC도 한 개로는 부족해서 여러 개를 계층 구조로 둔다.
- 좀 변태 같다.
출처: https://velog.io/@yeobi01/혼자-공부하는-컴퓨터구조
8.2.3 DMA (Direct Memory Access) 입출력
- 프로그램 입출격과 인터럽트 기반의 공통점: CPU한테 모든 것을 확인한다.
- 단점: CPU는 바쁘다!
- 아이디어: 메모리한테 시키자. 그래서 Direct Memory Access다.
- 시스템 버스에 연결된 DMA 컨트롤러를 통해서 장치를 제어하자는 거다.
- DMA 입출력 과정은 다음과 같다.
- CPU가 DMA 컨트롤러에게 일을 시킨다. 입출력장치 주소, 수행할 연산, 읽을/쓸 메모리 주소 등의 정보도 같이 준다.
- DMA 컨트롤러 주도 하에 정보를 읽거나 쓴다.
- 작업이 끝나면 DMA 컨트롤러가 CPU에게 인터럽트를 걸어 작업 완료를 알린다.
- 이걸로 된 걸까...?
출처: https://namu.wiki/w/%ED%95%B4%EC%B9%98%EC%9B%A0%EB%82%98?rev=337
- 문제: 시스템 버스는 공용 자원이므로 DMA 컨트롤러와 CPU가 동시에 사용할 수 없다.
- 그래서 DMA 컨트롤러는 CPU 눈치를 좀 봐야 한다.
- CPU가 시스템 버스 안 쓸 때 쓰거나, 양해를 구하고 쓴다.
- 구차하다.
- 시스템 버스는 안 그래도 한정 자원인데, DMA 컨트롤러는 뭐 하나 할 때마다 최소 두 번은 사용한다.
- 그래서 입출력 버스를 따로 둔다.
- 이제 DMA 컨트롤러는 입출력버스를 통해 입출력 장치들과 소통한다.
- 소통은 중요하다.
- 현재 시간 2시 5분. 숙면도 소중하다. 자야겠다.