3주차 - Chapter 6~8

 
Jan 16, 2023

Contents


Chapter 6 메모리와 캐시 메모리

RAM의 특징과 종류

💡
컴퓨터 시스템의 메인 메모리는 RAM이 담당한다. RAM은 휘발성 메모리로, 전원이 꺼지면 내부의 데이터도 사라진다.
  • 보조기억장치는 비휘발성 메모리로, 전원이 꺼져도 내부의 데이터는 보존된다.

RAM의 역할

  • CPU가 프로그램을 실행할 수 있도록, 보조기억장치에 저장된 프로그램을 메인 메모리에 적재한다. (Loading)
    • RAM의 용량이 클수록 더 많은 프로그램을 메인 메모리에 한꺼번에 적재할 수 있어 효과적이다.

RAM의 종류

크게 DRAM과 SRAM으로 나뉘며, DRAM은 SDRAM과 DDR SDRAM으로 발전되어 왔다.
  • DRAM : 데이터 보존을 위해 전압을 주기적으로 걸어줘야 하는 RAM으로, 가격이 저렴하여 대용량으로 만들기 유리하여 주로 메인 메모리로 사용된다.
    • SDRAM : 클럭 신호와 동기화된 발전된 형태의 DRAM으로, 클럭 신호에 맞추어 매 클럭마다 CPU와 데이터를 주고받을 수 있는 RAM
    • DDR SDRAM : 대역폭이 개선된 SDRAM
      • 대역폭 (Bandwidth): 한 번에 주고받을 수 있는 데이터의 양
      • DDR, DDR2, DDR3, DDR4 등 세대별로 구분되어, 세대를 거듭할수록 2배 넓은 대역폭 제공
 
  • SRAM : 전원을 한 번 걸어주면 주기적으로 전원을 다시 걸어줄 필요 없이 지속적으로 데이터가 유지되는 RAM으로, 주로 레지스터와 캐시 메모리로 사용된다.
    • → SRAM 또한 휘발성 메모리이므로, 전원이 차단되면 내부에 저장된 모든 데이터가 사라진다.

주소 공간

  • 메모리 주소는 크게 응용 프로그램 하나가 독자적으로 사용하는 논리 주소와 메인 메모리 전체에서 사용하는 물리 주소 나뉜다.
  • 논리 주소는 실행중인 응용 프로그램이 사용하는 주소이며, 물리 주소는 최종적으로 메인 메모리에 자리잡게 되는 주소로 CPU는 물리 주소를 기준으로 메인 메모리에 접근한다.
    • CPU와 운영체제는 응용 프로그램이 사용한 논리 주소를 메인 메모리 상에서 물리 주소로 변환하여 최종적으로 메인 메모리에 자리잡게 한다.
    • 논리 주소를 물리 주소로 변환하는 일은 CPU 내부의 하드웨어가 담당하는데, 이러한 하드웨어를 MMU (Memory Managament Unit; 메모리 관리 장치)라고 한다.
  • 물리 주소는 사용자와 실행중인 응용 프로그램 모두 알 수 없다.
  • 논리 주소를 사용하는 주된 이유는 응용 프로그램에서의 주소 접근의 편의성에 있다.
    • 논리 주소를 사용하는 그 어떤 응용 프로그램이라도, 메인 메모리의 용량이 허락하는 한 모든 주소를 이용할 수 있다. 먼저 메모리에서 사용할 수 있는 모든 주소를 응용 프로그램이 사용하고, CPU와 운영체제는 메인 메모리에서 사용 가능한 주소에 적절히 논리 주소를 할당하여 물리 주소로써 동작하게 한다.
    • 따라서, 논리 주소를 사용함으로써 실행중인 응용 프로그램은 현재 메인 메모리에서 사용할 수 있는 주소가 무엇이 있는지 따질 필요 없이 메인 메모리에서 사용할 수 있는 전체 주소를 사용하기만 하면 된다는 것이다. 응용 프로그램의 주소가 메인 메모리 주소의 어디에 할당될지는 CPU와 운영체제가 결정하면 될 일이기 때문이다.
    • 정확히 어떤 방식으로 논리 주소를 물리 주소로 변환하여 최종적으로 메인 메모리에 주소 공간을 할당하는지는 운영체제의 페이징 기법에서 자세하게 다룰 예정이다.

