IO Device Communication

갱두·2021년 12월 2일
1

📚 운영체제

목록 보기
10/14
post-thumbnail

🚀 요약

✅ 컨트롤러에게 데이터/커맨드를 보내기 위해서는 ?
Direct IO vs Memory Mapped IO

✅ IO 데이터가 많은 경우
DMA(Direct Memory Acess)

✅ IO가 준비되었는지는 어떻게 알아?
Interrupt - driven IO vs Polling

정의

✔️ IO Controller 는 Input device와 Output device를 버스 시스템을 통해서 CPU와 연결해주는 역할을 함
✔️ Device Controller 는 port, bus, device에서 실행 가능한 electronics(ex. 프로세서, 레지스터, 메모리.. ) 의 컬렉션임

  • 프로세서가 어떻게 IO device한테 커맨드를 전달?
    Device controller는 주로 레지스터를 갖고 있는데 이 레지스터에서 OS가 커맨드, 써야하는 data, 주소 등을 저장하거나 명령 실행 후 레지스터에서 데이터를 읽을 수 있음
  • 간단하게 OS나 CPU나 Memory에 있는 값을 레지스터에 써주면 디바이스가 작동한다는 거

✔️ IO device가 동작하는 방법은 한가지 : 레지스터에 쓰여 있는 값을 읽어서 동작함
근데 동작시키는 방법(레지스터에 접근하는 방법)은 여러가지 🔽

Direct IO

CPU가 장치의 레지스터에 직접 명령을 작성해서 I/O 명령을 내림

✔️ CPU가 디바이스한테 Direct IO정보를 넘겨줌

  • 각 device controller register 에 포트 번호 주소가 할당이 됨(by OS)
  • control / data byte / word를 컨트롤 라인을 통해 포트로 바로 전달하기 위해 특별한 IO instruction 을 사용함

✔️ 데이터를 전송하는 데 느리다

  • 큰 데이터를 요구하는 device에서 효율 ❌

예시) Port Mapped Instruction (Special Instruction)

⚠️ 특정 IO 레지스터에 접근하기 위한 명령어가 따로 존재 ⚠️

Memory Mapped IO

Device control 레지스터가 메모리 주소 공간에 mapping 된 것. 따라서 CPU는 메모리의 mapping된 위치에서 읽기/쓰기를 통해 I/O 요청을 실행합니다.

✔️ 메모리의 주소 중 일부를 IO 레지스터한테 부여함

  • 메모리 주소만 부여할 뿐, 실제로(물리적으로) IO 레지스터는 메모리와 독립되어 IO 장치 안에 들어 있음.
  • 다만 해당 I/O 레지스터에게 부여된 메모리 주소로 접근을 시도하면 메모리가 아닌 그 I/O 레지스터에게 접근하게끔 구현되어 있을 뿐

✔️ 메모리에서 데이터를 읽는 명령어와 메모리에 데이터를 쓰는 명령어를 그대로 사용하여 특정 I/O 레지스터에 접근하는 방식

✔️ large address space에서 빠르다!

  • Graphics controller 에 주로 사용
    • 프로세스가 memory mapped 영역에 데이터를 기록해서 output을 스크린으로 보냄
    • 컨트롤러가 이 데이터를 기반으로 화면 이미지를 생성하는 것

DMA(Direct Memory Access)

IO device가 메모리에 직접 접근하여 읽거나 쓸 수 있도록 하는 기능

🔥 CPU의 개입 없이 🔥 IO 장치와 기억 장치 사이의 데이터를 접근하는 전송 방식인 것

PIO(Programmed IO)

CPU가 데이터를 주고 받는 방식임. 효율 🔽

하드디스크에서 데이터를 꺼낸 후 버스를 통해서 CPU 레지스터에 옮겨지고 다시 시스템을 통해서 CPU 레지스터에서 메모리로 이동함

  • CPU를 거쳐가기 때문에 지연시간도 있고
  • 가장 큰 문제점은 입출력 시간 동안 CPU가 idle 상태로 대기하는 것

+) 폴링 사용함

