혼공컴운

[혼공컴운] 8장. 입출력장치

게으른 the lazy 2024. 7. 22. 02:08

https://computer744.wordpress.com/2015/11/16/computer-peripheral-device/

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분. 숙면도 소중하다. 자야겠다.