캐시 메모리

메모리 계층 구조

메모리의 계층 구조는 다음과 같다.
  • 레지스터 (CPU 내부)
  • 캐시 메모리 (CPU ↔ 메인 메모리)
  • 메인 메모리
  • 보조기억장치

캐시 메모리의 역할

  • CPU가 메인 메모리에 접근하여 CPU가 필요로 하는 명령어와 데이터를 가져올 때, 메인 메모리에서 해당 값이 위치한 주소를 찾는 과정을 줄여 명령어의 실행 시간을 단축한다.

참조 지역성

  • 캐시 메모리는 CPU가 메인 메모리에서 명령어와 데이터를 가져오기 위해 어떤 주소에 집중적으로 참조하는 경향성을 보여주는 참조 지역성을 활용한 메모리다.
  • 참조 지역성에는 Temporal locality와 Spatial locality 두 가지가 있다.
    • Temporal locality: CPU가 최근에 참조한 메모리 주소를 다시 참조하는 경향성
    • Spatial locality: CPU가 최근에 참조한 메모리 주소의 주변 주소를 다시 참조하는 경향성
  • CPU의 이러한 경향성은 처리 속도 향상을 위한 방법이다. 따라서 캐시 메모리의 성능을 높이려면, 캐시 메모리로 가져올 데이터와 명령어를 최근에 참조한 주소를 포함한 주변부 주소에서 가져와야 할 것이다.

캐시 메모리의 성능 지표

  • cache hit : 캐시 메모리가 가져온 값이 CPU에서 실제로 필요한 값인 경우
  • cache miss : 캐시 메모리가 가져온 값이 CPU에서 실제로 필요한 값이 아닌 경우
  • cache hit ratio : 캐시 메모리가 가져온 값들 중 CPU에서 실제로 필요한 값이 전체 값 중 얼마나 되는지를 보여주는 비율 → cache hit ratio가 높을수록 CPU가 할 일을 줄여주었으므로, 캐시 메모리의 성능이 높다고 할 수 있다.
  • 캐시 메모리의 용량이 클수록, 더 많은 값들을 캐시 메모리에 담을 수 있어 CPU가 필요로 하는 값을 더 많이 담게 되고, 그렇게 됨으로써 CPU의 처리 성능이 향상된다.

Chapter 7 보조기억장치

하드 디스크

