首页 > 其他分享 >第五章学习笔记

第五章学习笔记

时间:2023-11-05 13:56:50浏览次数:35  
标签:定时器 timer 学习 flag 第五章 笔记 sa spec 时钟

第五章定时器及时钟服务

定时器(Timer):

  • 1.定时器是计算机系统中的硬件或软件组件,用于测量和管理时间间隔。
  • 2.定时器可用于执行定时任务、调度事件和测量程序的性能。
  • 3.定时器可以是硬件定时器,如CPU时钟,或是软件定时器,由操作系统或应用程序创建和管理。
  • 4.常见的定时器单位包括毫秒(ms)、微秒(µs)、纳秒(ns)等,可以根据需要选择不同的时间精度。

时钟服务(Clock Services):

  • 1.时钟服务是操作系统提供的一种功能,用于跟踪和管理系统时间。
  • 2.时钟服务包括系统时钟、实时时钟(RTC)、系统计时器等组件。
  • 3.系统时钟通常由操作系统维护,用于记录系统的运行时间和事件时间戳。
  • 4.实时时钟是硬件时钟,通常用于维护日期和时间,并在计算机启动时提供初始时间。
  • 5.系统计时器是一个用于调度和管理进程的计时器,可用于执行时间片轮转等调度算法。

定时任务和事件:

  • 1.定时器可用于执行定时任务,例如定期执行备份、数据清理或定时通知。
  • 2.定时器也用于调度事件,例如处理用户界面事件、网络数据包传输等。
  • 3.事件驱动编程常常依赖于定时器和时钟服务来触发和处理事件。

定时器的应用领域:

  • 1.定时器和时钟服务在各种领域中都有应用,包括操作系统、嵌入式系统、网络通信、游戏开发、科学计算等。
  • 2.在实时系统中,精确的定时器和时钟服务至关重要,用于确保任务按时执行。

时钟漂移和同步:

  • 1.时钟漂移是指时钟不精确地跟踪时间的情况,可能会导致时间误差。
  • 2.时钟同步是一种技术,用于将多个系统的时钟同步以减小时钟漂移,常见的同步协议包括NTP(网络时间协议)。

定时器实例

#include <iostream>
#include <thread>
#include <chrono>

void scheduled_task() {
    std::cout << "定时任务执行:当前时间为" << std::chrono::system_clock::to_time_t(std::chrono::system_clock::now()) << std::endl;
}

int main() {
    while (true) {
        scheduled_task();
        std::this_thread::sleep_for(std::chrono::seconds(5));
    }

    return 0;
}
  • 使用 C++ 的 头文件创建了一个定时器,每5秒执行一次定时任务。

间隔定时器

import time

def interval_task():
    print("间隔定时任务执行:当前时间为", time.strftime("%Y-%m-%d %H:%M:%S"))

# 定时器间隔(秒)
interval = 10

while True:
    interval_task()
    time.sleep(interval)

苏格拉底挑战




问题及解决方式

问题1: 定时任务未按预期执行,或者出现时间不准确的情况。

解决方案:

  • 检查定时器的时间设置:确保你正确设置了定时器的时间间隔。
  • 考虑系统负载:如果系统负载高,可能会导致定时任务的执行延迟。考虑优化系统资源或提高时间精度。
  • 使用硬件定时器:对于需要高精度的应用,考虑使用硬件定时器而不是软件定时器。

问题2: 定时器不稳定或时间漂移明显。

解决方案:

考虑时钟同步:时钟同步协议如NTP可用于同步系统时钟,减小时钟漂移。
调整硬件时钟:如果是硬件时钟不稳定,可以考虑更换硬件或进行校准。

问题3: 跨平台问题,不同操作系统和硬件上的定时器行为不一致。

解决方案:

  • 使用跨平台库:如果需要在不同平台上运行,可以使用跨平台的库或框架,例如Boost.Timer、Qt Timer等。
  • 考虑平台差异:了解不同平台的定时器行为和限制,确保你的应用程序可以适应这些差异。

问题4: 定时器相关的代码复杂或容易出错。

解决方案:

  • 模块化设计:将定时器相关的代码模块化,以降低复杂度,并提高可维护性。
    = 错误处理:添加适当的错误处理,以应对潜在的问题,如定时器创建失败、回调函数错误等。
    = 单元测试:进行单元测试,确保定时器的行为和功能按预期工作。

问题5: 在多线程环境中使用定时器可能引发竞争条件或同步问题。

解决方案:

  • 使用线程安全的定时器:选择支持多线程操作的定时器或添加适当的锁来确保线程安全。
  • 考虑并发性:了解多线程编程的最佳实践,确保在多线程环境中使用定时器时不会引发竞争条件或死锁。

实践过程

#include <stdio.h>
#include <signal.h>
#include <time.h>
#include <stdlib.h>

volatile sig_atomic_t flag = 0;

void timer_handler(int signo) {
    flag = 1;
}

int main() {
    struct sigaction sa;
    struct itimerspec timer_spec;
    timer_t timer;

    // 设置信号处理函数
    sa.sa_flags = SA_RESTART;
    sa.sa_handler = timer_handler;
    sigaction(SIGALRM, &sa, NULL);

    // 创建定时器
    timer_spec.it_value.tv_sec = 1; // 初次触发延迟1秒
    timer_spec.it_value.tv_nsec = 0;
    timer_spec.it_interval.tv_sec = 1; // 之后每隔1秒触发
    timer_spec.it_interval.tv_nsec = 0;
    timer_create(CLOCK_REALTIME, NULL, &timer);
    timer_settime(timer, 0, &timer_spec, NULL);

    while (1) {
        if (flag) {
            // 定时器触发的任务
            printf("定时任务执行:当前时间为 %ld\n", time(NULL));
            flag = 0;
        }
        // 其他主程序逻辑可以继续执行
    }

    // 销毁定时器(此部分代码可能永远不会执行)
    timer_delete(timer);

    return 0;
}

