Rumah > Tutorial sistem > LINUX > teks badan

terkejut! Pemasa sebenarnya mempunyai begitu banyak ciri, adakah anda tahu?

WBOY
Lepaskan: 2024-06-14 09:14:49
asal
912 orang telah melayarinya

terkejut! Pemasa sebenarnya mempunyai begitu banyak ciri, adakah anda tahu?

Semasa proses komunikasi data, anda akan menghadapi keperluan format untuk masa penghantaran data. Oleh itu, untuk memilih pemasa yang berbeza mengikut keperluan sebenar dalam aplikasi, adalah perlu untuk mempertimbangkan ciri-ciri beberapa pemasa aplikasi.

Rujukan artikel pemasa

Secara umumnya, ya,

1. tidur, usleep dan nanosleep

sleep() dan nanosleep() kedua-duanya menyebabkan proses tidur untuk tempoh masa sebelum dikejutkan, dan pelaksanaannya berbeza sama sekali.

Linux tidak menyediakan sleep() panggilan sistem dilaksanakan dalam fungsi perpustakaan Ia menetapkan masa pelaporan dengan memanggil penggera(), dan memanggil sigsuspend() untuk menangguhkan proses pada isyarat SIGALARM. hanya boleh tepat ke tahap kedua.

nanosleep() ialah panggilan sistem dalam Linuxlinux ketepatan pemasa Panggilan ini menyebabkan proses panggilan tidur dan menambah pemasa jenis pemasa pada baris gilir pemasa dalam struktur senarai masa. masa sehingga dan fungsi yang dilaksanakan selepas bangun tidur Fungsi pelaksanaan pemasa yang ditambahkan melalui nanosleep() hanya melengkapkan fungsi membangkitkan proses semasa. Sistem sentiasa mengesan baris gilir ini melalui mekanisme tertentu (contohnya, selepas terperangkap dalam teras melalui panggilan sistem dan sebelum kembali dari teras kepada mod pengguna, ia mesti menyemak sama ada potongan masa proses semasa telah habis, dan jika ya, panggil fungsi schedule() untuk menjadualkan semula , baris gilir pemasa akan dikesan dalam fungsi ini, dan pengesanan ini juga akan dilakukan sebelum gangguan perlahan kembali jika masa pemasaan telah melebihi, fungsi yang ditentukan oleh pemasa akan dilaksanakan untuk membangkitkan proses panggilan. Malah, kerana kepingan masa sistem mungkin hilang, ketepatan nanosleep() tidak begitu tinggi.

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

alarm() juga dilaksanakan oleh sistem pengendalian Red Flag Linux melalui pemasa, dan ketepatannya hanya tepat ke tahap kedua Selain itu, fungsi pelaksanaan pemasa yang ditetapkannya adalah untuk menghantar isyarat SIGALRM kepada proses semasa di masa yang ditentukan.

2 Gunakan semaphore SIGALRM+alarm()

Walaupun kaedah penggera sangat baik, ketepatan kaedah ini boleh mencapai satu saat, tetapi sukar untuk mencapai ketepatan yang lebih tinggi daripada satu saat. Mekanisme semaphore sistem *nix digunakan Mula-mula, daftarkan fungsi pemprosesan SIGALRM semaphore, panggil penggera(), dan tetapkan lebar pemasaan adalah seperti berikut:

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

//设置一个1s延时信号,再注册一个
#include 
#include 
void timer(int sig)
{
if(SIGALRM == sig)
{
printf("timern");
alarm(1); //重新继续定时1s
}

return ;
}
int main()
{
signal(SIGALRM, timer); //注册安装信号

alarm(1); //触发定时器

getchar();

return 0;
}
Salin selepas log masuk

3. Gunakan mekanisme RTC

Mekanisme RTC menggunakan mekanisme RealTimeClock yang disediakan oleh perkakasan sistem, dengan membaca perkakasan RTC /dev/rtc, dan menetapkan frekuensi RTC melalui ioctl() Kaedah ini lebih mudah Ketepatan pemasa Linux, dengan bantuan RTC yang disediakan oleh perkakasan sistem, ketepatan Boleh Laras, dan kod yang sangat tinggi adalah seperti berikut:

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

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
int main(int argc, char* argv[])
{
unsigned long i = 0;
unsigned long data = 0;
int retval = 0;
int fd = open ("/dev/rtc", O_RDONLY);

if(fd < 0)
{
perror("open");
exit(errno);
}

/*Set the freq as 4Hz*/
if(ioctl(fd, RTC_IRQP_SET, 1) < 0)
{
perror("ioctl(RTC_IRQP_SET)");
close(fd);
exit(errno);
}
/* Enable periodic interrupts */
if(ioctl(fd, RTC_PIE_ON, 0) < 0)
{
perror("ioctl(RTC_PIE_ON)");
close(fd);
exit(errno);
}

for(i = 0; i < 100; i++)
{
if(read(fd, &data, sizeof(unsigned long)) < 0)
{
perror("read");
close(fd);
exit(errno);

}
printf("timern");
}
/* Disable periodic interrupts */
ioctl(fd, RTC_PIE_OFF, 0);
close(fd);

return 0;
}
Salin selepas log masuk

Kaedah ini memerlukan sistem untuk mempunyai alat penciptaan cakera but Linux 1860 kami mempunyai dua RTC dalam LC1160 modul pengurusan kuasa digunakan, dan tiada sokongan untuk perkataan kawalan RTC_IRQP_SET dalam pemacu. Pemandu perlu ditambah kemudian.

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;
}
Salin selepas log masuk

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

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

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

Atas ialah kandungan terperinci terkejut! Pemasa sebenarnya mempunyai begitu banyak ciri, adakah anda tahu?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:itcool.net
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!