내 프로그램이 중단없이 처음부터 끝까지 실행되도록하려면 어떻게해야합니까?

StackOverflow https://stackoverflow.com/questions/1215713

  •  06-07-2019
  •  | 
  •  

문제

Ubuntu 8.10에서 RDTSC (내가 시도한 다른 프로파일 링 소프트웨어는 내가 필요한 해상도에 시간을 할애 할 수 없음)를 사용하여 시간 코드를 시도하고 있습니다. 그러나 작업 스위치와 인터럽트 발사로 인해 특이 치가 계속해서 통계가 유효하지 않습니다.

내 프로그램이 밀리 초로 실행되는 것을 고려하면 내 환경에서 모든 인터럽트 (작업 스위치를 끄는)를 비활성화 할 수 있습니까? 아니면 더 많은 힘을 허용하는 OS로 가야합니까? 이 타이밍 코드를 수행하기 위해 내 OS 커널을 사용하는 것이 더 나을까요? 알고리즘의 최고/최악의 사례 성능을 증명하려고 노력하고 있으므로 타이밍에 완전히 견고해야합니다.

현재 사용중인 관련 코드는 다음과 같습니다.

inline uint64_t rdtsc()
{
    uint64_t ret;
    asm volatile("rdtsc" : "=A" (ret));
    return ret;
}

void test(int readable_out, uint32_t start, uint32_t end, uint32_t (*fn)(uint32_t, uint32_t))
{
    int i;
    for(i = 0; i <= 100; i++)
    {
        uint64_t clock1 = rdtsc();
        uint32_t ans = fn(start, end);
        uint64_t clock2 = rdtsc();

        uint64_t diff = clock2 - clock1;

        if(readable_out)
            printf("[%3d]\t\t%u [%llu]\n", i, ans, diff);
        else
            printf("%llu\n", diff);
    }
}

이 코드에서 오버플로 조건을 제대로 처리하지 않는 사람들에게 추가 포인트가 있습니다. 이 단계에서 나는 프로그램이 타임 슬라이스를 잃어 버렸기 때문에 갑자기 점프하지 않고 일관된 출력을 얻으려고 노력하고 있습니다.

내 프로그램의 좋은 가치는 -20입니다.

요약하면 OS의 중단 없이이 코드를 실행할 수 있습니까? 아니면 Ring0의 Bare Hardware에서 실행해야하므로 IRQ 및 스케줄링을 비활성화 할 수 있습니까? 미리 감사드립니다!

도움이 되었습니까?

해결책

테스트가 반복되기 직전에 Nanosleep ()에게 전화하여 1 초 정도 잠을 자면 각 테스트마다 "신선한"시간이 걸립니다. 100Hz 타이머 인터럽트로 커널을 컴파일하고 시간이 표시되는 기능이 10ms 이하에서 완료되면 타이머 인터럽트가 그런 식으로 치는 것을 피할 수 있어야합니다.

다른 인터럽트를 최소화하려면 모든 네트워크 장치를 해독하고 스왑없이 시스템을 구성하고 달리 정기적인지 확인하십시오.

다른 팁

교활한. 운영 체제를 '끄기'하고 엄격한 스케줄링을 보장 할 수 있다고 생각하지 않습니다.

나는 이것을 거꾸로 뒤집을 것입니다. 너무 빨리 실행되면 결과의 분포를 수집하기 위해 여러 번 실행하십시오. 표준 Ubuntu Linux가 좁은 의미에서 실시간 OS가 아니기 때문에 모든 대체 알고리즘은 동일한 설정으로 실행됩니다. 그런 다음 배포판을 비교할 수 있습니다 (요약 통계에서 Ququplots까지). Python, R 또는 Octave와 비교할 수 있습니다.

달리기로 도망 갈 수 있습니다 Freedos, 부터 단일 프로세스 OS입니다.

다음은 두 번째 링크의 관련 텍스트입니다.

X86 World의 DOS 시스템의 사실상 표준 인 Microsoft의 DOS 구현은 단일 사용자, 단일 태스킹 운영 시스템입니다. 하드웨어에 대한 원시 액세스를 제공하며 파일 I/O와 같은 경우 OS API의 최소 레이어 만 제공합니다. 임베디드 시스템과 관련하여 이것은 좋은 일입니다. 왜냐하면 종종 운영 체제없이 무언가를해야하기 때문입니다.

DOS는 (기본적으로) 스레드의 개념이 없으며 여러 가지 진행중인 프로세스의 개념이 없습니다. 응용 프로그램 소프트웨어는 인터럽트 인터페이스를 사용하여 시스템 호출을하고 다양한 하드웨어 인터럽트를 호출하여 비디오 및 오디오와 같은 것을 처리하고 소프트웨어 인터럽트를 호출하여 디렉토리 읽기, 파일 실행 등과 같은 다양한 것들을 처리합니다.

물론, 에뮬레이터가 아닌 실제 하드웨어에 Freedos를 실제로 부팅하는 최고의 성능을 얻을 수 있습니다.

나는 실제로하지 않았다 사용된 Freedos, 그러나 귀하의 프로그램이 표준 C 인 것처럼 보이므로 표준 컴파일러가 Freedos에 대한 모든 것을 사용할 수 있다고 가정합니다.

프로그램이 밀리 초로 실행되고 Linux에서 실행중인 경우 타이머 주파수 (Linux에서)가 1000Hz (1000Hz가 아님)로 설정되어 있는지 확인하십시오. (CD/USR/SRC/LINUX; MENUCONFIG를 만들고 "프로세서 유형 및 기능" -> "타이머 주파수"를보십시오)이면 CPU가 10ms마다 중단됩니다.

또한 Linux의 기본 CPU 타임 슬라이스는 100ms이므로 -20 수준이 좋으면 몇 밀리 초 동안 실행중인 경우에는 예정되지 않습니다.

또한 FN ()에서 101 회 반복됩니다. FN ()에게 시스템을 올바르게 보정하기위한 NO-OP로 제공하십시오.

너무 많은 시간을 인쇄하는 대신 통계 (평균 + stddev)를 만드십시오 (예약 된 시간이 소비되면 터미널이 일정 등을 얻습니다 ... 피하십시오).

RDTSC 벤치 마크 샘플 코드

당신이 사용할 수있는 chrt -f 99 ./test 최대 실시간 우선 순위로 ./test를 실행합니다. 그런 다음 적어도 다른 사용자 공간 프로세스에 의해 중단되지 않습니다.

또한 설치 Linux-Rt 패키지는 실시간 커널을 설치하므로 스레드 인터럽트를 통해 인터럽트 핸들러 우선 순위를 더 잘 제어 할 수 있습니다.

루트로 실행되면 Sched_SetScheduler ()에게 전화하여 실시간 우선 순위를 부여 할 수 있습니다. 문서를 확인하십시오.

Linux에서 선점 예약을 비활성화하는 방법이있을 수 있지만 필요하지 않을 수도 있습니다. 잠재적으로 정보를 사용할 수 있습니다 /proc/<pid>/schedstat 또는 다른 대상 /proc 당신이 선점되었을 때를 감지하고, 그 타이밍 샘플을 무시하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top