[36일차] | 컴퓨터 밑바닥의 비밀 | 책너두

Heechan Kang·2024년 5월 26일
0
post-thumbnail

Chapter 6. 입출력이 없는 컴퓨터가 있을까?

  • 입출력은 인간이 컴퓨터와 상호작용하는 방식을 의미한다.
  • 이러한 상호작용 방식의 변화는 산업의 발전과 함께 컴퓨터의 발전 방향을 결정할만큼 중요하다.

6.1 CPU는 어떻게 입출력 작업을 처리할까?

  • CPU 내부에 있는 레지스터 처럼, 장치에도 자체적인 레지스터가 있다.
    • 장치로부터 입력되는 데이터를 저장하는 레지스터
    • 장치의 제어정보와 상태정보를 저장하는 레지스터

6.1.1 전문적으로 처리하기: 입출력 기계 명령어

  • CPU의 작업을 통제하기 위해 여러 종류의 기계 명령어가 존재한다.
  • 따라서 장치 레지스터를 읽고 쓰기위한 명령어도 별도로 설계 할 수 있다.
  • 그러나 이러한 별도의 명령어 없이도 입출력을 처리할 수 있다.
    • 메모리 자체도 CPU 입장에서는 외부 장치이다.
      • 그러나 이 경우, 메모리와 장치 레지스터를 구별하는 방법이 필요하다.

6.1.2 메모리 사상 입출력

  • LOADSTORE 명령어를 통해 메모리에 접근할 수 있다.
    • 그러나 대상이 정말 메모리인지, 장치 레지스터인지 구별할 수 없다.
  • 따라서, 주소 공간의 일부를 장치 레지스터에 할당한다.
    • 주소 공간을 8비트로 가정하면, 0000 0000(0x00) ~ 1110 1111(0xEF)은 메모리 주소, 1111 0000(0xF0) ~ 1111 1111(0xFF)은 장치 레지스터 주소로 사용하는 방식이다.

6.1.3 CPU가 키보드를 읽고 쓰는 것의 본질

  • 위에서 다룬 메모리 사상 방식으로 CPU가 메모리와 장치 레지스터에 관계없이 입출력을 처리할 수 있다.
  • 그러나, 또 하나 문제점은 사용자가 키보드를 언제 누를 지 알 수 없다는 점이다.
    • 이를 해결하기 위해 장치 상태 레지스터(device status register)를 사용한다.
      • 이를 통해 장치가 현재 읽기나 쓰기를 수행할 준비가 되었는지 확인할 수 있다.

6.1.4 폴링: 계속 검사하기

  • 폴링(polling)은 장치 상태 레지스터를 주기적으로 확인하는 방식이다.

    • 이를 통해 장치가 준비되었는지 확인하고, 준비되었다면 데이터를 읽어들인다.

      START
        Load R1 0xFE00
        BLZ  Start
        Load R0 0xFE01
        BL   OTHER_TASK
      • LoadR1 0xFE00: 키보드의 상태 레지스터를 읽어들인다.
      • BLZ Start: 키보드가 준비되지 않았다면, 다시 상태 레지스터를 읽어들인다.(to START)
      • Load R0 0xFE01: 키보드의 데이터 레지스터를 읽어들인다.
      • BL OTHER_TASK: 키보드가 준비되었다면, 다른 작업을 수행한다.
  • 그러나 폴링은 CPU의 자원을 낭비하게 된다.

    • 이는 CPU가 계속해서 장치 상태 레지스터를 확인해야 하기 때문이다.
    • 이러한 문제를 해결하기 위해 인터럽트 방식이 등장하게 된다.

6.1.5 배달 음식 주문과 중단 처리

  • 배달 음식을 주문하고, 주문이 도착할 때 까지 새로고침을 하며 기다리는 사람은 없다.
    • 이는 CPU가 폴링 방식으로 장치를 확인하는 것과 같다.
  • 일반적인 사람들은 주문을 하고 다른 일을 처리하다가, 주문이 도착하면 알림을 받는다.
    • 이는 CPU가 인터럽트 방식으로 장치를 확인하는 것과 같다.

6.1.6 인터럽트 구동식 입출력

  • 인터럽트 방식은 CPU가 다른 작업 A를 수행하다가 장치의 인터럽트 신호를 받으면, 작업 A를 중단하고 장치를 처리한 뒤 다시 작업 A를 수행하는 방식이다.
  • 이를 위해 아래의 두 가지 준비가 필요하다.
    • CPU가 인터럽트 신호가 들어오는 것을 감지할 수 있어야 한다.
    • 중단된 작업 A를 저장하고, 장치를 처리한 뒤 다시 작업 A를 복원할 수 있어야 한다.

6.1.7 CPU는 어떻게 인터럽트 신호를 감지할까?

  • 일반적인 CPU의 기계명령어 실행 과정은 아래와 같다.
    • 명령어 인출(instruction fetch)
    • 명령어 해독(instruction decode)
    • 실행(execute)
    • 다시 쓰기(write back)
  • 인터럽트를 위해 이 과정에 아래의 세 과정이 추가되어야 한다.
    • 인터럽트 감지
    • 우선순위 판별
    • 인터럽트 처리
  • 이 과정은 마치 함수호출과 비슷하다.

6.1.8 인터럽트 처리와 함수 호출의 차이

  • 위 두 가지 개념은 점프와 반환을 포함한다는 점에서 유사하다.
  • 그러나, 인터럽트의 경우가 함수 호출보다 더 복잡하다.
    • 함수 호출은 단일 스레드 내부에서만 발생한다.
    • 인터럽트는 다른 두 컨텍스트를 전환해야 하며, 더 많은 정보를 저장하고 복원해야 한다.

6.1.9 중단된 프로그램의 실행 상태 저장과 복원

  • CPU는 인터럽트가 발생하면, 현재 실행중인 프로그램의 상태를 저장하고, 인터럽트 처리를 위한 작업을 수행한 뒤, 다시 프로그램의 상태를 복원한다.
  • 이 과정이 중첩될 수 있으며, 이를 위해 스택을 사용한다.
profile
안녕하세요!

0개의 댓글