Notice
Recent Posts
Recent Comments
Link
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Tags more
Archives
Today
Total
관리 메뉴

ultra_dev

입출력장치 본문

혼자 공부하는 컴퓨터구조+운영체제

입출력장치

ultra_dev 2023. 9. 12. 22:04

입출력장치

  • 입출력 장치는 종류가 많아서 장치마다 속도, 데이터 전송 형식 등도 다양하다.
  • → 다양한 입출력장치와 정보를 주고 받는 방식을 규격화 하기 어렵다
  • 일반적으로 cpu와 메모리의 데이터 전송률은 높지만 입출력장치의 데이터 전송률은 낮다.

같은 1초여도 cpu는 많은 데이터 전송 가능하지만 입출력은 더 적은 데이터 전송 가능

  • 전송률 : 데이터를 얼마나 빨리 교환할 수 있는지를 나타내는 지표

장치 컨트롤러

이런 이유 때문에 등장한 게 바로 장치 컨트롤러임

입출력 제어기 혹은 입출력 모듈이라고도 부름

 

입출력장치는 장치컨트롤러를 통해 컴퓨터 내부와 정보를 주고 받는다.

 

 

장치 컨트롤러의 역할

  • cpu와 입출력장치 간의 통신 중개(규격화 안된 다양한 입출력장치들을 번역해주는 느낌)
  • 오류 검출 (장치 컨트롤러와 연결된 입출력장치에 오류가 있는지 확인)
  • 데이터 버퍼링
    • 버퍼링 : 전송률이 높은 장치와 낮은 장치 사이에 주고 받는 데이터를 버퍼라는 임시 저장 공간에 저장하여 전송률을 비슷하게 맞추는 방법
    • 데이터를 많이 받아서 조금씩 내보내거나, 조금씩 모았다가 한꺼번에 내보내거나!!
    • cpu처럼 전송률 높은 곳에서 받은 데이터를 버퍼에 담았다가 천천히 입출력장치에 내보내거나
    • 전송률 낮은 입출력장치에 있는 데이터를 모았다가 한번에 cpu한테 내보내거나 이런식!!
    • 전송률의 차이를 완화해주는 느낌

장치 컨트롤러의 구조

  • 장치 컨트롤러는 시스템버스(입출력버스)에 연결 돼서 정보를 주고 받게 됨
  • 여기서 주고받는 정보는 데이터 레지스터, 상태 레지스터, 제어 레지스터에 저장됨
    • 상태 레지스터와 제어 레지스터는 하나의 레지스터(상태/제어 레지스터)로 사용되기도 함

데이터 레지스터

  • cpu와 입출력장치 사이에 주고받을 데이터가 담기는 레지스터(버퍼 역할)
  • 최근엔 입출력장치 자체도 주고 받을 데이터가 너무 많아져서 레지스터말고 RAM 사용하기도..

상태 레지스터

  • 상태 정보 저장
    • 입출력 장치가 입출력 작업을 할 준비가 되었는지
    • 입출력 작업이 완료되었는지
    • 입출력장치에 오류는 없는지 등의 상태 정보

제어 레지스터

  • 입출력장치가 수행할 내용에 대한 제어 정보

장치 드라이버

장치 컨트롤러의 동작을 감지하고 제어하는 프로그램

 

장치 컨트롤러가 입출력장치를 연결하기 위한 하드웨어적 통로라면

장치 드라이버는 입출력장치를 연결하기 위한 소프트웨어적 통로

 

즉, 장치 드라이버는 장치 컨트롤러가 컴퓨터 내부와 정보를 주고받을 수 있게 하는 프로그램

ex) 내가 프린터 동작시키는 방법을 알아! 이렇게 실행하면 돼!

 

운영체제가 연결된 장치의 드라이버를 인식하고 실행할 수 있다면

컴퓨터 내부와 정보를 주고 받을 수 있음



다양한 입출력 방법

세가지 입출력 방식 : 프로그램 입출력, 인터럽트 기반 입출력, DMA 입출력

프로그램 입출력

