들어가기 전에
학교 수업 때 배운걸 다시 정리해서 쓴 글입니다.
오타 및 잘못된 부분 지적은 언제나 환영입니다!
I/O 요청이 발생했을 때
DMA대해 설명하기 전 I/O 요청이 일어날 때의 처리 과정을 알아야 한다.
아래 그림은 디스크에서 데이터를 가져올 때이다.
우리가 사용하는 컴퓨터는 여러 장치들과 연결돼있다.
컴퓨터에도 CPU가 있고, 연결된 장치들에도 CPU가 있다.
(교수님은 메인 CPU를 엄마 CPU, 장치들의 CPU를 새끼 CPU라고 비유하셨다.)
메인 CPU가 각 장치들이 작업을 완료할 때 까지 기다리는 것은 매우 많은 시간이 들기 때문에
장치의 CPU에게 I/O작업을 맡기고, 작업이 완료될 때 까지 다른 프로세스의 일을 처리한다.
장치 내부의 로컬 버퍼에 데이터가 준비 되면 장치는 메인 CPU에게 I/O작업이 완료됐단 인터럽트를 보낸다.
그런데 메인 메모리의 접근은 CPU에서만 가능하다.
따라서, 각 장치들은 로컬 버퍼와 메모리 사이의 데이터를 옮길 때는 반드시 CPU를 거쳐야 한다.
I/O 연산은 느린 연산이기 때문에, 한 프로세스가 I/O 연산을 기다리는 동안
CPU는 다른 프로세스로 작업 전환을 해야 하는데
이 전환 비용도 비싼 편인데 메모리에 데이터 수정 작업 까지하면 CPU의 효율이 매우 떨어지게 된다.
DMA
다른 프로세스로 작업 전환 비용은 I/O연산을 기다리는 거에 비해 훨씬 CPU 효율이 좋다.
하지만, 메모리에 데이터 수정 작업은 다른 부분이 대신 할 수 있다.
그렇게 나온 장치가 DMA이며, 말 그대로 데이터에 직접 접근한다.
DMA가 추가된 모습은 아래 그림과 같다.
이제 장치들은 I/O 작업에 필요한 block이 준비되면 DMA를 통해 바로 메인 메모리에 접근한다.
작업이 끝난 후, dma는 CPU에게 I/O 작업이 끝났다는 인터럽트를 보낸다.
이렇게 CPU는 자신이 직접 메인 메모리에 접근해 작업할 시간으로 다른 프로세스의 작업을 좀 더 처리할 수 있게 돼
CPU 효율이 증가하게 된다.
'학교 > os' 카테고리의 다른 글
주소 변환 (0) | 2022.07.10 |
---|---|
문맥 교환(context switching) (0) | 2022.06.27 |
프로세스의 생성과 통신 (0) | 2022.06.26 |
프로세스 구조 (0) | 2022.06.26 |
커널(Kernel) (0) | 2022.06.25 |