mobile menu

The Arrow Newsletter

mobile menu

리눅스 timer 예제

이전 스타일의 GCC 원자 내장 을 사용했기 때문에 스레드가 안전해야합니다. 몇 가지 추가와 함께, 그것은 너무 다중 스레드 코드에 대 한 작동 해야 합니다. (pthread_mutex_lock()는 비동기 신호가 안전하지 않으므로 예를 들어 뮤텍스를 사용할 수 없습니다. 시간 지정 상태를 원자적으로 조작하는 것은 작동하지만, 시간 지정이 발생할 때 시간 지정을 사용하지 않도록 설정하면 일부 종족이 남아 있을 수 있습니다.) 우선 우리는 기본 변수에 주어진 프로세서에 대한 tvec_base의 주소를 얻고 우리가 그것을 가지고, 우리는 init_timer_cpu 함수에서 tvec_base 필드의 일부를 초기화하기 시작했다. jiffies 및 가능한 프로세서 의 수와 CPU 당 동적 타이머의 초기화 후, 우리는 init_timer_stats 함수에서 tstats_lookup_lock 스핀 록을 초기화해야: 매크로는 너무 주어진 timer_list 구조를 초기화합니다. 이 인라인 함수는 타이머 구조를 초기화하는 데 사용됩니다. 현재는 이전 포인터와 다음 포인터(및 SMP 시스템의 실행 플래그)를 영점합니다. 프로그래머는 이 함수를 사용하여 타이머를 초기화하고 앞으로 호환되기 위해 구조의 포인터를 명시적으로 건드리지 말 것을 강력히 촉구합니다. 이것은 리눅스 커널에서 타이머 및 시간 관리 관련 물건을 설명하는 장의 네 번째 부분이며, 이전 부분에서 우리는 리눅스 커널의 진드기 방송 프레임 워크와 NO_HZ 모드에 대해 알고 있었다. 타이머 – 우리는이 부분에서 리눅스 커널의 시간 관리 관련 물건에 다이빙을 계속하고 리눅스 커널의 또 다른 개념에 익숙해질 것입니다.

우리는 리눅스 커널에서 타이머를 볼 수 있습니다 전에, 우리는이 개념에 대한 몇 가지 이론을 배워야한다. 이 부분에서는 소프트웨어 타이머를 고려합니다. 타이머는 사용하기가 훨씬 쉽습니다. 함수를 한 번 등록하면 커널은 타이머가 만료되면 한 번 호출합니다. 이러한 기능은 커널 내에서 적절한 경우가 많지만 플로피 모터의 예에서와 같이 드라이버에서도 필요할 때가 있습니다. 환경은 리눅스이며, 또한 나는 작업 C 예제와 어떤 링크를 주셔서 감사합니다 유의하시기 바랍니다. 이 함수는 del_timer처럼 작동하지만 반환할 때 타이머 함수가 CPU에서 실행되지 않도록 보장합니다. del_timer_sync는 타이머 함수가 예기치 않은 시간에 실행될 때 경합 조건을 방지하는 데 사용됩니다.

대부분의 상황에서 사용해야 합니다. del_timer_sync의 호출자는 타이머 함수가 add_timer를 사용하여 자신을 다시 추가하지 않도록 해야 합니다. 프로그램에서 시스템 호출 및 신호를 시청하려면 추적을 호출한 다음 프로그램 및 명령줄 인수를 호출하면 됩니다. 예를 들어 hostname 1 명령에 의해 호출되는 시스템 호출을 보려면 이 명령을 사용하십시오. 관련 이벤트(파일이 닫히거나 모듈이 제거됨)가 다른 프로세서에서 발생하는 동안 모듈의 타이머 함수가 한 프로세서에서 실행되는 상황을 고려합니다. 그 결과 더 이상 유효하지 않은 상황을 예상하는 타이머 함수가 발생하여 시스템 충돌이 발생할 수 있습니다. 이러한 종류의 인종을 방지하려면 모듈에서 del_timer 대신 del_timer_sync를 사용해야 합니다. 타이머 함수가 타이머 자체(공통 패턴)를 다시 시작할 수 있는 경우 del_timer_sync를 호출하기 전에 설정한 “중지 타이머” 플래그도 있어야 합니다.