💡
자기 (magnetic)적인 방법으로 데이터를 저장하는 대용량 저장장치
  • 내부 구조 및 작동 방식
    • 하드 디스크는 기본적으로 플래터스핀들로 이루어져 있다.
      • 플래터: 데이터가 저장되어 있는 원판
        • 플래터는 자기 물질로 덮여 있어, N극과 S극으로 0과 1을 나타냄으로써 데이터를 저장한다.
        • 일반적으로, 더 많은 데이터를 저장하기 위해 여러 겹의 플래터를 겹친 원통형으로 하드 디스크가 만들어진다.
      • 스핀들: 플래터를 회전시키는 장치 → 분당 회전수 단위인 RPM으로 스핀들의 회전 속도를 나타낸다.
        • 스핀들의 회전 속도가 빠를수록 하드 디스크의 데이터 접근 속도가 빨라진다.
        • 대신 하드 디스크에서 발생하는 소음도 증가한다.
       
    • 플래터에 데이터를 어떻게 접근할까?
      • 헤드
        • 헤드는 플래터가 스핀들에 의해 회전하면서, 플래터의 특정 트랙을 가리켜 그 영역에 기록된 데이터에 접근하는 역할을 한다.
          • 플래터가 여러 겹인 경우, 헤드도 플래터의 개수만큼 여러 개의 헤드가 있다.
          • 플래터는 일반적으로 앞면과 뒷면을 모두 사용하기 때문에, 플래터 앞면과 뒷면 각각에 헤드가 모두 있다.
      • 디스크 암
        • 헤드를 움직여 헤드의 위치를 옮기는 역할을 한다.
        • 디스크 암은 플래터에 달려 있는 모든 헤드를 한꺼번에 움직여 동일한 위치로 옮긴다.
       
    • 플래터 내부는 다음과 같이 구성된다.
      • 💡
        실린더 > 트랙 > 섹터 순으로 크다.
      • 트랙
        • 플래터 내부의 동심원 하나를 트랙이라고 한다.
      • 섹터
        • 하나의 트랙은 여러 개의 작은 영역으로 나눌 수 있는데, 나누어진 작은 영역을 섹터라고 한다.
      • 실린더
        • 여러 겹의 플래터 위에 같은 곳에 위치한 트랙들을 묶어 실린더라고 한다.
        • 연속된 데이터를 저장할 때에는 실린더 하나에 있는 같은 지점의 여러 겹의 트랙에 차례대로 저장한다.
          • 이렇게 저장하면, 하드 디스크의 물리적 특성상 헤드를 움직일 필요 없이 실린더 내부의 어느 플래터에서 그 다음 플래터로 이동하고 앞서 접근한 트랙과 같은 위치로 그 다음 플래터에서 연속된 데이터에 접근할 수 있어 접근 속도가 개선된다.
            • 각 플래터에 위치한 헤드는 모두 디스크 암에 의해 같은 위치의 트랙과 섹터로 이동하기 때문이다.
       
    • 정리
      • 헤드는 플래터 상의 어떤 트랙을 가리키고, 스핀들이 플래터를 회전시키면서 해당 트랙의 모든 섹터를 참조할 수 있다.
        • 플래터가 한 바퀴 회전할 때마다 트랙의 모든 섹터를 순회하게 된다.
      • 디스크 암이 헤드를 옮기면, 헤드가 가리키는 트랙 또한 바뀐다.
      • 플래터는 여러 겹으로 이루어져 있고, 각 플래터는 앞면과 뒷면을 모두 데이터 저장에 사용한다.
        • 모든 겹의 플래터 및 플래터의 양면에는 헤드가 있고, 디스크 암은 모든 헤드를 한번에 같은 트랙으로 움직인다.
      • 여러 겹의 플래터에 있는 같은 트랙을 실린더라고 하며, 연속된 데이터는 실린더 하나에 우선적으로 저장한다.
        • 모든 헤드는 같은 트랙을 가리키기 때문에, 실린더 하나에 연속된 데이터를 저장하면 이를 가져오기 위해 헤드를 움직일 필요가 없기 때문이다.
       
  • 하드 디스크가 저장된 데이터에 접근하는 시간 → 하드 디스크가 데이터가 위치한 곳을 어떻게 찾는지에 대한 과정과 연관되어 있음
    • 접근 시간 = 탐색 시간 + 회전 지연 + 전송 시간
      • 탐색 시간 (Seek time): 디스크 암이 헤드를, 접근하려는 데이터가 위치한 트랙까지 옮기는 시간
        • → 헤드를 원하는 트랙으로 옮기는 데 걸리는 시간
      • 회전 지연 (Rotational latency): 트랙 내에 어떤 섹터부터 접근하려는 데이터가 있는데, 이 섹터에 접근하고자 스핀들이 플래터를 회전시키는 데 걸리는 시간
        • → 헤드를 트랙 내 원하는 섹터로 옮기는 데 걸리는 시간
      • 전송 시간 (Transfer time): 접근하려는 데이터가 위치한 트랙과 섹터에 헤드를 위치시키고 나서, 그 부분에 위치한 데이터에 접근하고 그 데이터를 컴퓨터로 전송하는 데 걸리는 시간
        • → 데이터를 읽고 컴퓨터로 보내는 데 걸리는 시간
       
    • 접근 시간은 물리적인 방법으로 헤드를 조작하는 방식의 한계로 인해, CPU와 메인 메모리에서의 처리 시간에 비하면 매우 길다. 따라서, 대용량의 데이터를 접근하고 이를 컴퓨터로 읽어들이는 데 걸리는 시간은 상당히 오래 걸린다.
 
  • 하드 디스크의 종류
    • 단일 헤드 디스크 (이동 헤드 디스크)
      • 플래터당 하나의 헤드가 달려 있는 하드 디스크
    • 다중 헤드 디스크 (고정 헤드 디스크)
      • 플래터 내부의 트랙마다 여러 개의 헤드가 달려 있는 하드 디스크
      • 트랙마다 헤드가 있기 때문에, 헤드를 데이터가 위치한 트랙으로 옮길 필요가 없다. 따라서 다중 헤드 디스크의 탐색 시간은 항상 0이다.
 

