일반적으로 우리는 늘 CPU를 통해 메모리의 데이터에 접근해 왔습니다.
그러나 혹시 CPU로부터 메모리까지의 접근 거리가 서울에서 부산 과도 같다는 이야기 들어보셨나요? 그만큼 CPU가 메모리에 접근할 때 걸리는 소요 시간이 꽤 길다는 뜻입니다. 또한, CPU는 하나(우리는 singlecore를 다루므로)이므로 CPU가 하나의 일을 수행할 땐 다른 일들을 못하죠. 따라서 메모리에 접근하는 동안 cpu는 당연하게도 다른 일을 할 수 없게 됩니다.
이러한 문제점을 해결해 주는 하드웨어가 있습니다. 그것이 바로 오늘 다루어 볼 DMA 인데요, direct memory access라는 뜻입니다. cpu 개입 없이도 메모리의 데이터를 가져올 수 있는 장치입니다. 우리의 cpu는 항상 바쁩니다. 그렇지 않아도 항상 무언가를 수행중인 cpu인데 하물며 거리도 먼 메모리까지 접근하려면 얼마나 스케줄을 비우기 어려울까요. 그런데 DMA가 메모리 접근에 CPU의 개입이 전혀 없어도 괜찮게 해 주는 겁니다. CPU의 부담도 줄고, 시스템 자체의 효율이나 성능도 높아지겠네요.
DMA란?
: DMA란 CPU의 개입 없이 I/O장치와 메모리 간 직접 데이터 전송을 가능하게 하는 기술
저희 운영체제 교수님의 말씀에 따르면, CPU를 교수로, DMA를 조교라고 생각하면 된다고 하셨습니다. 조교가 일반적으로 대신 업무를 수행하지만, 조교 선에서 해결이 어려우면 그제서야 교수가 나서게 되죠.
뿐만 아니라, CPU가 DMA 컨트롤러에게 (해당 작업에 대한 정보들을 주면서) I/O 작업을 요청하면 , DMA 컨트롤러가 직접 I/O 장치 관리를 시작합니다.
* DMA의 인터럽트 처리 기능
- I/O장치에서 인터럽트가 발생하면 DMA 컨트롤러가 이를 감지할 수 있습니다. 그리고 DMA 컨트롤러가 CPU 대신 인터럽트를 처리할 수 있습니다.
- DMA는 메모리와 I/O 장치 간의 데이터 전송 뿐만 아니라, 이러한 전송을 관리하는 일도 진행하는 것입니다.
Reduce frequent interrupts from external hardware
- DMA는 인터럽트의 단위를 바이트가 아닌 block으로 받기 때문에, 빈번한 인터럽트 발생을 막을 수 있습니다. 인터럽트 발생을 막는 것이 어떤 장점이 있냐고요? 인터럽트를 걸면, cpu는 하던 일을 멈추고, 하던 일을 저장해두고, 인터럽트를 처리하고, 다시 하던 일을 복구해서 재진행해야 했죠. 이 일련의 과정들이 따지고 보면 꽤 많은 시간을 할애하는 부분인데, DMA를 사용하면 빈번한 인터럽트를 크게 줄일 수 있게 됩니다. 이를테면, 키보드에서 HELLO를 친다고 가정했을 때, 기존에는 매 알파벳마다 인터럽트를 걸어야 했다면 DMA의 경우 마지막 알파벳까지 다 오기를 기다린 후 한 번에 CPU에게 인터럽트를 건다고 합니다.
DMA도 CPU 입장에서는 external device이므로, DMA가 보내는 신호도 따지고 보면 interrupt일 겁니다. 그러니까 DMA 컨트롤러는 일이 끝났을 때 CPU에게 인터럽트를 발생시킨다고 말할 수 있습니다.
* I/O device
1. programmed I/O
: I/O가 데이터를 받을/보낼 준비가 되었는지 CPU가 주기적으로 계속 확인해야 합니다.
2. interrupt initiated I/O
: I/O 장치가 준비되면 신호(interrupt)를 보냅니다. CPU는 해당 신호만 확인하면 되죠.
1,2번에서 더 진화한 형태 = DMA
: CPU는 I/O 상태를 전혀 몰라도 괜찮습니다. DMA가 알아서 모든 I/O 작업을 처리합니다. CPU는 그 시간에 다른 일이나 하고, 이 일은 DMA인 나한테 맡기라는 의미로 보면 됩니다.
I/O 장치가 DMA에게 특정 작업을 request하면, DMA는 CPU에게 버스 사용 가능 유무를 묻습니다. CPU가 버스를 사용하지 않을 때 DMA가 버스를 쓸 수 있기 때문입니다. CPU가 버스를 사용하고 있지 않아 CPU로부터 버스 사용 승인(ack)을 받으면, 그 때 DMA도 I/O 장치의 request를 승인(ack)해주게 됩니다.
* DMA 단점
- DMA 전송 중 CPU의 캐시와 메모리 간 데이터 불일치가 발생할 수 있습니다.
* Operation mode ( 버스에 대한 권한이 기준 )
1. Burst : CPU 너 사용중이라도 모르겠고 좀 가져갈게
2. Cycle steal : CPU 한 사이클 -> DMA 한 사이클 -> ... ( 번갈아가며 사용 )
3. Transparent : CPU 너가 안 쓸 때만 쓸게
'운영체제' 카테고리의 다른 글
[운영체제] 인터럽트(Interrupt) 란 무엇일까? (34) | 2024.04.17 |
---|---|
[운영체제] 프로세스 뜻, 프로세스 상태 (11) | 2024.04.17 |