시간에 따른 간격으로 하드웨어 폴링을 담당하는 프로세스가 있습니다. 우리는 이 프로세스에 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
하고 SPI
CPU 코어보다 훨씬 느린 클럭 속도로 실행되기 때문이라고 믿습니다. 따라서 우리 프로세스는 SPI/IRQ를 기다리는 데 많은 시간을 소비합니다. 즉, 상태가 아닙니다 Runnable
. 우선순위나 선호도에 관계없이 커널은 다른 프로세스를 코어에 자유롭게 할당할 수 있습니다.
SPI
이로 인해 CPU 코어가 항상 다음 값을 처리 한 후 새 샘플링 요청을 제출할 준비가 되어 있지 않기 때문에 하드웨어 샘플링 속도가 가능한 것보다 더 다양하고 낮아집니다 .
질문:
1) 프로세스가 인터럽트 요청에 즉시 응답할 수 있도록 다른 모든 프로세스를 코어 외부에 강제로 두거나 2) 다음 요청을 처리하는 데 항상 사용할 수 있도록 메인 스레드를 Runnable로 유지할 수 있습니까?