Chapter 8. 입출력장치

2025. 5. 26. 00:37·독서/[ 혼자 공부하는 컴퓨터 구조 + 운영체제 ]

키보드, 마우스, 모니터와 같은 다양한 입출력장치들은 장치 컨트롤러와 장치 드라이버를 통해 컴퓨터 내부와 연결된다.

장치 컨트롤러

장치 컨트롤러는 다음과 같은 이유에 의해서 사용된다.

- 입출력장치의 종류는 너무나 많기 때문에 정보를 주고받는 방식을 규격화하기 어렵다.
- 입출력장치와 CPU의 데이터 전송률이 매우 많이 차이 난다.

위와 같은 이유로 입출력 장치는 장치 컨트롤러라는 하드웨어를 통해 연결된다.

따라서, 장치 컨트롤러의 역할은 다음과 같다.

- CPU와 입출력장치 간의 통신
- 중개오류 검출
- 데이터 버퍼링

이 중 데이터 버퍼링은 위에서 말한 CPU와 입출력장치의 데이터 전송률 차이를 완화하기 위한 기능으로, 버퍼링을 통해 데이터를 모았다가 한꺼번에 전송하거나, 데이터를 한 번에 많이 받아 조금씩 내보내는 방법이다.

장치 컨트롤러에는 크게 데이터 레지스터, 상태 레지스터, 제어 레지스터로 구성되어 있다.

- 데이터 레지스터: CPU와 입출력장치 사이에 주고받는 데이터가 저장되며, 데이터 버퍼링에 사용되는 버퍼 역할을 한다.
- 상태 레지스터: 입출력장치가 준비, 완료 등의 상태를 저장한다.
- 제어 레지스터: 입출력 장치가 수행할 내용에 대한 제어 정보와 명령을 저장한다.

장치 드라이버

장치 드라이버는 장치 컨트롤러의 동작을 감지하고 제어하여 장치 컨트롤러가 컴퓨터 내부와 정보를 주고받을 수 있게 하는 프로그램(소프트웨어)이다. 보통 윈도우나 macOS와 같은 운영체제가 장치 드라이버를 인식하고 실행하며 운영체제에서 기본적으로 제공하는 장치 드라이버도 있다.


입출력 방법

CPU와 장치 컨트롤러가 정보를 주고받는 방식에는 크게 세 가지 방법이 있다.

 

프로그램 입출력

프로그램석 명령어로 입출력장치를 제어하는 방법으로, 다음과 같은 과정을 따른다.

- CPU가 장치 컨트롤러의 제어 레지스터에 쓰기 명령 보낸다.
- 장치 컨트롤러는 입출력장치의 상태를 확인하여 상태 레지스터에 정보를 저장한다.
- CPU는 주기적으로 상태 레지스터를 확인하여 입출력장치의 준비 여부를 확인하고, 준비된 것을 확인하면 수행하는 데에 필요한 메모리 정보를 데이터 레지스터에 작성한다.

이처럼 프로그램 입출력 방식에서는 CPU가 장치 컨트롤러의 레지스터 값을 읽고 쓰는 과정이 포함되어 있으며, 여기에는 메모리 맵 입출력과 고립형 입출력 방식이 있다.

 

메모리 맵 입출력

메모리에 접근하기 위한 주소 공간과 입출력장치에 접근하기 위한 주소 공간을 하나의 주소 공간으로 간주하는 방법이다. 즉, 1024개의 주소를 표현하는 컴퓨터에 512개는 메모리 주소를, 512개에는 장치 컨트롤러의 레지스터를 표현하도록 한다.

이러한 방식은 CPU가 입출력장치에 접근할 때와 메모리에 접근할 때의 명령어가 다를 필요가 없다는 장점이 있지만, 일정 메모리를 장치 컨트롤러의 레지스터를 표현하는 데에 사용해야 하는 단점이 있다.

 

고립형 입출력

메모리를 위한 주소 공간과 입출력장치를 위한 주소공간을 분리하는 방법으로, 메모리 읽기/쓰기와 입출력장치 읽기/쓰기의 명령어를 다르게 하여, 전체 메모리를 무엇으로 간주할 것이냐를 결정하는 방식이다.


인터럽트 기반 입출력

4장에서 이미 다루었듯이, 입출력장치가 CPU에게 인터럽트 요청을 보내면 CPU는 인터럽트를 처리하는 인터럽트 서비스 루틴을 실행한 뒤, 다시 하던 일로 돌아간다. 이는 사실 장치 컨트롤러에 의해 발생된다. 이와 대조되는 개념으로는 폴링(polling)이 있으며 이는 CPU가 주기적으로 장치 컨트롤러의 상태 레지스터를 확인하여 입출력장치의 상태를 확인하는 방식으로 CPU의 부담이 더 커진다.

때로는 음악을 들으면서 인터넷 서핑을 하는 것과 같이 입출력장치에 의한 인터럽트가 동시에 발생하는 경우도 있다. 이때에는 크게 두 가지 방식으로 인터럽트를 처리할 수 있다.

 

순차적으로 인터럽트를 처리하는 방법

말 그대로 인터럽트가 발생한 순서대로 처리하는 방법으로, CPU가 플래그 레지스터 속 인터럽트 비트를 비활성화한 채로 먼저 온 인터럽트를 처리하면 다른 인터럽트를 받아들이지 않기 때문에 이를 활용하여 순차적으로 인터럽트를 처리하게 된다.

 

