三十三 用户程序中的睡眠:

2024-05-05 07:58

本文主要是介绍三十三 用户程序中的睡眠:,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

   sleep()
    usleep()
    nanosleep()

    sleep()和nanosleep()都是使进程睡眠一段时间后被唤醒,但是二者的实现完全不同。
    Linux中并没有提供系统调用sleep(),sleep()是在库函数中实现的,它是通过调用alarm()来设定报警时间,调用sigsuspend()将进程挂起在信号SIGALARM上,sleep()只能精确到秒级上。

    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

int main(void)
{
    int i;
    struct timespec slptm;
    long   tdif;
    struct timeval tend, tstart;

    slptm.tv_sec = 0;
    slptm.tv_nsec = 1000;      //1000 ns = 1 us

    //struct sched_param param;    
    //param.sched_priority = 0;
    //sched_setscheduler(getpid(), SCHED_FIFO, ¶m);

    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
时钟中断的时间间隔:                   4 ms   (1000ms/250)
----------------------------------------
nanosleep() time is 4019 us        (4.019 ms)
说明nanosleep的睡眠定时器依赖于时钟中断



HZ                                 1000HZ时钟中断的时间间隔:                   1 ms----------------------------------------
nanosleep() time is 12 us
注: 最小睡眠时间为1 us 

这篇关于三十三 用户程序中的睡眠:的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/961182

相关文章

10天计划:每天5小时睡眠

Day 1 - Day 2: 适应期 目标:适应减少睡眠时间的变化。 睡眠:00:00 - 05:00(5小时)早晨(5:00 - 7:00):轻度运动(瑜伽、拉伸、散步)、20分钟冥想。上午(7:00 - 12:00):专注高强度任务(需要逻辑思考或创作)。中午(12:00 - 13:00):午餐,午间20分钟小睡。下午(13:00 - 17:00):处理日常任务和会议,做较轻松的工作。晚上

【多线程】阻塞,忙等待,睡眠,挂起的简单理解,以及各自优缺点

阻塞(Blocking) 理解:当一个线程或进程执行阻塞操作时,它会暂停执行,直到某个条件满足(例如,I/O操作完成、资源可用等)。在此期间,该线程或进程不会占用CPU资源。 优点: 减少CPU资源浪费,因为阻塞的线程或进程不会占用CPU时间片。简化编程模型,因为不需要处理复杂的轮询逻辑。 缺点: 增加了响应时间,因为线程或进程在条件满足之前无法继续执行。可能导致线程或进程调度延迟,特别

关于STC-ISP软件选项“下次下载用户程序时擦除用户EEPROM区”的质疑

1.以前,在用STC-ISP软件下载代码时,该选项一般都默认勾选!见图1;因没用到该功能无视; 2.近日,首次下载需写入一些用户核心数据,以后谁升级代码下载都不能查看和更改这些数据! 3.于是:发现个奇怪的问题!就是第一次写入时,默认勾选没发现问题;但第二次升级代码下载时,取消了这个勾选应该是对的!但问题来了:第二次下载后原用户数据居然擦除了! 4.原来:该选项设置后,第一次下载时无效!要到

C语言基础(三十三)

1、链表排序之归并排序与线性搜索 测试代码: #include "date.h" #include <stdio.h>#include <stdlib.h>// 链表节点结构体typedef struct Node {int data;struct Node *next;} Node;// 插入节点到链表末尾Node* insertNode(Node *head, int data)

win10 21H2下开启隐藏的睡眠选项

文章目录 启动“休眠与快速启动”“待机与睡眠”选项待机状态下的网络连接允许离开模式策略无人参与系统睡眠超时允许使用唤醒定时器允许系统所需的策略在此时间后休眠 启动“休眠与快速启动” 休眠与快速启动都涉及把内存内容持久化到本地盘 powercfg.exe /hibernate on 在“电源选项”的“更改电源按钮的功能”里,通过“更改当前不可用的设置”来关闭快速启动 “待

线程睡眠sleep()方法和线程让步yield()方法的主要区别

 import java.util.*; public class SleepTest {  public static void main(String[] args) throws Exception  {   for (int i=0; i<10; i++)   {    System.out.println("当前时间:" + new Date());    //调用sleep(

《ZigBee开发笔记》第二部分 基础篇-第8章 CC2530系统睡眠唤醒—中断唤醒

1 理论分析 1.1 CC2530 睡眠定时器简介 睡眠定时器用于设置系统进入和退出低功耗睡眠模式之间的周期。睡眠定时器还用于当进入低功耗睡眠模式时,维持定时器 2 的定时。 睡眠定时器的主要功能如下:  24 位的定时器正计数器,运行在 32kHz 的时钟频率  24 位的比较器,具有中断和 DMA 触发功能  24 位捕获 1、概述 睡眠定时器是一个 24 位的定时器,运

研究称手机蓝光影响睡眠 但能给大脑提神

智能手机和其他电子设备发出的蓝光最近得到了一个坏名声,那就是影响睡眠。然而近日披露的一项研究表明,蓝光也有一些优点,那就是在正确的时间里使用,可以使大脑更加清醒。 瑞典中部大学的研究人员比较了咖啡因和蓝光对大脑的影响,发现它们都有积极的作用。有趣的是,人们暴露在蓝光下,大脑功能的测试表现得更为出色。在相同条件下,使用更多咖啡因的测试人员则表现不佳。 报道称,科学家证明蓝光对人体无害,并且可以触

睡眠质量不好该怎么调理

1、运动:睡前多做些小运动,但不要做太剧烈的运动,比如跑步、散步、打太极拳等,适当的运动有益于睡眠。   2、远离扰乱睡眠的食物:不要喝咖啡、茶和其他刺激性的重口味的东西。睡前最好喝一杯牛奶或温水,这对促进睡眠很有帮助。   3、避免过度思考:睡前两小时,最好不要看一些需要用大脑思考的电影和书籍。当要睡觉的时候,仍然需要用大脑一直思考。这会让大脑保持兴奋状态,当然,也很难入睡。不要去看恐怖

VxWorks系统启动后执行用户程序

效果界面如下: 操作步骤如下: 1、在 tornado2.2 开发环境,打开已创建的类型的工程,向工程中添加 demo.c 和 welcome.cpp 文件;如下图: 代码如下: /*demo.c*/void demo(){http://www.2beanet.comprintf("********************************\n")