계획
토요일부터 너무 놀았다!! 내일부턴 갓생 살아야지
학습한 내용
입출력 장치와 Device Driver, Device Controller
I/O 장치들은 다루기 어렵다. 그 이유들은 다음과 같다
- 입출력 장치 종류가 많아서 각자 언어가 다른 것과 같다.
- CPU와 메모리의 데이터 전송률에 비해 입출력 장치의 전송률이 낮다
이 문제를 해결하는 것이 Device Controller
라는 HW이다. Device Controller는 I/O 장치에 붙어있다.
Device Controller 출처 : https://simple.wikipedia.org/wiki/Device_controller
Device Controller의 역할은 다음과 같다.
- CPU와 I/O 장치간 통신 중계
- 입출력 장치에 대한 오류 검증
- 데이터 버퍼링
여기서 버퍼링이란, 전송률이 높은 장치와 낮은 장치 사이에 buffer라는 임시 공간을 두어, 데이터를 조금씩 저장하다가 한 번에 내보내(flush) 전송률 차이를 해결하는 방법이다.
그렇다면 CPU는 Device Controller와 어떻게 상호작용할까? Device Driver
라는 SW를 통해서 한다.
Device Driver란 Device Controller의 동작을 감지 / 제어해서 컴퓨터와 데이터를 주고 받을 수 있도록 한다. 만약, Device Driver가 설치되지 않았다면 보조기억 장치를 포함한 I/O 장치는 사용할 수 없다.
Device Controller와 CPU가 정보를 주고받는 방법(=I/O 작업 방법)의 종류는 다음과 같다.
- 프로그램 입출력 : 프로그램 명령어로 제어.
- 인터럽트 기반 입출력 : CPU에 명령을 보내 놓으면 Device Controller가 작업한 후 CPU로 인터럽트를 보낸다.
- 인터럽트들 간에 우선순위가 있어, 여러 인터럽트가 동시에 보내지더라도 우선순위 - 도착한 순서 순으로 인터럽트 서비스 루틴을 수행한다.
- 폴링(polling) 개념과 대조된다.
출처 : https://www.cs.uic.edu/~jbell/CourseNotes/OperatingSystems/13_IOSystems.html
- DMA 입출력
- DMA (Direct Memory Access): 데이터가 CPU를 거치지 않고 메모리와 I/O 장치간 전송될 수 있도록 한다. DMA I/O를 사용하려면 시스템 버스에 연결된 DMA Controller라는 HW를 필요로 한다
- DMA X 읽기 : I/O 장치 -> CPU -> 메모리
- DMA O 쓰기 : 메모리 -> CPU -> I/O 장치
- DMA O 쓰기 : 메모리 -> DMA Controller -> Device Controller(I/O 장치)
- DMA와 CPU는 시스템 버스를 공유하기 때문에 CPU가 시스템 버스를 사용하지 않을 때나, 미리 허락을 구하고 사용한다.
- 최근 DMA Controller에 명령 / 해석 / 실행하는 전용 CPU도 있다. I/P Processor 혹은 I/O Channel이라고도 부른다
출처 : https://www.cs.uic.edu/~jbell/CourseNotes/OperatingSystems/13_IOSystems.html
입출력 버스 : DMA를 위해 시스템 버스를 자주 사용하면 CPU가 시스템 버스를 사용하지 못하기 떄문에 DMA Controller와 Device Controller를 I/O 버스로 연결할 수 있다.
인터럽트
명령어 사이클 : 하나의 명령어가 처리되는 주기
인터럽트 : CPU의 작업을 방해하는 신호
- 동기 인터럽트 : CPU에 의해 발생하는 프로그래밍상 오류 등. Exception이라고 부른다
- 비동기 인터럽트 : IO 장치에 의해 발생하는 일종의 알림 역할. HW 인터럽트라고 한다.
- 다른 장치에 작업을 맡겨놓고 완료 여부를 받으면 그때 작업할 수 있기 때문에 CPU를 효율적으로 사용할 수 있다.
CPU는 실행 사이클이 끝나고 명령어 인출 전에 항상 인터럽트 여부를 확인한다.
인터럽트는 정상 실행 흐름을 끊는 것이기 때문에 CPU에게 인터럽트 해도 되는지 인터럽트 요청 신호
를 보내는데, 이걸 인터럽트 플래그
라고 부른다.
한편, 무시할 수 없는 인터럽트도 있는데, HW 인터럽트의 경우가 그렇다.
인터럽트가 실행될 떄 인터럽트 서비스 루틴을 실행하게 되는데 이때 인터럽트 실행 후 현재 하던 것들을 이어나가야 하기 때문에 현재 레지스터에 들어있던 값들을 Stack에 백업해 놓는다.
동기 인터럽트에는 다음과 같은 종류가 있다.
- 폴트 : 예외 처리 후 폴트가 발생한 명령어부터 재개
- 트랩 : 예외 처리 후 예외가 발생한 명령어의 다음 명령어부터 재개
- 중단 : CPU가 실행 중인 프로그램을 강제로 중단시킬 수 밖에 없는 심각한 오류 발견시 발생시킨다
- SW 인터럽트 : 시스템 호출 발생시 나타난다