플래시 메모리

  • 전기적으로 데이터를 읽고 쓸 수 있는 반도체 기반의 저장 장치
    • 하드 디스크와 다르게, 전기 신호를 통해 데이터를 읽고 쓸 수 있다.
    • 플래시 메모리에는 NAND 플래시 메모리와 NOR 플래시 메모리가 있는데, 대용량 저장 장치로 사용되는 플래시 메모리는 주로 NAND 플래시 메모리다.
 
  • 플래시 메모리는 (cell) 단위로 데이터를 저장한다.
    • 셀은 플래시 메모리에서 데이터를 저장하는 가장 작은 단위를 의미하며, 여러 개의 셀이 모여 하나의 저장 장치를 이룬다.
      • 셀 하나에 몇 개의 비트가 저장되는지에 따라 플래시 메모리가 분류된다.
    • 셀은 수명이 존재한다. 셀에 데이터를 읽고 씀에 따라 셀의 수명이 미세하게 닳으며, 그렇게 닳다 보면 언젠가는 데이터를 저장할 수 없는 상태가 된다. 즉, 메모리의 수명이 다 한 것이라고 할 수 있다.
 
  • 플래시 메모리의 종류
    • 셀 하나에 데이터를 많이 넣을수록 셀 개수 대비 저장 용량이 증가하고 가격이 낮아지지만, 그만큼 셀마다 데이터를 더 많이 읽고 쓰기 때문에 수명이 짧아진다. 또한 읽기/쓰기 속도가 더 느려진다.
    • 분류
      • SLC : 셀 하나에 1비트를 저장
      • MLC : 셀 하나에 2비트를 저장
      • TLC : 셀 하나에 3비트를 저장
      • QLC : 셀 하나에 4비트를 저장
 
  • 플래시 메모리 내부의 용량 단위
    • 💡
      플래시 메모리에서의 읽기/쓰기 작업은 페이지 단위로 이뤄진다. 삭제 작업은 블록 단위로 이뤄진다.
    • 셀 : 기본 단위로 플래시 메모리의 종류에 따라 담을 수 있는 비트의 수가 다름
    • 페이지 : 셀들이 모여 만들어진 단위 → 읽기/쓰기 작업이 이뤄지는 단위
      • 페이지는 세 개의 상태를 가질 수 있다.
        • Free : 어떤 데이터도 저장하고 있지 않은 상태
        • Valid : 유효한 데이터를 저장하고 있는 상태
        • Invalid : 유효하지 않은 데이터 (쓰레기값)을 저장하고 있는 상태
    • 블록 : 페이지들이 모여 만들어진 단위 → 삭제 작업이 이뤄지는 단위
    • 다이 : 블록들이 모여 만들어진 단위
 
  • 플래시 메모리에서의 읽기/쓰기 연산과 삭제 연산
    • 💡
      페이지가 Valid 상태면 해당 페이지에는 새로운 값을 쓸 수 없다. 즉, 덮어쓰기가 불가능하다. 플래시 메모리의 페이지에 새로운 값을 쓰려면 블록 단위로 삭제한 후에 진행해야 한다.
    • 블록 내에 기존 데이터가 저장되어 있을 때, 그것을 새 데이터로 변경하려면 블록 내 비어있는 페이지에 새 데이터를 저장해야 한다.
      • 기존 데이터가 저장된 페이지는 더 이상 유효한 값이 아니게 되어 쓰레기값이 저장된 페이지가 된다. 이 경우 페이지의 상태는 Valid → Invalid가 된다.
      • 쓰레기값이 들어있는 페이지가 포함된 블록은 그 자체로 용량 낭비이므로, 오늘날 플래시 메모리에는 이러한 쓰레기값이 포함된 블록에서 쓰레기값을 정리하기 위해 가비지 컬렉션을 제공하고 있다.
        • 💡
          정리하고자 하는 블록 내에서 Valid 상태인 페이지들만 다른 비어있는 블록에 모두 복사하고, 해당 블록을 삭제한다.

