타이밍 관련 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) 메인 스레드를 실행 가능하게 유지하여 항상 다음 요청을 처리할 수 있습니까?

관련 정보