2009-11-19 4 views
0

나는 임베디드 리눅스 용 애플리케이션을 작성 중이며, 프로세서 시간의 5 %는 파일을 읽는 중이고 95 %는 처리 중이다. 한 스레드에서 파일을 읽고 다른 스레드에서 계속 처리하면 성능이 향상 될 수 있습니까?이 경우 별도의 스레드에서 파일을 읽어야합니까?

DMA 지원이있는 mmc 카드에서 읽는 중입니다. 파일 크기는 20MB이며 2KB의 덩어리로 나뉩니다. 독자 스레드에서 청크를 대기열에두고 프로세서 스레드에서 처리합니다. 따라서 스레드 동기화는 대기열에서만 삽입 및 삭제할 때 필요합니다.

ARM9 용으로 프로그래밍 중입니다.

빠른 단일 스레드/다중 스레드이어야합니다.

+0

왜 2KB입니까? 그것은 MMC 또는 메모리 아키텍처의 자연적인 크기입니까? 크기를 조정하면 성능을 향상시킬 수 있습니다. –

+0

좋아, 팀, 내가 그것을 시도합니다. – SunnyShah

+0

리눅스의 C 및 C++ 라이브러리는 일반적으로 버퍼링 된 I/O를 수행 할 때 8KiB 시스템 호출을 사용한다고 생각합니다. Linux 블록 장치는 순차적 읽기를 수행 할 때 128KiB 미리 읽기로 기본 설정됩니다. –

답변

2

다른 스레드를 사용하지 않는 것이 좋습니다. 대신 posix_fadvise()를 사용하여 Linux에 파일을 더 많이 읽도록 지시하십시오. 프로그램이 데이터를 처리하는 동안 커널이 DMA를 통해 파일을 읽을 수 있습니다.

여기에는 커널에 데이터 버퍼링을위한 충분한 여유 메모리가 있다고 가정합니다. 데이터 처리가 모든 메모리를 사용한다면 커널은 posix_fadvise()를 무시할 것입니다. 이처럼 보일 것이다 필요

정확한 호출 :

while(1) { 
    ret = read(fd, buffer, 2*1024); 
    if(ret < 0) abort(); 
    if(ret == 0) break; 
    if(ret != 2*1024) abort(); 
    pos += ret; 
    ret = posix_fadvise(fd, pos, 8*1024, POSIX_FADV_WILLNEED); 
    if(ret) abort(); 
    process(buffer); 
} 
+0

Cooool, 아무 것도 없습니다. 정말 고마워. – SunnyShah

1

확실히 알 수있는 유일한 방법은 시도하는 것입니다. 그러나 프로세서가 필요로하는 것처럼 파일의 덩어리를 읽으려면 프로세서가 필요한 것처럼 들립니다. 당신이 프로세서에 묶여 있기 때문에, 당신이 기대할 수있는 가장 개선 된 부분은 읽는데 걸리는 5 %의 시간입니다.

두 개의 스레드는 처리를 위해 즉시 사용할 수 있도록 파일의 다음 덩어리를 보유하기 위해 메모리 내 버퍼가 필요하며 많은 임베디드 시스템은 사용 가능한 메모리가 극히 제한적입니다.

+0

나는 동의한다, 그러나 이론적으로 무엇이 더 빨라야 하는가? – SunnyShah

1

지금은 읽기를 호출 할 때 프로그램이 데이터를 읽는 동안 블록됩니다. 그런 다음 작업이 완료되면 다시 시작되며 처리 코드가 인계된다고 가정합니다. 차단 된 시간은 프로세스가이 기간 동안 절전 상태이기 때문에 "시간"을 통해 "CPU 시간"으로 표시되지 않습니다. (이것은 사용 가능한 DMA에 달려있다).

해당 파일을 읽는 데 걸리는 시간의 전체 프로그램에 걸쳐 벽시계가 표시되지만 CPU 시간이 줄어들지는 않습니다 (동기화로 인해 올라갈 것입니다).

+1

또한 동기화 오버 헤드를 줄이고 캐시 성능을 높이려면 2KB보다 큰 청크를 읽는 것이 좋습니다. – Dave

1

확인하고 싶은 몇 가지 사항이 있습니다.

  1. 두 활동을 병행 할 수 있습니까? 하드웨어/아키텍처가 처리 스레드 이 다른 스레드를 차단하도록 할 경우 아무 이득도 없을 것입니다.

  2. 기대할 수있는 최대 이득은 Amdhal의 법칙에 따라 5 %입니다. 은 그만한 가치가있는 코딩의 복잡성입니까?

더 효율적인 파일 처리 방법을 살펴 보는 것이 좋습니다. 처리 스레드가 무엇을하고 있는지 자세히 살펴보십시오.

1

읽기가 진행되는 동안 데이터를 처리 할 수 ​​있다는 점에서 약간의 개선이있을 수 있지만 반드시 약간의 오버 헤드가있을 수도 있습니다. 다른 최적화 문제와 마찬가지로 측정이 핵심입니다.

실제 질문은 차이를 측정하기 위해 뭔가를 구현할 가치가 있는지 여부입니다. 5 %의 최대 게인을 얻으려면 그 대답이 '아니오'라고 생각합니다. 그러나 의 잠재력은 그 중 5 %가 귀하의 시간 대 가치가있는 것 중 일부에 대해입니다.

플랫폼이 메모리 매핑 파일을 지원합니까? 그러면 O/S에 대한 독서 과제를 남겨 둘 수 있습니다. 아마도 꽤 잘할 것입니다.

1

순차적으로 데이터를 읽는다면 커널이 파일을 미리 읽고 메모리의 내용을 캐시하기 때문에 추가 스레드는 아마도 가치가 없습니다. 파일을 메모리에 매핑하는 경우 임베디드 시스템 (MMC가 메모리 매핑 된 위치)에 쓰지 않는 한 변경 사항이 거의 없습니다. 파일은 때때로 메모리에로드되어야하며 이러한로드는 명시 적 호출이 아닌 읽기 시도에 의해 삼각 함수가됩니다.).

1

나는 ddj.com에 대한 기사에 대한

Multithreaded File Access

을 썼다. 아마도 당신의 질문의 일부에 답할 것입니다.

관련 문제