우선순위를 반영하여 인터럽트를 처리하는 방법

우선순위를 반영하는 방법은 여러 가지가 있다. 먼저, NMI(Non-Maskable Interrupt)가 발생한 경우 플래그 레지스터 속 인터럽트 비트의 활성화 여부와는 관계없이 먼저 처리하게 된다.

또한, PIC(Programmable Interrupt Controller)라는 하드웨어를 활용해 여러 장치 컨트롤러부터 오는 인터럽트의 우선순위를 판별하여 지금 처리할 인터럽트를 반환하는 방법도 있다. PIC는 NMI가 발생했을 경우 우선순위를 판별하지 않고 가장 먼저 처리하게 되며, PIC를 계층적으로 사용하여 훨씬 더 많은 하드웨어 인터럽트를 관리할 수도 있다.


DMA 입출력

원래에는 입출력장치와 메모리 간의 데이터 이동은 CPU가 주도하고, 이동하는 데이터도 CPU를 거치지만, DMA(Direct Memory Access)는 직접 메모리에 접근할 수 있는 입출력 기능이다. 이를 위해서는 DMA 컨트롤러라는 하드웨어가 필요하다.

DMA의 입출력 과정은 다음과 같다.

- CPU가 DMA 컨트롤러에게 입출력장치의 주소, 수행할 연산, 읽기/쓰기의 메모리 주소의 정보로 입출력 작업을 명령한다.
- DMA 컨트롤러는 CPU 대신 입출력 작업을 수행한다. 이때 필요한 경우 메몰에 직접 접근하여 읽기/쓰기 연산을 수행한다.
- 입출력 작업이 완료되면, DMA 컨트롤러는 CPU에게 작업 완료 인터럽트를 보낸다.

이때 생각해 볼 수 있는 문제로는 시스템 버스는 동시에 사용할 수 없기 때문에 DMA 컨트롤러가 직접 메모리 접근을 하면 CPU가 시스템 버스를 사용하지 못한다는 것이다. 특히, DMA가 시스템 버스의 접근하는 경우를 생각해 보면, 다음과 같다.

- 메모리에서 DMA 컨트롤러로 데이터를 가져온다.DMA 컨트롤러에서 장치 컨트롤러에게 데이터를 보낸다.
- 이를 조금이라도 줄이기 위해 장치 컨트롤러와 DMA 컨트롤러가 연결된 입출력 버스라는 별도의 버스에 연결한다. 

이를 통해 DMA 컨트롤러와 장치 컨트롤러가 데이터를 주고받을 때에는 시스템 버스를 이용하지 않아도 된다.


참고 자료:

강민철. 『혼자 공부하는 컴퓨터 구조 + 운영체제』. 한빛미디어, 2022.

'독서 > [ 혼자 공부하는 컴퓨터 구조 + 운영체제 ]' 카테고리의 다른 글

Chapter 7. 보조기억장치  (0) 2025.03.21
Chapter 6. 메모리와 캐시메모리  (0) 2025.03.20
Chapter 5. CPU 성능 향상 기법  (0) 2025.03.19
Chapter 4. CPU의 작동 원리  (0) 2025.03.16
Chapter 3. 명령어  (0) 2025.03.13
'독서/[ 혼자 공부하는 컴퓨터 구조 + 운영체제 ]' 카테고리의 다른 글
  • Chapter 7. 보조기억장치
  • Chapter 6. 메모리와 캐시메모리
  • Chapter 5. CPU 성능 향상 기법
  • Chapter 4. CPU의 작동 원리
coding-l7
coding-l7
  • coding-l7
    coding-l7rl0
    coding-l7
  • 글쓰기 관리
  • 전체
    오늘
    어제
    • 분류 전체보기
      • 기타
      • 유니티
        • OfficeWorkerRunning
      • 프로그래밍 언어
        • C
        • C#
        • C++
      • CS
        • 컴퓨터 구조
        • 운영체제
      • 물리 기반 시뮬레이션
        • 기초
        • Cloth Simulation
        • Fluid Simulation
      • 코딩 테스트
        • 프로그래머스
        • 백준
      • 독서
        • [ 뇌를 자극하는 윈도우즈 시스템 프로그래밍 ]
        • [ 혼자 공부하는 컴퓨터 구조 + 운영체제 ]
        • [ CUDA 기반 GPU 병렬 처리 프로그래밍 ]
      • 영어
        • Basic Grammar In Use
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • 깃허브
    • 포트폴리오
  • 공지사항

  • 인기 글

  • 태그

    정수 승격
    screen space fluid rendering
    wave simulation
    C언어
    입자 기반 방법
    GLSL
    bilateral blur
    상수
    파동 난류
    pbd
    fluid implicit particle
    fluid simulation
    position based dynamics
    시스템 프로그래밍
    collision
    물리 기반 시뮬레이션
    narrow range filter screen-space fluid rendering
    실수
    명령어
    액체 시뮬레이션
    RAM
    유체 시뮬레이션
    cloth simulation
    그리드 기반 방법
    Flip
    컴퓨터 구조
    surface turbulence
    jump table
    screen-space rendering
    OpenGL
  • 최근 댓글

  • hELLO· Designed By정상우.v4.10.3
coding-l7
Chapter 8. 입출력장치
글쓰기
상단으로

티스토리툴바