>시스템 튜토리얼 >리눅스 >충격! 타이머에는 실제로 많은 기능이 있습니다. 알고 계셨나요?

충격! 타이머에는 실제로 많은 기능이 있습니다. 알고 계셨나요?

WBOY
WBOY원래의
2024-06-14 09:14:49969검색

충격! 타이머에는 실제로 많은 기능이 있습니다. 알고 계셨나요?

데이터 통신 과정에서 데이터 전송 시간에 대한 형식 요구 사항을 만나게 됩니다. 따라서 애플리케이션의 실제 요구 사항에 따라 서로 다른 타이머를 선택하려면 여러 애플리케이션 타이머의 특성을 고려해야 합니다.

타이머 기사 참고

일반적으로 그렇습니다.

1. 수면, 유슬립, 나노슬립

sleep()과 nanosleep()은 모두 깨어나기 전 일정 시간 동안 프로세스를 잠자기 상태로 만들며, 구현 방식은 완전히 다릅니다.

Linux는 시스템 호출 sleep()을 제공하지 않습니다. sleep()은 알람()을 호출하여 보고 시간을 설정하고 SIGALARM 신호에 대한 프로세스를 일시 중지합니다. 두 번째 수준까지만 정확할 수 있습니다.

nanosleep()은 Linuxlinux 타이머 정확성의 시스템 호출입니다. 이 호출은 호출 프로세스를 절전 모드로 전환하고 wake-list 구조의 타이머 대기열에 타이머_목록을 추가합니다. nanosleep()을 통해 추가된 타이머의 실행 함수는 현재 프로세스를 깨우는 기능만 완료합니다. 시스템은 특정 메커니즘을 통해 정기적으로 이러한 대기열을 감지합니다(예를 들어 시스템 호출을 통해 코어에 갇힌 후 코어에서 사용자 모드로 돌아오기 전에 현재 프로세스의 타임 슬라이스가 소진되었는지 확인해야 하며, 그렇다면 Schedule() 함수를 호출하여 일정을 변경하세요. 타이머 큐는 이 함수에서 감지되며, 이 감지는 느린 인터럽트가 반환되기 전에 수행됩니다. 타이밍 시간이 초과되면 타이머에 의해 지정된 함수가 수행됩니다. 호출 프로세스를 깨우기 위해 실행됩니다. 실제로 시스템 타임 슬라이스가 손실될 수 있으므로 nanosleep()의 정확도는 그리 높지 않습니다.

linux高精度定时器精度_linux时钟精度_linux 定时器 精度

alarm()도 타이머를 통해 Hongqi Linux 운영 체제에 의해 구현되며 그 정확도는 두 번째 수준까지만 정확합니다. 또한 이것이 설정하는 타이머 실행 기능은 지정된 시간에 현재 프로세스에 SIGALRM 신호를 보내는 것입니다. 시간.

2. 세마포어 SIGALRM+alarm()을 사용하세요

알람 방법이 매우 우수하더라도 이러한 방법의 정확도는 1초에 도달할 수 있지만 1초 이상의 정확도를 달성하기는 어렵습니다. *nix 시스템의 세마포어 메커니즘을 사용합니다. 먼저 세마포어 SIGALRM 처리 함수를 등록하고, 알람()을 호출하고, 타이밍 폭을 설정합니다.

linux高精度定时器精度_linux 定时器 精度_linux时钟精度

으아악

3. RTC 메커니즘을 사용하세요

RTC 메커니즘은 RTC 하드웨어 /dev/rtc를 읽고 ioctl()을 통해 RTC 주파수를 설정하여 시스템 하드웨어에서 제공하는 RealTimeClock 메커니즘을 사용합니다. 시스템 하드웨어에서 제공하는 RTC, 정확도 조정 가능, 특히 높은 코드는 다음과 같습니다.

linux 定时器 精度_linux时钟精度_linux高精度定时器精度 으아악

이 방법을 사용하려면 시스템에 RTC 장치 Linux 부팅 디스크 생성 도구가 필요합니다. 당사의 1860에는 전원 관리 모듈의 LC1160에 있는 RTC가 사용되며 드라이버에서는 RTC_IRQP_SET 제어 워드를 지원하지 않습니다. 드라이버는 나중에 추가해야 합니다.

4、使用select()

能精确到1us,目前精确定时的最流行方案。通过使用select(),来设置定时器;原理借助select()方式的第5个参数,第一个参数设置为0,三个文件描述符集都设置为NULL,第5个参数为时间结构体,代码如下:

#include 
#include 
#include 
#include 
/*seconds: the seconds; mseconds: the micro seconds*/
void setTimer(int seconds, int mseconds)
{
struct timeval temp;

temp.tv_sec = seconds;
temp.tv_usec = mseconds * 1000;

select(0, NULL, NULL, NULL, &temp);
printf("timern");

return ;
}
int main()
{
int i;

for(i = 0 ; i < 100; i++)
setTimer(1, 0);

return 0;
}

结果是,每隔1s复印一次,复印100次。

select定时器是阻塞的,在等待时间到来之前哪些都不做。要定时可以考虑再开一个线程来做。

最终,下层应用程序的定时器的京都是内核决定的,这几个定时器的使用方式,尽管理论上可以精确到微妙,虽然,我分别在微妙级测试的时侯,偏差还是很大的,取决于,当时的cpu和进程的调度,等等。。。。

위 내용은 충격! 타이머에는 실제로 많은 기능이 있습니다. 알고 계셨나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.