RAID

💡
같은 용량의 보조기억장치 여러 대를 하나로 묶어, 큰 용량의 보조기억장치 하나를 사용하는 것보다 더 좋은 성능과 안전성을 확보할 수 있는 기술
  • RAID의 종류
    • RAID는 여러 방법으로 구성할 수 있는데, 구성 방법을 레벨이라고 표현한다.
      상황에 따라 최적의 RAID 레벨은 달라진다.
    • RAID 0 → 데이터 분할 저장
      • 데이터를 저장장치의 대수만큼 분할하여, 분할된 데이터를 각 저장장치에 나누어 저장하는 방법 (데이터 스트라이핑)
      • 이론상 (저장장치의 대수) 배만큼 읽기/쓰기가 단일 저장장치로 읽기/쓰기 했을 때보다 빠르다.
      • 문제점 : 가동 중인 저장장치 중에서 하나라도 문제가 생기면 저장된 파일 전체에 오류가 생긴다.
    • RAID 1 → 데이터 분할, 데이터 백업
      • 사용 중인 저장장치들 중 일부는 저장용으로, 나머지는 백업용으로 용도를 나눈다. 저장용 저장장치와 백업용 저장장치 각각 원본 데이터를 분할하여 저장한다.
      • 저장용이나 백업용 중에 저장장치가 문제가 생긴 쪽이 있어도 그 반대쪽 데이터가 멀쩡해, 쉽게 복구할 수 있다는 장점이 있다.
      • 문제점 : RAID 0과 달리 분할되는 저장 장치가 상대적으로 적어, 읽기/쓰기 속도가 느리다.
    • RAID 4 → 데이터 분할 저장 + 패리티로 오류 검출, 수정 패리티 저장을 담당하는 저장장치 있음
      • 저장장치 하나에, 분할되어 저장되는 데이터에 대한 패리티 비트를 저장한다. 분할된 데이터에 오류가 생기면 패리티 비트가 저장된 저장장치에서 패리티 비트를 통해 오류를 검출한다. 오류가 발견되면 이를 수정하여 데이터를 복구한다.
        • 패리티 비트는 오류 검출만 가능하지만, RAID에서의 패리티 비트는 오류 수정까지 가능하다.
      • 문제점 : 저장장치마다 데이터가 저장될 때, 패리티 비트가 저장된 저장장치에서도 이를 반영하기 위한 읽기/쓰기 작업을 하게 되어 해당 저장장치에서 병목 현상이 발생한다.
    • RAID 5 → 4와 달리 데이터마다 패리티가 저장되는 저장장치가 다름
      • 각 데이터의 패리티를 저장장치마다 나누어 저장한다.
    • RAID 6 → 5에서 저장되는 패리티가 2개로 늘어남
      • RAID 5와 비슷하게 각 데이터의 패리티를 저장장치마다 나누어 저장하지만, 각 데이터에 대한 패리티가 하나 더 추가되어 데이터에 대한 총 2개의 패리티를 저장장치마다 나누어 저장한다.
      • RAID 5와 달리 오류 검출, 수정을 위한 패리티가 하나 더 추가되어 안전성 측면에서 개선되었지만, 써야 할 패리티의 수가 2배로 늘어서 읽기/쓰기 속도는 더 느려졌다는 단점이 있다.
    • Nested RAID
      • 두 개 이상의 RAID 기법을 적용한 RAID 기법으로, RAID 0과 RAID 1을 적용한 RAID 10, RAID 0과 RAID 5를 적용한 RAID 50 등이 있다.
 

Chapter 8 입출력장치

입출력장치의 구성 요소

💡
장치 컨트롤러 - 입출력장치를 컴퓨터와 연결하기 위한 하드웨어적 통로, 입출력장치에 설치됨 장치 드라이버 - 입출력장치를 컴퓨터와 연결하기 위한 소프트웨어적 통로, 컴퓨터에 설치됨

