티스토리 뷰
https://www.youtube.com/watch?v=1Pp6PJ1kSqI&list=PLVsNizTWUw7FCS83JhC1vflK8OcLRG0Hl&index=22
초심으로 돌아가서 다시 정리하는 개념입니다.
이미 알고 있어 스킵하는 부분도 있으니, 직접 보시는 걸 추천드립니다.
입출력장치의 정보 주고 받기
입출력장치들은 어떻게 컴퓨터 내와 어떻게 데이터를 주고받는가?
보조기억장치도 이 방식과 똑같다.
입출력장치는 앞서 학습한 CPU, 메모리보다 다루기 까다롭다.
1. 입출력장치에는 종류가 너무나도 많다.
장치가 다양하면 정보를 주고받는 방식을 규격화하기 어렵다.
2. 일반적으로 CPU와 메모리의 데이터 전송률은 높지만, 입출력장치의 데이터 전송률은 낮다.
*전송률이란 데이터를 얼마나 빨리 교환할 수 있는지를 나타내는 지표
이러한 이유들 때문에 등장한 것이 장치 컨트롤러다.
장치 컨트롤러
장치 컨트롤러는 하드웨어다.
입출력장치는 장치 컨트롤러를 통해 컴퓨터 내부와 정보를 주고받는다.
장치 컨트롤러의 역할
- CPU와 입출력장치 간의 통신 중개 - 일종의 번역가 역할 수행(정보 규격화 해결)
- 오류 검출 - 문제가 있지는 않은지
- 데이터 버퍼링
버퍼링 - 전송률이 높은 장치와 낮은 장치 사이에 주고 받는 데이터를 버퍼 라는 임시 저장 공간에 저장하여 전송률을 비슷하게 맞추는 방법
데이터를 한꺼번에 많이 받아서 내보내거나, 조금 조금씩 전송률이 낮은 걸 모아서 한 번에 내보낸다.
장치 컨트롤러의 구조
장치 컨트롤러는 입출력 버스에 연결된다.
데이터 레지스터
상태 레지스터
제어 레지스터
상태와 제어는 하나로 쓰이기도 한다.
데이터 레지스터
- CPU와 입출력장치 사이에 주고받을 데이터가 담기는 레지스터(버퍼)
- RAM을 사용하기도 한다
상태 레지스터
- 상태 정보 저장
- 입출력 장치가 입출력 작업을 할 준비가 되었는지
- 입출력 작업이 완료되었는지
- 입출력장치에 오류는 없는지 등의 상태 정보
제어 레지스터
- 입출력 장치가 수행할 내용에 대한 제어 정보
장치 드라이버
장치 컨트롤러가 하드웨어적인 통로라면, 장치 드라이버는 소프트웨어의 통로다
장치 컨트롤러의 동작을 감지하고 연결하는 프로그램이다.
장치 드라이버가 설치되어 있지 않다면 해당 입출력장치를 사용할 수 없다.
장치 컨트롤러를 어떻게 동작시키는지 CPU가 알 수 있게 해준다.
입출력 장치의 인식이 안된다면 가장 먼저 드라이버의 동작 여부 확인
장치 드라이버를 인식하고 실행시켜주는 주체는 사실 운영체제다.
다양한 입출력 방법
세 가지 입출력 방식
- 프로그램 입출력
- 인터럽트 기반 입출력
- DMA 입출력
프로그램 입출력
프로그램 속 명령어로 입출력장치에 연결된 장치 컨트롤러 제어하는 방법
입출력 명령어로써 장치 컨트롤러와 상호작용
메모리에 저장된 정보를 하드 디스크에 백업한다면, 하드 디스크에 새로운 정보를 쓰는 상황을 생각해 보자.
1. CPU는 하드 디스크 컨트롤러의 제어 레지스터에 쓰기 명령 내보내기
2. 하드 디스크 컨트롤러는 하드 디스크 상태 확인 -> 상태 레지스터에 준비 완료 표시
3-1. CPU는 상태 레지스터를 주기적으로 읽어보면서 하드 디스크의 준비 여부를 확인
3-2. 하드 디스크가 준비되었다면 백업할 메모리의 정보를 데이터 레지스터에 쓰기
CPU가 장치 컨트롤러의 레지스터 값을 읽고 씀으로서 이루어지는 프로그램 입출력 장치
근데 입출력 장치가 다양한데, 어떻게 CPU가 모든 장치 컨트롤러의 레지스터의 종류를 알까?
프로그램 입출력 방식 : 메모리 맵 입출력 & 고립형 입출력 - 로우 레벨 개발 할 떄 꼭 알아야 한다.
CPU가 장치 컨트롤러 레지스터를 알기 위한 방식으로 2가지가 있다.
메모리 맵 입출력
메모리를 보낼 때 전체를 메모리를 접근하기 위한 주소 공간을 전체로 쓰지 않는다.
메모리에 접근하기 위한 주소 공간과
입출력장치에 접근하기 위한 주소 공간을
하나의 주소공간으로 간주하는 방법
메모리 접근 명령어 == 입출력장치 접근 명령어가 똑같이 생겼다.
동일한 주소공간처럼 간주했기 때문이다.
그래서 별도의 명령어가 필요하지 않은 방식이다.
하지만 주소 공간이 축소된다.
고립형 입출력
고립형 입출력은 메모리형 입출력과 반대이다.
메모리를 위한 주소 공간과 입출력 장치를 위한 주소 공간을 분리하는 방법
고립형 입출력에서는 입출력 전용 명령어로 두 개의 명령어를 동시에 사용한다.
제어 버스의 메모리 읽기 쓰기 선과 입출력장치 읽기 쓰기 선을 동시에 활용할 때 사용가능.
IN, OUT 같은 명령어
인터럽트 기반 입출력
인터럽트 복습
- 인터럽트의 개념
- 플래그 레지스터 속 인터럽트 비트
- 인터럽트 요청 신호
- 인터럽트 서비스 루틴
하드웨어 인터럽트는 장치 컨트롤러에 의해 발생한다.
이를 통해 CPU가 더 효율적으로 가능하다.
상태 레지스터를 주기적으로 읽어봤었지만, 콜링이 발생하면 그때 가서 봐주면 되기 때문
동시다발적인 인터럽트 : 입출력장치가 많을 때를 가정해보자.
키보드, 모니터, 스피커, 마우스
CPU는 이 많은 요청 신호를 어떤 순서로 해야 할까?
인터럽트 발생 순서대로?
플래그 레지스터 속 인터럽트 비트를 비활성화한 채여도 할 수 없는 인터럽트가 있다(긴급한 인터럽트)
그런 인터럽트를 제외하고는 순차적으로 처리하는 게 이상적이다.
그런데 현실적으로 모든 인터럽트를 순차적으로 처리할 순 없다.
인터럽트 중에서도 우선순위가 있기 떄문이다.
인터럽트 A에서 인터럽트 서비스 루틴을 읽는 도중에 중단하여, 점프해서 인터럽트 B의 서비스 루틴을 먼저 처리하고, 다시 A로 돌아와 수행한다.
가장 대중적으로 사용되는 방식은 PIC를 사용하는 방법이 있다.
1. 여러 장치 컨트롤러에 연결되어
2. 장치 컨트롤러의 하드웨어 인터럽트의 우선순위를 판단한 뒤
3. CPU에게 지금 처리해야 하는 인터럽트가 무엇인지 판단하는 하드웨어다.
한마디로 CPU의 비서라고 생각하면 된다.
MMI(긴급명령)까지 판단하진 않는다. 긴급명령의 경우에는 CPU에 다이렉트로 꽂는다.
DMA 입출력
프로그램 입출력, 인터럽트 기반 입출력의 공통점?
입출력 장치와 메모리 간의 데이터 이동은 CPU가 주도하고,
이동하는 데이터도 반드시 CPU를 거친다.
너무 당연한 소리인가?
근데 CPU는 가뜩이나 바쁜데, 대용량 데이터도 처리해야 하나?
이래서 DMA(Direct Memory ACCESS)가 나왔다.
현대 입출력 장치에 있어서 가장 중요한 기능
CPU를 거치지 않고, 입출력 장치가 메모리에 직접적으로 접근가능 기능
이를 위해서는 DMA 컨트롤러가 필요하다
1. CPU는 DMA 컨트롤러에 입출력 작업을 명령 - DMA 컨트롤러가 CPU의 작업을 대신한다.
2. DMA 컨트롤러는 CPU 대신 장치 컨트롤러와 상호작용하며 입출력 작업을 수행 - 이때 DMA 컨트롤러는 메모리에 직접 접근할 수 있다.
3. 입출력 작업이 끝나면 DMA 컨트롤러는 인터럽트를 통해 CPU에 작업이 끝났음을 알림
CPU를 대행해서 DMA 컨트롤러가 장치 컨트롤러와 상호작용하고, 메모리에서 입출력 작업을 수행한다.
입출력 작업이 끝나면 CPU에게 알린다.
즉, CPU는 입출력 작업의 시작과 끝만 관여한다.
DMA 입출력의 문제
DMA를 이용할 때는 시스템 버스를 이용하는데, 이떄는 CPU도 시스템 버스를 이용하지 못한다(한 번에 하나만 쓸 수 있음)
그래서
1. CPU가 시스템 버스를 이용하지 않을 때마다 조금씩 시스템 버스를 이용
2. CPU가 일시적으로 시스템 버스를 이용하지 않도록 허락을 구하고 시스템 버스 이용
하는 방법이 있다.
사이클 스틸링이라고도 부른다.
입출력 버스
장치 컨트롤러가 전부 시스템 버스에 연결되어 있다.
사실 괜찮지 않다. DMA를 하는 과정에서 불필요하게 시스템 버스를 2번 이용하게 된다.
읽기 위해서 한 번, 쓰기 위해서 한 번
이 문제를 방지하기 위해서 입출력 버스를 통해 시스템 버스의 이용 빈도를 낮춘다.
DMA 컨트롤러는 시스템 버스를 통해 CPU와 메모리하고만 상호작용하고,
입출력 버스에는 입출력 장치를 전부 연결해준다.
PCI 버스, PCI express( PCLe) 버스와 입출력 장치를 연결짓는 슬롯
이 DMA 방식은 입출력 전용 프로세서까지 탑재하는 지경까지 이르렀다.
입출력 작업을 실행하는 것까지도 DMA 컨트롤러가 해준다.