:입출력장치에 연결된 장치 컨트롤러를 프로그램 속 명령어로 제어하는 방법

  • 프로그램 속 명령어로 입출력장치를 제어하는 방법
  • 입출력 명령어로써 장치 컨트롤러와 상호작용

메모리에 저장된 정보를 하드 디스크에 백업

(= 하드 디스크에 새로운 정보 쓰기)


  1. cpu는 하드 디스크 컨트롤러의 제어 레지스터에 쓰기 명령을 내보냄
  2. 하드 디스크 컨트롤러는 쓰기 작업할 수 있는지 하드 디스크 상태 확인 → 상태 레지스터에 준비 완료 표시

   3. cpu는 상태 레지스터를 주기적으로 읽어보며 하드 디스크의 준비 여부를 확인

   4. 하드 디스크가 준비되었다면 백업할 메모리의 정보를 데이터 레지스터에 쓰기

 

만약 아직 백업 작업(쓰기 작업)이 끝나지 않았다면 1번부터 4번까지 반복, 쓰기가 끝났다면 작업 완료!

 

즉 프로그램 입출력 방식은 cpu가 장치 컨트롤러의 레지스터 값을 읽고 씀으로써 이루어 진다.

 

 

 

Question

cpu는 이 레지스터들(입출력장치의 주소)를 어떻게 알까? 입출력장치는 매우 다양한데!

ex) 프린터 컨트롤러의 상태 레지스터를 읽어라, 프린터 컨트롤러의 데이터 레지스터 100을 써라, 하드 디스크 컨트롤러의 데이터 레지스터에 ‘a’를 써라

 

이런 명령어들은 어떻게 표현되고 어떻게 메모리에 저장되는가

 

1.메모리 앱 입출력

2.고립형 입출력

 

1.메모리 앱 입출력

 

: 메모리에 접근하기 위한 주소 공간과 입출력장치에 접근하기 위한 주소 공간을
: 하나의 주소 공간으로 간주하는 방법

예를 들어 1024개 주소를 표현할 수 있는 컴퓨터라면

1024개 전부를 메모리를 위해 두는게 아니라

512개는 입출력장치를 위한 주소 공간으로 쓰는 것

ex)

516번지 : 프린터 컨트롤러의 데이터 레지스터

517번지: 프린터 컨트롤러의 상태 레지스터

518번지: 하드 디스크 컨트롤러의 데이터 레지스터

519번지: 하드 디스크 컨트롤러의 상태 레지스터

→ 517번지를 읽어 들여라 == 프린터 상태 읽기

→ 518번지에 a를 써라 == 하드 디스크에 a 쓰기

메모리 접근 명령어 == 입출력장치 접근 명령어

 

2. 고립형 입출력

 

메모리를 위한 주소 공간과

입출력 장치를 위한 주소 공간을 분리한다.

 

메모리 앱 입출력과 달리 1024개 주소를 표현할 수 있는 컴퓨터에서

1024개를 전부 메모리를 위해 사용할 수도 있고, 입출력 장치를 위해 사용할 수도 있다

 

어떻게 가능할까?

 

(입출력 읽기/쓰기 선을 활성화 시키는) 입출력 전용 명령어를 사용하기 때문

 

제어 버스에서 메모리 읽기/쓰기 버스 뿐만 아니라 입출력장치 읽기/쓰기 선이 별도로 존재!!

 

만약에 cpu가 메모리 읽기/쓰기 선이 활성화되는 명령어 실행하면 메모리에 접근하고

입출력장치 읽기/쓰기 선이 활성화 되는 명령어(입출력 전용 명령어) 실행하면 입출력장치에 접근

 

 



 

인터럽트 기반 입출력

하드웨어 인터럽트는 장치 컨트롤러에 의해 발생

 

앞에서 다뤘던 프로그램 입출력에서 cpu가 상태 레지스터 주기적으로 확인해가며 준비 여부 확인하던 거랑 달리

여기선 인터럽트 신호 보내서 해결

 

만약 동시다발적인 인터럽트가 발생한다면?

키보드, 모니터, 스피커 등의 장치컨트롤러가 전부 인터럽트 요청 보내면!?

 