장치 컨트롤러

  • 입출력장치가 컴퓨터와 데이터를 주고받기 위한 장치
  • 필요성
      1. 입출력장치의 종류는 너무 많다.
        1. → 프린터, 스피커, 모니터, 키보드, 마우스, …
      1. 입출력장치의 전송률 (Data rate)는 CPU, 메모리보다 훨씬 느리다.
          • 속도 보정의 필요성
    • 따라서, 입출력장치는 이러한 문제들로 인해 컴퓨터와 직접 연결되지 않고, 컨트롤러를 통해 간접적으로 연결된다. 모든 입출력장치는 하나의 컨트롤러로 컴퓨터와 연결되어 데이터를 주고받는다.
 
  • 역할
    • CPU와 입출력장치 간 데이터 통신
    • 오류 검출
    • 데이터 버퍼링 → CPU와 입출력장치 간 데이터 전송률를 맞추기 위함
      • CPU는 입출력장치로 바로 데이터를 보내지 않고, 입출력장치의 컨트롤러에 있는 버퍼에 데이터를 저장한다. 입출력장치는 필요할 때 컨트롤러에 있는 버퍼에서 데이터를 꺼내면 된다.
 
  • 간략한 내부 구조
    • 데이터 레지스터
      • 입출력장치와 CPU 간 전송률 차이를 보완하기 위한 버퍼
    • 상태 레지스터
      • 아래와 같은 상태 정보를 저장
        • 입출력 작업을 할 준비가 되었는지
        • 입출력 작업이 완료되었는지
        • 입출력장치에 오류가 있는지
    • 제어 레지스터
      • 입출력장치가 수행할 내용에 대한 제어 정보와 명령을 저장
 

장치 드라이버

  • 장치 컨트롤러의 동작을 감지하고 제어 → 장치 컨트롤러가 컴퓨터 내부와 데이터를 주고받을 수 있도록 하는 프로그램
  • 컴퓨터에 설치되어 동작한다. 어느 입출력장치에 대응하는 장치 드라이버가 제대로 설치되어 있지 않다면, 컴퓨터에서 해당 입출력장치의 사용이 불가능하다.
 

입출력 방법

프로그램 입출력

