네트워크 드라이버는 이미 전송 속도를 높이기 위해 DMA를 사용하고있을 것입니다. write
을 실행하면 커널은 연속적인 실제 메모리 블록을 할당하고 사용자 공간 버퍼의 데이터를이 메모리에 복사합니다. 이 단계에서 커널은 필요한 모든 이더넷 및 TCP/IP 헤더를 첨부합니다.
커널은 네트워크 카드로 DMA 요청을 보내 물리적 메모리 위치에서 데이터를 가져 와서 내부 버퍼에로드하도록 요청합니다. 이 시점에서 write
시스템 호출이 반환됩니다. 네트워크 카드가 완료되면 (그리고 데이터가 어댑터 밖으로 나올 때) 네트워크 카드는 커널에 완료를 알립니다.
Linux 네트워크 드라이버는 일반적으로 단일 스레드입니다 (일부 예외가 있지만 복잡해지기 때문에) write
데이터를 사용하려고 시도하고 드라이버가 이미 활성화되어 있으면 여전히 커널 공간으로 복사되지만 DMA 요청은 네트워크 드라이버가 다시 사용 가능해질 때까지 수행되지 않습니다 (커널에 다음 DMA가 완료되었음을 알릴 때 트리거됩니다).
이야기의 사기는 이미 효과가 있고 빠른 것이고, DMA를 사용하여 가속화하고 적용하기 위해 할 일이 없다는 것입니다. 이미 처리되었습니다. 속도를 높일 수있는 유일한 부분은 커널 공간 버퍼에있는 복사본이지만 실제 네트워크 전송보다 훨씬 빠르고 (동시에 수행 할 수 있기 때문에) 처리량에 영향을 미치지 않으며 대기 시간 만 변경하지 않습니다.
N.B. 위의 내용은 특정 부분에 대한 자세한 내용을 원하면 질문을 편집하고 가능한 한 최선을 다할 것입니다.
DMA 전송은 응용 프로그램이 아닌 하드웨어로 이루어집니다. DMA에 대한 주된 아이디어는 전송과 함께 프로세서 시간을 낭비하지 않기 때문에 디스크 나 네트워크 카드와 같은 장치는 CPU 시간을 소비하지 않고 직접 메모리에서 쓰기/읽기가 가능합니다. 커널 자체는 DMA 전송에 대한 책임이 없으며 요청이 완료 될 때까지 전송이 완료되고 다른 작업을 수행하도록 요청합니다. 다음을보십시오. http://en.wikipedia.org/wiki/Direct_memory_access –
@peter 감사합니다. 질문을 명확하게하기 위해 아래에 의견을 게시했습니다. – Antonio