컨텍스트 전환에서 타이밍 종속 C 프로세스를 유지하는 방법

컨텍스트 전환에서 타이밍 종속 C 프로세스를 유지하는 방법

시간에 따른 간격으로 하드웨어 폴링을 담당하는 프로세스가 있습니다. 우리는 이 프로세스에 CPU 코어를 할당하고 싶습니다. 예를 들어 우리는 이 프로세스가 항상 실행 가능한 상태로 유지되기를 원합니다.

이 문제를 해결하기 위한 첫 번째 시도는 다음과 같습니다.

# Set process to highest priority
nice -n -20 cmd

# Set thread affinity in C for our hardware sampling thread
pthread_setaffinity_np(...)

위의 두 단계 모두 예상대로 작동합니다. 스레드는 core3우리가 설정한 위치 에 그대로 유지되며 맨 위에 nice있습니다 .-20

ftrace다음 과 같이 다시 실행될 때이 토론에 따르면그리고이 문제, 우리는 일반적으로 다음을 볼 수 있습니다:

> cat trace | grep " 3)" | grep " => "
 3)  rhd_loc-2735  =>    <idle>-0   
 3)    <idle>-0    =>  rhd_loc-2735 
 3)  rhd_loc-2735  =>    <idle>-0   
 3)    <idle>-0    =>  rhd_loc-2735 
 3)  rhd_loc-2735  =>    <idle>-0   
 3)    <idle>-0    =>  rhd_loc-2735 

rhd_loc-2735우리의 과정입니다.

위에 표시된 것 외에도 kworker-2703스위치가 들어오고 때로는 우선 순위가 낮은 다른 프로세스가 코어로 교체되는 경우가 많이 있습니다.

우리는 컨텍스트 전환의 이유가 우리 프로세스가 를 SPI기다리는 직렬 주변기기 인터페이스(Serial Peripheral Interface) 와 통신 IRQs하고 SPICPU 코어보다 훨씬 느린 클럭 속도로 실행되기 때문이라고 믿습니다. 따라서 우리 프로세스는 SPI/IRQ를 기다리는 데 많은 시간을 소비합니다. 즉, 상태가 아닙니다 Runnable. 우선순위나 선호도에 관계없이 커널은 다른 프로세스를 코어에 자유롭게 할당할 수 있습니다.

SPI이로 인해 CPU 코어가 항상 다음 값을 처리 한 후 새 샘플링 요청을 제출할 준비가 되어 있지 않기 때문에 하드웨어 샘플링 속도가 가능한 것보다 더 다양하고 낮아집니다 .

질문:

1) 프로세스가 인터럽트 요청에 즉시 응답할 수 있도록 다른 모든 프로세스를 코어 외부에 강제로 두거나 2) 다음 요청을 처리하는 데 항상 사용할 수 있도록 메인 스레드를 Runnable로 유지할 수 있습니까?

관련 정보