문제

당신이 무언가의 상태를 튼튼하게 폴링하는 단단한 루프가있을 때, 나는 CPU를 사용하려는 다른 프로세스를 방해하지 않고 폴링을 수행하는 방법을 잘 모르겠습니다. 예를 들어, 이것을 수행합니다.

while (state == BUSY) state = check_state();

자원 낭비처럼 보입니다. 나는 이것을하는 가장 좋은 방법은 다음과 같습니다.

while (state == BUSY) {
    sched_yield();
    state = check_state();
}

CPU 가이 작업을 수행하는 동안 CPU의 100%를 소비하더라도 Top은 과정을 수면으로 나열 할 것으로 기대합니다. 이런 식으로, 그 과정은 "멋지게"설문 조사를 할 것입니다. 그러나 그것은 일어나는 일이 아닙니다. 지금은 내가 가지고 있습니다

while (state == BUSY) {
    sleep(1);
    state = check_state();
}

완벽하게 받아 들여질 수 있지만 이보다 더 잘할 수 있다고 생각합니다. 이 작업을 수행하기위한 표준 관행이 있습니까?

도움이 되었습니까?

해결책

Sched_Yield ()에서 회전하지 말고 스케줄러의 우선 순위 감지를 매우 심하게 촉진하고 성능 관점에서 잘 운용해도 배터리 수명 및 전력 소비 지표와 같은 작업을 수행 할 수 있습니다. 애플리케이션이 대기 시간을 견딜 수 있다면, 시간 초과로 폴링하는 것이 이상적이지 않은 경우에도 매우 바람직합니다.

정답은 Check_state ()가 실제로해야 할 일에 따라 다릅니다. 상태 변경이 차단할 수있는 커널 볼 수있는 이벤트가되도록 사물을 정리할 수 없다고 확신하십니까?

다른 팁

나는 이것이 당신이 사용할 수있는 것이라고 생각하지 않습니다 투표 또는 에폴 에?

불행히도, 양심적 인 투표와 같은 것은 없습니다. 폴링은 항상 반응 시간과 자원 소비 사이의 상충 관계입니다. 폴링 기간이 짧을수록 반응 시간은 높아지지만 자원 소비는 높아집니다. 폴링 기간이 길수록 에너지를 더 많이 절약할수록 응용 프로그램이 덜 반응합니다.

폴링은 어떻게 보더라도 항상 추악합니다. 올바른 방식으로 일을하려는 경우 더 나은 메커니즘, 즉 알림을 사용해야합니다. 그 의미는 귀하의 check_state () API가 나쁘다는 것입니다. 왜냐하면 그것은 당신이 주를 위해 설문 조사를 할 수 있기 때문입니다. 상태가 변경 될 때 알리도록 설계된 기능이 필요합니다. 일반적으로, 이러한 함수는 상태가 변경 될 때 FD를 읽을 수있게하므로 FD의 이벤트를 동기식으로 또는 비동기 적으로 기다릴 수 있으며 그러한 이벤트가 발생할 때만 깨어납니다.

나는 당신이 사용할 수 있다고 생각합니다 libevent 또는 Libev.

둘 다 이와 같은 것을 취급 할 수있는 시설을 제공합니다.

실시간 작업에서 일반적으로 합리적인 시간 초과 (10US와 같은)를 선택하고 조건 및 RDTSC (타임 스탬프 카운터)를 회전시킵니다.

10ms보다 긴 시간 동안 회전하고 싶다면 다른 물건이 달릴 기회를 얻도록 작은 수면 진술을하는 것이 좋습니다.

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