在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
用户程序中的睡眠: sleep() sleep()和nanosleep()都是使进程睡眠一段时间后被唤醒,但是二者的实现完全不同。 nanosleep()则是Linux中的系统调用,它是使用定时器来实现的,该调用使调用进程睡眠,并往定时器队列上加入一个timer_list型定时器,time_list结构里包括唤醒时间以及唤醒后执行的函数,通过nanosleep()加入的定时器的执行函数仅仅完成唤醒当前进程的功能。系统通过一定的机制定时检查这些队列(比如通过系统调用陷入核心后,从核心返回用户态前,要检查当前进程的时间片是否已经耗尽,如果是则调用schedule()函数重新调度,该函数中就会检查定时器队列,另外慢中断返回前也会做此检查),如果定时时间已超过,则执行定时器指定的函数唤醒调用进程。当然,由于系统时间片可能丢失,所以nanosleep()精度也不是很高。 alarm()也是通过定时器实现的,但是其精度只精确到秒级,另外,它设置的定时器执行函数是在指定时间向当前进程发送SIGALRM信号。 复制代码 代码如下:#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/time.h> #include <sched.h> #define COUNT 1000 #define MILLION 1000000L</p> <p>int main(void) { int i; struct timespec slptm; long tdif; struct timeval tend, tstart;</p> <p> slptm.tv_sec = 0; slptm.tv_nsec = 1000; //1000 ns = 1 us</p> <p> //struct sched_param param; //param.sched_priority = 0; //sched_setscheduler(getpid(), SCHED_FIFO, ¶m);</p> <p> if (gettimeofday(&tstart, NULL) == -1) { fprintf(stderr, "Failed to get start time\n"); return 1; } for (i = 0; i < COUNT; i++) { if (nanosleep(&slptm, NULL) == -1) { perror("Failed to nanosleep"); return 1; } } if (gettimeofday(&tend, NULL) == -1) { fprintf(stderr, "Failed to get end time\n"); return 1; } tdif = MILLION * (tend.tv_sec - tstart.tv_sec) + (tend.tv_usec - tstart.tv_usec); printf("nanosleep() time is %ld us\n", tdif/COUNT); return 0; } HZ 250HZ HZ 1000HZ |
请发表评论