3

DMA를 사용하여 네트워크 I/O를 가속화합니다 (인터넷을 통한 집중 디스크 읽기 및 출력). 각 스레드가 DMA 전송을 발행하는 다중 스레드 응용 프로그램이 있는지 궁금합니다. 디스크 I/O 및 DMA 전송이 OS에 의해 어떻게 예약됩니까?다중 스레드 응용 프로그램에서 DMA (Direct Memory Access) 예약

필자가 이해하는 한, 커널은 사용자 프로그램없이 디스크에서 필요한 부분의 데이터를 RAM에로드하고 DMA 전송을 실행합니다. 따라서 디스크 스케줄러는 많은 도움을주지 못합니다 (단일 커널 프로세스 만 항상 디스크에 액세스합니다). 또한 메모리에로드 된 데이터가있을 때 DMA 전송을 예약 할 수있는 커널 내부 기능이 있기를 바랍니다.

+0

DMA 전송은 응용 프로그램이 아닌 하드웨어로 이루어집니다. DMA에 대한 주된 아이디어는 전송과 함께 프로세서 시간을 낭비하지 않기 때문에 디스크 나 네트워크 카드와 같은 장치는 CPU 시간을 소비하지 않고 직접 메모리에서 쓰기/읽기가 가능합니다. 커널 자체는 DMA 전송에 대한 책임이 없으며 요청이 완료 될 때까지 전송이 완료되고 다른 작업을 수행하도록 요청합니다. 다음을보십시오. http://en.wikipedia.org/wiki/Direct_memory_access –

+0

@peter 감사합니다. 질문을 명확하게하기 위해 아래에 의견을 게시했습니다. – Antonio

답변

3

네트워크 드라이버는 이미 전송 속도를 높이기 위해 DMA를 사용하고있을 것입니다. write을 실행하면 커널은 연속적인 실제 메모리 블록을 할당하고 사용자 공간 버퍼의 데이터를이 메모리에 복사합니다. 이 단계에서 커널은 필요한 모든 이더넷 및 TCP/IP 헤더를 첨부합니다.

커널은 네트워크 카드로 DMA 요청을 보내 물리적 메모리 위치에서 데이터를 가져 와서 내부 버퍼에로드하도록 요청합니다. 이 시점에서 write 시스템 호출이 반환됩니다. 네트워크 카드가 완료되면 (그리고 데이터가 어댑터 밖으로 나올 때) 네트워크 카드는 커널에 완료를 알립니다.

Linux 네트워크 드라이버는 일반적으로 단일 스레드입니다 (일부 예외가 있지만 복잡해지기 때문에) write 데이터를 사용하려고 시도하고 드라이버가 이미 활성화되어 있으면 여전히 커널 공간으로 복사되지만 DMA 요청은 네트워크 드라이버가 다시 사용 가능해질 때까지 수행되지 않습니다 (커널에 다음 DMA가 완료되었음을 알릴 때 트리거됩니다).

이야기의 사기는 이미 효과가 있고 빠른 것이고, DMA를 사용하여 가속화하고 적용하기 위해 할 일이 없다는 것입니다. 이미 처리되었습니다. 속도를 높일 수있는 유일한 부분은 커널 공간 버퍼에있는 복사본이지만 실제 네트워크 전송보다 훨씬 빠르고 (동시에 수행 할 수 있기 때문에) 처리량에 영향을 미치지 않으며 대기 시간 만 변경하지 않습니다.

N.B. 위의 내용은 특정 부분에 대한 자세한 내용을 원하면 질문을 편집하고 가능한 한 최선을 다할 것입니다.

+0

답장을 보내 주셔서 감사합니다. 나는 Stackoverflow가 나에게 대응 전자 메일을 보내지 않았기 때문에이 시간까지 그것을 nocited하지 않았다. 내 질문을 명확히하기 위해 : 동일한 프로세스 (응용 프로그램) 또는 두 개의 서로 다른 프로세스의 두 스레드가 DMA를 요청하는 경우 병행이되거나 서로 간섭을 일으 킵니다. 내 질문은 http://www.ibm.com/developerworks/library/j-zerocopy/에서 발생하며 프로그래머가 DMA를 관리해야하며 기본적으로 완료되지 않습니다. – Antonio

+0

단일 디스크 또는 단일 네트워크 어댑터는 한 번에 한 가지만 수행 할 수 있으므로 순차적으로 발생합니다. 하지만 두 개의 요청을 동시에 (두 개의 write() 호출을 동시에 발행하여 반환하도록) 제출할 수 있으며 커널은 디스크 당 최대 하나의 코어와 네트워크 카드 당 하나의 코어를 사용하여 백그라운드에서 스케줄을 지정합니다. – jleahy

+0

감사합니다. 웹에 대한 설명이 있습니까? 아니면 자신의 경험입니까? – Antonio