💡
프로그램을 구성하는 명령어로 입출력장치를 제어하는 방법
  • CPU의 프로그램 속 명령어를 실행하는 중에, 입출력 명령어를 만나면 CPU는 입출력장치에 연결된 장치 컨트롤러와 상호작용하며 입출력 작업을 수행한다.
  • CPU가 장치 컨트롤러와 상호작용하여 입출력 작업을 수행하는 과정은 다음과 같다.
    • (Remark) 장치 컨트롤러는 대표적으로 다음과 같은 구조를 보인다.
      • 데이터 레지스터
      • 상태 레지스터
      • 제어 레지스터
      1. CPU는 장치 컨트롤러의 제어 레지스터에 읽기/쓰기 여부를 저장한다.
      1. 이후 CPU는 주기적으로 입출력장치가 입출력 준비가 되었는지 확인한다. 입출력장치가 입출력이 준비되면 상태 레지스터에 준비 상태임을 저장한다.
      1. CPU가 상태 레지스터에 준비 상태가 저장됨을 확인하면, 데이터 레지스터에 CPU가 보내고자 하는 데이터를 저장한다.
      1. 입출력장치는 데이터 레지스터에 저장된 데이터를 가져와서 입출력 작업을 수행한다.
      1. 입출력 작업이 끝나면 입출력장치는 장치 컨트롤러를 통해 CPU에 인터럽트 신호를 보내 입출력이 끝났음을 알린다. CPU는 인터럽트 신호를 받고 인터럽트 서비스 루틴을 실행하여 인터럽트를 처리한다.
 
  • 입출력 작업 또한 명령어로 이루어져 있는데, 명령어라면 메모리에 저장되어 있을 것이다. 그러면, 입출력 명령어는 메모리의 어디에 저장되어 있을까?
    • 주소 공간을 어떻게 사용하느냐에 따라, 메모리 맵 입출력과 고립형 입출력으로 나뉜다.
 
  • 메모리 맵 입출력 (Memory-mapped I/O)
    • CPU 명령어가 위치한 메모리 주소 공간과 입출력 명령어가 위치한 입출력 주소 공간을 하나의 주소 공간으로 취급하여, 주소 공간을 메모리와 입출력이 나누어 사용하는 방식이다.
    • 주소 공간을 공유하므로 입출력 명령어도 CPU 명령어와 같이 취급된다.
    • 같은 이유로 두 주소 공간 모두 사용 가능한 공간이 제약되는 단점이 있다.
 
  • 고립형 입출력 (Isolated I/O)
    • 메모리 주소 공간과 입출력 주소 공간을 별도의 주소 공간으로 취급하여, 메모리 주소 공간과 입출력 주소 공간이 각각의 공간을 따로 사용하는 방식이다.
    • CPU와 메모리 사이에는 제어 버스가 있다.
      • 제어 버스는 명령어에 따라 CPU가 어디에 어떻게 접근해야 하는지를 결정한다.
      • 메모리 맵 입출력과 다르게, 장치 컨트롤러별 입출력 여부를 제어 버스에 지정하는 입출력 명령어를 별도로 사용한다.
        • 메모리 접근 명령어에는 읽기/쓰기 두 종류가 있는데, 메모리 읽기/쓰기 여부를 결정한다.
        • 여기에 입출력 명령어가 추가된다면, 연결된 입출력장치 중 어떤 장치에 읽기/쓰기 연산을 할지 결정하는 부분을 제어 버스에 추가할 수 있다. 어떤 명령어를 실행하느냐에 따라 메모리에 접근할지, 입출력장치의 장치 컨트롤러에 접근할지 결정할 수 있다.
        • 따라서, 제어버스에서 명령어에 따라 메모리에 접근할지 입출력장치의 장치 컨트롤러에 접근할지 결정하게 한다면, 메모리 주소 공간과 입출력 주소 공간을 같은 공간에서 공유할 필요가 없다. 공유하지 않음으로써 메모리와 장치 컨트롤러는 각각의 주소 공간을 더 넓게 쓸 수 있다.
 

인터럽트 기반 입출력

  • 연결된 여러 입출력 장치들로부터 한꺼번에 인터럽트 신호가 CPU에 들어올 경우, 어떻게 처리할 것인가?
  • CPU는 인터럽트 서비스 루틴을 한 번에 하나씩만 실행할 수 있지만, 인터럽트 중에는 즉각적으로 처리해야 하는 인터럽트가 있다. 따라서 인터럽트들 간 우선순위를 정해서 처리해야 한다.
    • 이러한 목적으로 PIC가 쓰인다. PIC는 장치 컨트롤러들과 연결되어, 인터럽트들 간 우선순위를 정하는 데 쓰이는 하드웨어 장치를 의미한다.
 
  • PIC (Programmable Interrupt Controller)
    • 입출력장치들의 인터럽트 신호들을 받아, 이들의 우선순위를 부여하고 CPU에 현재 우선순위를 알림으로써 우선순위가 높은 순서대로 인터럽트를 처리하는 역할을 수행한다.
    • 새로 PIC에 들어온 인터럽트의 우선순위가 현재 처리중인 인터럽트의 우선순위보다 높다면, 현재 처리중인 인터럽트의 처리를 중단하고 우선순위가 더 높은 새 인터럽트를 먼저 처리한다.
    • NMI (Non-maskable Interrupt)는 플래그 레지스터 내부의 인터럽트 비트가 비활성화되어 있어도 실행되는데, 인터럽트 처리 우선순위가 가장 높다. 따라서 PIC는 NMI의 우선순위를 따지지 않고 즉각적으로 이를 처리한다.
 
  • PIC의 다중 인터럽트 처리 과정
      1. PIC가 장치 컨트롤러로부터 인터럽트 요청 신호들을 받아들인다.
      1. PIC는 인터럽트 우선순위를 판단하고 CPU에서 처리할 인터럽트 요청 신호를 보낸다.
      1. CPU는 PIC로부터 인터럽트 요청 신호를 받고, 인터럽트 확인 신호를 다시 PIC에 보낸다.
      1. PIC는 데이터 버스를 통해 인터럽트 벡터를 CPU로 보낸다.
      1. CPU는 인터럽트 벡터를 통해 인터럽트 요청 주체인 입출력장치가 무엇인지 확인하고, 해당 장치의 인터럽트 서비스 루틴을 인터럽트 벡터로부터 가져와 실행한다.
 
  • PIC는 계층적으로 구성되어, 입출력장치로부터 더 많은 하드웨어 인터럽트를 관리할 수 있다.
  • NMI는 우선순위가 항상 최상위이며, 플래그 레지스터 내부의 인터럽트 플래그가 0이더라도 무조건 실행된다. 따라서, PIC는 NMI의 우선순위를 따지지 않으며, 인터럽트 플래그에 의해 인터럽트 실행 여부가 결정되는 하드웨어 인터럽트들 간 우선순위를 결정하는 역할을 한다.
 

