입출력 시스템
- 컴퓨터의 주요한 두 가지 작업은 연산 작업, 입출력 작업
- 마우스, 키보드, 모니터와 같은 다양한 장치들이 컴퓨터와 잘 동작하게 하려면 둘 사이에 공통된 인터페이스 존재해야 함
- 컴퓨터와 하드웨어 장치 사이의 공통된 인터페이스 역할을 수행하는 것이 입출력 관리의 핵심
- 운영체제 커널이 다양한 입출력 장치들의 차이를 가려주기 위해 장치 구동기 모듈 사용
- 장치 구동기는 모든 하드웨어를 일관된 인터페이스로 표현함
입출력 하드웨어의 구성
- 하드웨어 장치는 케이블을 통하거나, 무선으로 신호를 보내어 컴퓨터와 통신 함
- 이때, 포트를 통해 컴퓨터에 접속하는데 하드웨어 장치의 또 다른 구성요소는 제어기임
- 제어기: 포트 또는 입출력 장치를 제어하는 전자회로의 집합체, 많은 입출력 장치는 제어기를 내장함
- 모든 제어기는 레지스터를 가짐
- 컴퓨터 프로세스는 제어기 레지스터에 bit pattern 을 쓰거나 읽음으로써 입출력을 실행함
입출력 하드웨어 동작
폴링
- 장치 제어기의 레지스터에는 busy bit이 있음
- busy bit: 현재 장치가 사용 가능한 상태인지, 다른 작업을 처리하는 중이어서 사용이 불가능한 상태인지를 나타내는 bit
- 1: 제어기 작업 중
- 0: 제어기 준비 중
- 컴퓨터는 장치가 사용 중인지를 알기 위해 주기적으로 busy bit을 검사해야 하는데, 이 과정을 폴링이라고 함
- 폴링 자체는 컴퓨터 자원 많이 소요 안 하지만, 장치가 준비하는 시간이 길어질 경우 매우 비효율적인 단점 존재
- 이런 경우, 제어기가 자신의 상태가 바뀔 때 컴퓨터에 통보해주는 방식으로 비효율을 막을 수 있음
- 이때 발생시키는 신호가 인터럽트
인터럽트
- 인터럽트: CPU가 프로그램을 실행하고 있을 때, 입출력 하드웨어 등의 장치나 예외상황이 발생하여 처리가 필요한 경우에 CPU에게 알려 처리할 수 있도록 하는 것
- CPU는 인터럽트 요청 라인이라는 선을 가지는데 CPU는 매번 명령어를 끝내고 다음 명령어를 수행하기 전에 이 선을 검사함
- 만약 입출력 장치의 준비가 완료되어서 인터럽트 요청 라인에 신호를 보내면, CPU는 인터럽트 확인 후 인터럽트 핸들러 실행함
- 인터럽트 핸들러: 입출력 장치를 서비스함으로써 입터럽트 처리
- CPU는 인터럽트 발생 시, 직전 작업 상태를 저장해두고 인터럽트 처리함
- 인터럽트 처리가 완료된 이후에는 인터럽트가 발생하기 전의 상태로 복구시켜 중단되었던 작업 재개함
인터럽트 작업 순서
- 사용자가 키보드를 사용해 입력하면 키보드 컨트롤러가 인터럽트를 발생, CPU에게 알림
- CPU는 현재 수행 중이던 작업의 상태를 저장, 인터럽트 요청을 처리하기 위해 운영체제 내에 정의된 키보드 인터럽트 처리 루틴을 찾음
- 키보드 인터럽트 처리 루틴을 실행, 완료
- 인터럽트 처리가 끝나면 인터럽트가 발생하기 직전 상태를 복구시켜 중단되었던 작업을 재개
직접 메모리 접근 (DMA, Direct Memory Access)
- CPU를 사용하여 디스크와 같은 대용량 입출력 장치의 데이터를 읽으면 CPU 사용량이 매우 많아져 컴퓨터 성능이 심각하게 저하되는 문제 발생함
- 이러한 CPU의 낭비를 막기 위해서 PIO를 DMA 제어기라고 불리는 특수 프로세서에게 위임하여 CPU의 일을 줄임
// PIO: CPU가 1 Byte씩 옮기는 입출력 방식
- 컴퓨터는 메모리에 DMA 명령 블록을 쓰는데, 이 블록에는 전송할 데이터가 있는 곳의 포인터 + 전송할 장소에 대한 포인터 + 전송될 바이트 수가 기록 됨
- CPU는 DMA 명령 블록의 주소를 DMA에게 알려주고 자신의 다른 일을 처리함
- DMA는 CPU의 도움 (개입) 없이 자신이 직접 버스를 통해 DMA 명령 블록에 접근하여 입출력을 실행함
DMA의 작업 순서
- CPU가 입출력 요청을 보냄
- DMA 제어기의 레지스터에 주소와 전송 길이가 저장
- DMA 제어기는 한 블록의 입출력 동작을 수행, 그동안 CPU는 다른 작업을 함
- 입출력 동작 완료 시 DMA 제어기는 CPU에게 완료했다는 인터럽트를 보냄
참고
1. https://velog.io/@ragi/Back-end-%EC%9E%85%EC%B6%9C%EB%A0%A5IO-%EA%B4%80%EB%A6%AC
'Backend Loadmap > Operating System' 카테고리의 다른 글
[백엔드로드맵][OS] 기본적인 네트워크 개념 (0) | 2023.05.24 |
---|---|
[백엔드로드맵][OS] POSIX 기초 (0) | 2023.05.20 |
[백엔드로드맵][OS] 프로세스 간 통신 (IPC)란? (1) | 2023.05.09 |
[백엔드로드맵][OS] 메모리 관리 (0) | 2023.04.24 |
[백엔드로드맵][OS] 기본적인 터미널 명령어 (0) | 2023.04.07 |