물론 인터럽트 비트 비활성화하고 순차적으로 인터럽트 처리할 수도 있지만 비효율적이고 비현실적임

그리고 하드웨어 고장이나 정전같은거는 비활성화해도 그 인터럽트는 처리할 수 밖에 없음

 

더 빨리 처리해야할, 우선순위가 높은 인터럽트가 있는데 순차적으로 처리하는건 비효율적

 

 

우선순위를 반영한 인터럽트 방법

 

PIC(Programmable Interrupt Controller) 이용

  1. 여러 장치의 컨트롤러에 연결 되어
  2. 장치 컨트롤러의 하드웨어 인터럽트의 우선순위를 판단한 뒤
  3. cpu에게 지금 처리해야 하는 인터럽트가 무엇인지 판단하는 하드웨어다.

PIC 핀들에 연결된 장치컨트롤러들이 인터럽트 요청 신호 보내면

PIC는 장치컨트롤러와 cpu 사이에서 어느 인터럽트를 처리할지 보내줌

PIC는 여러개 사용하는 경우 많음

 

 

지금까지 본 프로그램 입출력, 인터럽트 기반 입출력은

  • 입출력 장치와 메모리 간의 데이터 이동을 cpu가 주도하고
  • 이동하는 데이터도 반드시 cpu를 거친다는 공통점이 있다.

ex) cpu가 장치컨트롤러인 하드디스크 같은 곳의 데이터레지스터에서 메모리에 쓰고자 하는 값을 읽어 들이고 이걸 다시 메모리에 쓰는 것, cpu가 메모리에서 값 읽어서 장치컨트롤러의 데이터레지스터에 보내고

 

→ 가뜩이나 cpu는 바쁜데 하드디스크 백업같은 대용량 데이터 이동한다면 엄청 바빠질 것임

이런 경우를 위해 DMA 입출력이 존재

 

DMA(Direct Memory Access)

  • cpu를 거치지 않고 입출력 장치가 메모리에 직접적으로 접근하는 기능

DMA 입출력 과정

  • CPU는 DMA 컨트롤러에 입출력 작업을 명령
  • DMA 컨트롤러는 CPU 대신 장치 컨트롤러와 상호 작용하며 입출력 작업을 수행
    • 이때 DMA컨트롤러는 필요한 경우 메모리에 직접 접근
  • 입출력 작업이 끝나면 DMA 컨트롤러는 인터럽트를 통해 CPU에 작업이 끝났음을 알림

→ 이 경우 cpu는 입출력 작업의 시작과 끝남 관여하면 됨

 

 

문제점

: 시스템 버스는 공용 자원이기 때문에 동시 사용이 불가능하다.

: cpu가 시스템버스 사용 중일 때는 DMA 컨트롤러는 시스템 버스 사용할 수 없고

: DMA 컨트롤러가 시스템 버스 사용할 때는 cpu가 시스템 버스를 사용할 수 없다.

 

 

따라서

DMA 컨트롤러는

  1. cpu가 시스템 버스를 이용하지 않을 때마다 조금씩 시스템 버스 이용
  2. cpu가 일시적으로 시스템 버스를 이용하지 않도록 허락을 구하고 시스템 버스 이용

1,2번식으로 cpu가 써야할 시스템버스를 야금야금 빼먹어가며 이용하는 걸 cycle stealing이라고도 부름

 

입출력 버스

만약 장치컨트롤러들이 시스템 버스와 바로 연결돼있으면

메모리에서 dma컨트롤러로

dma컨트롤러에서 장치컨트롤러로

불필요하게 시스템버스를 2번 이용하게 됨 이때 나오는게 입출력 버스임!!

 

 

장치 컨트롤러들을 입출력 버스에 연결해서 시스템 버스의 이용 빈도를 낮춘다!

 

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

프로세스와 스레드  (0) 2023.09.21
운영체제  (0) 2023.09.19
보조기억장치  (0) 2023.09.11
메모리와 캐시 메모리  (0) 2023.09.10
cpu의 성능 향상 기법  (0) 2023.09.09
Comments