PIO단점을 제거한 것이 DMA

✔️ DMA Controller를 사용 : 하드디스크와 메모리를 직접 연결하여 CPU는 제어신호만 주고받을 뿐 데이터 전송에서 제외시킬 수 있다. 따라서 입출력 시 CPU는 제어를 위해 데이터 전송 시작과 완료에만 할당되어 CPU 자원의 낭비가 제거된다.

  • 간단하게 데이터 전송을 위해 CPU가 해야할 주변 장치와의 데이터 전송을 DMA Controller가 해줌 = CPU가 다른 일을 할 수 있다
  • DMA Controller가 할 일 다 끝내면 CPU한테 인터럽트 걸어서 알려줌

DMA 동작 순서

  1. IO 장치가 CPU한테 IO 요청 전송
  2. CPU가 DMA 컨트롤러한테 명령 송신
  3. DMA 컨트롤러가 CPU에게 시스템 버스 사용 허가 요청
  4. CPU가 시스템 버스 사용 허가
  5. DMA 컨트롤러가 IO 장치에서 데이터를 읽은 후에 메모리에 전송
  6. 메모리에 전송 완료 후 CPU한테 완료 신호 보냄

Polling

IO device가 준비 상태인지를 CPU가 지속적으로 확인하는 방법

✔️ IO port의 status 레지스터의 값( busy bit )을 수시로 확인: 해당 장치의 준비 상태를 검사할 수 있다.

  • 하지만 IO 장치가 준비될 때까지 기다리는 동안에 CPU가 다른 작업을 수행할 수 없기 때문에 낭비되는 사이클(시간)이 많다는 단점이 있다.

✔️ Polling Cycle
☝🏻 CPU가 IO Operation 요청

  • 만약에 busy bit가 1이면 0이 될때까지 계속해서 확인함

✌🏻 busy bit가 0이 되면 IO 컨트롤러가 작업 수행
🤟🏻 IO 작업 완료!

✔️ 간단하지만
✔️ CPU가 너무 오래 기다리게 될 수도 있음

그래서 사용하는 것이 인터럽트
➡️ 기다리면서 다른 일 할 수 있음

Interrupted - Driven IO

준비가 되면 IO device가 준비되었다고 알려주는 방법

CPU가 I/O 장치를 기다리지 않고 다른 작업을 수행하다가, I/O 장치가 준비되었다고 Interrupt 신호를 보내면 그때서야 인터럽트 루틴을 호출함으로써 해당 입출력 요청을 처리하게 된다.

✔️ 실행 순서
1. CPU가 리퀘스트를 받음
2,3. IO 컨트롤러가 CPU가 다른 일을 할 동안 데이터를 얻는다
4. IO 작업이 끝나면 IO 컨트롤러가 CPU한테 인터럽트 를 건다
5. 인터럽트 핸들러가 인터럽트 루틴을 호출하면서 요청 처리
6,7 CPU는 다시 resume

🔒 Interrupt

IO 장치에 의해 CPU의 하드웨어인 interrupt-request line이 트리거되면서 발생

  • 부팅될 때 OS가 하드웨어 버스를 탐색하면서 어떤 장치가 존재하는 지 확인
  • 알맞은 인터럽트 핸들러를 인터럽트 벡터에 저장함
    • 인터럽트 벡터 : 인터럽트 발생시 처리해야 할 인터럽트 핸들러의 주소를 인터럽트 별로 보관하고 있는 테이블
  • 런타임 때 CPU가 인터럽트를 받으면 : 인터럽트 벡터에서 알맞은 인터럽트 핸들러를 찾아가지고 인터럽트를 수행함

✔️ 사용되는 곳

  • IO device controller (아웃풋이 완료되었을 때나, 인풋이 사용가능할 때, 실패가 감지되었을 때 등 ,, )
  • exception 발생했을 때

✔️ 예시

  • page fault
  • system call

출처 : https://hydroponicglass.tistory.com/283
https://it-eldorado.tistory.com/24

profile
👩🏻‍💻🔥

0개의 댓글