DMA 입출력

💡
CPU의 개입 없이 메모리입출력장치 간 데이터를 주고받으며 입출력을 수행하는 방식
  • 기존의 프로그램 입출력, 인터럽트 기반 입출력 방식은 CPU가 입출력 과정에 크게 관여하였다. 이러한 방식은 입출력 작업 외에 CPU가 처리해야 할 다른 작업들을 방해하여 CPU의 성능을 떨어트린다.
  • DMA 입출력은 CPU가 해야 할 일 대부분을 DMA 컨트롤러라는 별도의 하드웨어가 대신 수행하여, CPU의 입출력 처리 비중을 크게 줄인다.
  • DMA 입출력 처리 과정은 다음과 같다.
      1. CPU는 입출력 명령어를 찾았을 때, 입출력에 필요한 다음 정보들을 DMA 컨트롤러에 입력하고 DMA 컨트롤러가 입출력 작업을 시작할 수 있게 한다.
          • 입출력장치의 주소
          • 읽기/쓰기 작업 여부
          • 읽기/쓰기 대상 메모리의 주소
          • 그 외
      1. DMA 컨트롤러는 CPU 대신 장치 컨트롤러와 상호작용하여 입출력 작업을 진행하고, 필요시 메모리에 접근하여 데이터를 읽고 쓴다.
      1. 입출력 작업이 끝나면 DMA 컨트롤러는 CPU에 인터럽트를 걸어 입출력이 완료됐음을 알린다.
 
  • 요약
    • 입출력 작업에서의 CPU의 역할은 맨 처음 DMA 컨트롤러에 정보를 입력하는 것과, 입출력이 끝나고 인터럽트 서비스 루틴을 실행하는 것뿐이다.
    • 시스템 버스는 CPU와 DMA 컨트롤러가 사용하는 공유자원으로, 한 번에 한 요소만 접근할 수 있다. 입출력 작업을 위해서는 DMA 컨트롤러가 시스템 버스를 사용해야 하는데, 사용하는 동안에는 CPU가 시스템 버스를 사용할 수 없다. 따라서, DMA 컨트롤러의 시스템 버스 사용 시간 및 빈도가 늘수록 CPU의 처리율이 떨어진다. 이를 사이클 스틸링 (Cycle stealing)이라고 한다.
      • 이러한 시스템 버스의 문제점으로 인해, I/O 버스가 도입되었다.
 

I/O 버스

  • I/O 버스는 DMA 컨트롤러와 입출력 장치의 장치 컨트롤러 간 데이터 송수신을 위한 버스로, CPU와 공유하는 시스템 버스를 DMA 컨트롤러가 덜 사용하도록 하기 위해 도입되었다.
  • I/O 버스는 DMA 컨트롤러와 입출력 장치 사이에 위치해 있기 때문에, DMA 컨트롤러의 메모리 접근 시 여전히 시스템 버스를 사용해야 한다.
  • 최근에는 I/O 프로세서 혹은 I/O 채널이 도입되어, DMA 컨트롤러에서 입출력 명령어의 인출, 해석, 실행뿐 아니라 메모리 직접 접근 작업을 수행하는 프로세서의 역할을 수행할 수 있게 되었다.
 

문제풀이

notion image
notion image