1. 커널 타이머 1. 기본 개념
특정 시나리오에서는 특정 시간 이후에 특정 작업을 수행해야 하며, 이때 대기로 인해 CPU를 낭비하고 싶지 않은 경우 타이머는 매우 적합한 메커니즘입니다. 타이머는 특정 작업을 완료하기 위해 미래의 특정 시점에 기능을 실행하는 데 사용됩니다.
커널 타이머는 지정된 시점에 특정 매개변수를 사용하여 특정 함수를 호출하도록 커널에 지시합니다. 타이머는 등록자에서 비동기적으로 실행됩니다. 타이머를 등록한 작업은 다른 프로세서에서 잠자기 상태이거나 실행 중이거나 오래 전에 종료되었을 수도 있습니다.
Linux의 커널 타이머는 (소프트) 인터럽트 Linux 애플리케이션 타이머를 기반으로 구현됩니다. 즉, 프로세스 컨텍스트가 아닌 인터럽트 컨텍스트에 있습니다. 비프로세스 맥락에서 따라야 할 몇 가지 원칙이 있습니다.
사용자 공간 접근이 허용되지 않습니다
현재는 의미가 없으므로 사용할 수 없습니다
자거나 일정을 잡을 수 없습니다. 일정이나 일종의 wait_event를 호출할 수 없으며 절전을 유발할 수 있는 함수도 호출할 수 없습니다. 세마포어는 최대 절전 모드를 유발할 수 있으므로 세마포어도 사용할 수 없습니다.
커널 코드는 in_interrupt() 함수를 호출하여 현재 인터럽트 컨텍스트에 있는지 확인할 수 있습니다. 0이 아닌 값을 반환하는 한 이는 인터럽트 컨텍스트에 있다는 의미입니다. 커널은 in_atomic()을 호출하여 현재 스케줄링이 허용되는지 여부를 확인할 수 있습니다. 스케줄링이 허용되지 않는 상황에는 인터럽트 컨텍스트에 있는 상황과 캐리어 잠금을 소유한 컨텍스트가 포함됩니다.
타이머는 비동기적으로 실행되기 때문에 타이머 처리 기능은 상호 배제 보호에 주의해야 합니다.
2.리눅스 커널에서 지원되는 타이머
Linux 커널은 두 가지 유형의 타이머를 지원합니다.
클래식 타이머: 컴퓨터 시계 인터럽트의 빈도에 따라 정확도가 달라지는 타이머입니다. 타이머 정확도는 일반적으로 1000/HZms의 정확도로 상대적으로 낮습니다. 이 타이머는 고정된 주파수, 즉 1000/HZms마다 생성됩니다. 동적 시계 기능이 활성화되지 않으면 타이머가 만료될 때 실제 타이밍 방해가 발생하지 않을 수 있습니다. 예를 들어 11ms, 52ms 및 78ms 만료 타이머만 시스템에 추가되며 타이머는 일반적으로 정확하게 만료됩니다. 타이머는 4ms(4, 8, 12...)의 배수로 만료되므로 타이머가 만료되는 시점에 반드시 타이밍 장애가 발생하지 않을 수도 있습니다.
높은 프레임 속도 타이머: 클래식 타이머의 정밀도는 상대적으로 낮습니다. 어떤 경우에는 중국 Linux 운영 체제의 멀티미디어 애플리케이션과 같이 더 높은 정밀도의 타이머가 필요하므로 이러한 유형의 타이머가 시스템에 도입됩니다. 이 타이머는 본질적으로 언제든지 발생할 수 있습니다.
여기에는 두 가지 예외 개념도 필요합니다.
동적 시계: 주기 시계 linux 애플리케이션 타이머는 작업을 실제로 실행해야 할 때만 활성화되며, 그렇지 않으면 주기 시계 기술이 비활성화됩니다. 접근 방식은 유휴 실행을 예약해야 하는 경우 주기적 시계를 비활성화한 다음 다음 타이머가 만료되거나 인터럽트가 발생할 때까지 주기적 시계를 활성화하는 것입니다. 원샷 클록은 동적 클록을 구현하기 위한 전제 조건입니다. 왜냐하면 동적 클록의 주요 특징은 필요에 따라 클록을 중지하거나 다시 시작할 수 있다는 것이고 순수 주기 클록은 이러한 시나리오에 적합하지 않기 때문입니다.
주기시계: 시계의 시간을 주기적으로 형성하는 시계입니다.
적용 측면에서 타이머의 주요 용도는 두 가지입니다.
타임아웃: 일정 시간이 지난 후 발생할 방해를 나타냅니다. 실제로 타임아웃을 사용할 경우 대부분의 경우 타임아웃이 발생할 것으로 예상되지 않으며, 타임아웃 전에 타이머가 취소되는 경우가 많습니다. 또한, 타임아웃 사건은 취소되지 않더라도 정확한 사건이 아닌 경우가 많다. 예를 들어, 네트워크에서 사용되는 다양한 타임아웃 타이머는 이 시점 이전에… ...을 고려하면, 이 시간의 값은 경험적 값이거나 계산된 값인 경우가 많으며 정확한 시간 요구 사항은 아닙니다. 이러한 상황에서는 클래식 타이머로 충분합니다.
타이머: 타이밍을 구현하는 데 사용됩니다. 예를 들어 사운드를 재생할 때 정기적으로 데이터를 사운드 카드로 전송해야 합니다. 이러한 상황에서는 특정 시점에 데이터가 사운드 카드로 전송되지 않는 경우 엄격한 요구 사항이 적용됩니다. 시간이 지나면 소리 왜곡이 발생합니다. 이때 고정밀 타이머를 사용해야 합니다.
Linux는 구성을 통해 다음 모드에서 작동하라는 메시지를 받을 수 있습니다.
높은 프레임 속도 동적 시계
높은 프레임 속도 주기 시계
낮은 비트 전송률 동적 시계
낮은 코드율 기간 시계
3. 낮은 비트레이트 커널 타이머
낮은 비트 전송률 타이머는 가장 일반적인 커널 타이머입니다. 커널은 프로세서의 클럭 인터럽트 또는 기타 적절한 주기적 클럭 소스를 타이머의 시간 기준으로 사용합니다. 클록 인터럽트는 초당 HZ회 주기적으로 발생합니다. 이 인터럽트에 해당하는 타이머 처리 함수는 일반적으로 time_interrupt입니다. 이 함수를 처리하는 과정에서 결국 do_timer 및 update_process_timers로 조정됩니다. 그중 do_timer는 시스템 전체 및 전역 작업을 담당합니다. jiffies 업데이트 및 프로세스 통계 처리. 후자의 기능은 프로세스 통계를 수행하여 TIMER_SOFTIRQ를 형성하여 스케줄러에 시간 인식을 제공합니다.
타이머가 만료되면 타이머 처리 함수가 호출되기 전에 타이머가 활성화 배열에서 제거되므로, 이 실행 후 일정 시간이 지난 후 다시 실행하려면 타이머를 다시 추가해야 합니다. 장치. SMP 시스템에서는 타이머 기능이 등록된 CPU에 의해 실행됩니다.
커널 타이머 구현은 다음 요구 사항과 가정을 충족해야 합니다.
타이머 관리는 최대한 단순해야 합니다.
활동 타이머를 크게 줄일 때 디자인의 확장성이 좋아야 합니다
대부분의 타이머는 몇 초 또는 최대 몇 분 내에 만료되며, 오랫동안 지연되는 타이머는 매우 드뭅니다.
타이머는 등록된 CPU와 동일한 CPU에서 실행되어야 합니다.
낮은 비트 전송률 커널 타이머의 구현은 매우 영리합니다. 이는 CPU별 데이터 구조를 기반으로 합니다. timer_list의 기본 배열에는 이 구조를 가리키는 포인터가 포함되어 있습니다. base가 NULL이면 이 타이머는 실행을 위해 호출되지 않은 것입니다. 그렇지 않으면 이 포인터는 어떤 데이터 구조(즉, 어떤 CPU)가 실행되고 있는지 알려줍니다.
커널 코드가 타이머를 등록할 때마다(add_timer 또는 mod_timer를 통해) 작업은 궁극적으로 내부_add_timer(kernel/timer.c에 있음)에 의해 수행됩니다. 이 작업은 타이머의 현재 CPU와 연결된 "계단식 테이블"에 새 타이머를 추가합니다. 단방향 배열.
계단식 테이블 작동 방식:
타이머가 다음 0~255지피 내에 만료되면 만료를 사용하여 단기 타이머용으로 특별히 제공된 256개 배열 중 하나에 추가됩니다(즉, 추가되는 배열은 만료 시간 비트에 따라 결정됩니다). 결정된 하위 8비트) 어떤 배열을 추가할지 결정합니다.
향후 만료되는 경우(16384지피 이전) 64개의 어레이 중 하나에 추가됩니다. 이 64개의 어레이는 만료의 8~13비트와 관련됩니다. 비트는 사용되는 어레이를 결정합니다. .
유사한 기술이 만료 비트 14-19, 20-25 및 26-31에 적용됩니다.
나중에 타이머가 만료되는 경우
위 내용은 Linux 커널 타이머 자세히 살펴보기: 인터럽트 기반 비동기 메커니즘 및 비프로세스 컨텍스트 원칙의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!