2009-10-07 2 views
2

무언가의 상태를 폴링하는 루프가 생겼을 때 CPU를 사용하려는 다른 프로세스를 방해하지 않고 폴링을 수행하는 방법을 잘 모르겠습니다. 예를 들어 다음과 같이하십시오.리눅스에서 양심적 인 방식으로 폴링

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

은 자원 낭비처럼 보입니다. 나는이 작업을 수행하는 가장 좋은 방법이 될 것입니다 생각 :

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

는 내가이 일을하는 동안에는 CPU의 100 %를 소비하는 경우에도, 그 상단이 수면으로 프로세스를 나열합니다 기대. 이 방법은 프로세스가 "멋지게"폴링하기를 바란다. 하지만 그건 무슨 일이 아니야. 내가 가지고있는 순간에

나는 꽤 그것이 받아 들일 수있는 것처럼 느껴진다. 이 일을하기위한 표준적인 관행이 있습니까?

+0

인터럽트 나 블록을 셀렉트로 설정할 수 있는지 궁금해하는 사람들에게는 그럴 가능성이 없다고 생각합니다. 닫힌 소스 하드웨어 드라이버로 작업하고 있습니다. 드라이버가 PCI 카드로 무엇을하는지 확신 할 수는 없지만 상태 정보를 얻기 위해 하드웨어에 적극적으로 문의해야합니다. – Brian

답변

3

sched_yield()를 회전하지 않으면 스케줄러의 우선 순위 탐지가 매우 잘못 처리되며 성능 측면에서 잘 상호 운용되는 경우에도 배터리 수명 및 전력 소모량 측정 항목과 같은 문제가 발생합니다. 응용 프로그램에서 대기 시간을 허용 할 수있는 경우 시간 초과 (10Hz와 같은 짧은 것조차도) 폴링은 여전히 ​​이상적이지 않은 경우 매우 좋습니다.

올바른 대답은 실제로 check_state()가 수행해야하는 작업에 따라 다릅니다. 상태를 변경하면 커널에서 볼 수있는 이벤트가되도록 차단할 수는 없습니까?

+0

좋은 대답 Andy;) –

0

libevent 또는 libev을 사용할 수 있다고 생각합니다.

두 가지 모두 이와 같은 기능을 제공합니다.

0

내 실시간 작업에서 필자는 합리적인 시간 초과 (예 : 10us)를 선택하고 조건 및 RDTSC (시간 스탬프 카운터)를 사용하여 회전합니다.

(10ms보다 긴 시간 동안) 회전하려는 경우 다른 슬리 프가 실행할 수있는 작은 잠자기 문을 넣는 것이 좋습니다.

1

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

폴링은 사용자가 보는 방법과 관계없이 항상 추악합니다. 올바른 방법으로 작업하려는 경우 더 나은 메커니즘 (예 : 알림)을 사용해야합니다. 그 의미는 check_state() API가 상태에 대해 폴링 만 할 수 있기 때문에 나쁜 API라는 것입니다. 상태가 변경 될 때 사용자에게 알리도록 설계된 함수가 필요합니다. 일반적으로 이러한 함수는 상태가 변경 될 때 일부 fd를 읽을 수 있도록하므로 fd에서 이벤트를 동 기적 또는 비동기 적으로 기다릴 수 있으며 이러한 이벤트가 발생할 때만 깨어납니다.