代码解释

  • volatile sig_atomic_t flag = 0;:这行定义了一个名为 flag 的全局变量,它被标记为 volatile,这意味着它的值可能会在未经通知的情况下被修改,通常在信号处理函数中使用。sig_atomic_t 是一种整数类型,用于在信号处理函数和主程序之间传递信息。
  • void timer_handler(int signo):这是一个自定义的信号处理函数,当定时器触发时,将被调用。它将 flag 设置为 1,以指示定时器已经触发。
  • main 函数是程序的入口点。在这里执行了以下主要步骤:
  • 1.struct sigaction sa;:定义一个名为 sa 的结构,用于设置信号处理函数。
  • 2.struct itimerspec timer_spec;:定义一个名为 timer_spec 的结构,用于设置定时器规范。
  • 3.timer_t timer;:定义一个名为 timer 的定时器对象。
  • 4.sa.sa_flags 和 sa.sa_handler 用于设置信号处理函数,它使用 sigaction 函数将 SIGALRM 信号与 timer_handler 函数关联起来。
  • 5.timer_spec 结构用于设置定时器的初始值和间隔,这里设置为初始值为1秒,之后每隔1秒触发一次。
  • 6.timer_create 函数用于创建一个定时器对象,并且 timer_settime 函数用于设置定时器的规范。
  • 7.while (1) 循环用于不断检查 flag,当 flag 变为 1 时,表示定时器已经触发,然后执行定时任务(打印当前时间),然后将 flag 重置为 0。这样循环将会一直运行。

标签:定时器,timer,学习,flag,第五章,笔记,sa,spec,时钟
From: https://www.cnblogs.com/wujiuchun/p/17810454.html

相关文章

  • Git入门笔记--版本控制系统的使用
    首先记录下使用命令行工具git与github交互的“Hello,World!”。"Hello,World!"是任何程序设计语言入门第一课,不管原理,先跑起来再说。git的"Hello,World!"就是如何从github获取仓库到本地,并将修改上传github。1.将远程仓库clone到本地:$gitclone<仓库地址>这条git命令行......
  • 学习笔记8
    20211301学习笔记8教材知识点总结5.1硬件定时器定时器:时钟源和可编程计数器组成的硬件设备时钟源:晶体振荡器,产生周期性电信号定时器中断:计数减到05.2个人计算机定时器实时时钟:RTC,小型备用电池供电,PC关机也能持续运行,提供时间和日期可编程间隔定时器:PIT,与CPU......
  • python——基础学习篇(7)
    【集合】可变:   set()  update(others)不可变: frozenset()  ( 交集,差集,对称差集)+update(others)删:remove()——如果指定元素不存在,会抛出异常discard()——静默处理pop()——随机从集合中弹出一个元素clear()清空【可哈希】正确创建集合和字典,要求字典的键和集合的元......
  • 软考学习
    计算机组成与体系结构(6分)数据的表示****进制进制转换1二进制转十进制从右往左  0b111=1*20+1*21 +1*22 =1+2+4八进制转十进制从右往左  0111=1*80 +1*81+1*82=1+8+64十六进制转十进制从右往左  0x111=1*160 +1*161+1*162=......
  • 学习笔记8
    目录知识点归纳第5章并行计算硬件定时器个人计算机定时器CPU操作中断处理时钟服务函数time系统调用times系统调用time和date命令间隔定时器苏格拉底挑战可能遇到的问题与解决方案实践过程知识点归纳第5章并行计算硬件定时器定时器是由时钟源和可编程计数器组成的硬件设备......
  • JUC并发编程学习(十一)四大函数式接口(必备)
    四大函数式接口(必备)程序员:泛型、反射、注解、枚举新时代程序员:lambda表达式、链式编程、函数式接口、Stream流式计算函数式接口:只有一个方法的接口@FunctionalInterfacepublicinterfaceRunnable{publicabstractvoidrun();}//@FunctionalInterface函数式接口,超......
  • 2023-2024-1 20231302《计算机基础与程序设计》第六周学习总结
    这个作业属于哪个课程2023-2024-1-计算机基础与程序设计这个作业要求在哪里2023-2024-1计算机基础与程序设计第六周作业这个作业的目标Polya如何解决问题、简单类型与组合类型、复合数据结构、查找与排序算法、算法复杂度、递归、代码安全教材学习内容总结《计算......
  • 串串题笔记
    串串题笔记P6216回文匹配又一个harbinbeer先对原串做\(kmp\),记录数组\(S\),当从\(i\)开始可以匹配时\(S_i=1\),否则\(S_i=0\),对\(S_i\)做前缀和manacher求回文,设当前回文的区间在原来的串上是\([L,R]\)则这个区间对答案的贡献就是\((S_r-S_{mid})-(S_{mid......
  • 【笔者感悟】笔者的学习感悟【十一】
    写在前面  今天笔者想和大家来讨论一下做个人项目的问题。想必不用笔者强调了,作为码农,做个人项目是增添履历很重要的一环。笔者也不例外,但是既然做个人项目,就要做值钱的项目,像图书管理系统啥的,在网上都已经做烂掉了。做了也没啥意义,那么要做一个好项目出来,就目前这个互联网环境......
  • MarkDown用法学习笔记
    标题:用'#'标识,可以到从1到6级标题设置,有多少个'#'符号就对应多少级标题粗体:用''标识,如果两边只有一个''标识是斜体,如果两有2个这符号标题是加粗,如果有3个这符号标识是斜体和加粗效果。删除:用'~'标识,两边加上这符号即可将对应的文字加上删除线。引用:用'>'标识,文字前面加上......