zoukankan      html  css  js  c++  java
  • 《Unix/Linux系统编程》第五章学习笔记

    《Unix/Linux系统编程》第五章学习笔记

    作者:20191322wyl

    硬件定时器

    定时器是由时钟源和可编程计数器组成的硬件设备。时钟源通常是一个晶体振荡器,会产生周期性电信号,以精确的频率驱动计数器。使用一个倒计时值对计数器进行编程,每个时钟信号减1.当计数减为0时,计数器向CPU生成一个定时器中断,将计数值重新加载到计数器中,并重复倒计时。计算器周期被称为定时器刻度,是系统的基本计时单元。

    个人计算机定时器

    实时时钟(RTC)

    • 即使在个人计算机关机时,它也能继续运行
    • 时间变量是一个长整数,包含从1970年7月1日起经过的秒数。

    可编程间隔定时器(PIT)

    • PIT是与CPU分离的一个硬件定时器
    • 可对它进行编程,以提供以毫秒为单位的定时器刻度

    多核CPU中的本地定时器

    在多核CPU中,每个核都是一个独立的处理器,它有自己的本地定时器,由CPU时钟驱动。

    高分辨率定时器

    大多数电脑都有一个时间戳定时器(TSC),由系统时钟驱动。它的内容可通过64位TSC寄存器读取。

    CPU操作

    每个CPU都有一个程序计数器(PC),也称为指令指针(IP),以及一个标志或状态寄存器(SR)、一个堆栈指针(SP)和几个通用寄存器,当PC指向内存中要执行的下一条指令时,SR包括CPU的当前状态,如操作模式、中断掩码和条件码,SP指向当前堆栈栈顶。堆栈是CPU用于特殊操作(如push、pop调用和返回等)的一个内存区域。CPU操作可通过无限循环进行建模。

    在以上各步骤中,由于无效地址、非法指令、越权等原因,可能会出现一个错误状态,称为异常或陷阱。当CPU遇到异常时,它会根据内存中预先安装的指针来执行软件中的异常处理程序。中断是I/O设备或协处理器发送给CPU的外部信号,请求CPU服务。

    中断处理

    • 外部设备(如定时器)的中断被馈送到中断控制器的预定义输入行(Intel 1990 ; Wang 2015),按优先级对中断输入排序,并将具有最高优先级的中断作为中断请求(IRQ)路由 到CPU。
    • 在每条指令执行结束时,如果CPU未处于接受中断的状态,即在CPU的状态寄 存器中屏蔽了中断.它将忽略中断请求.使其处于挂起状态,并继续执行下-条指令。
    • 如果 CPU处于接受中断状态,即中断未被屏蔽.那么CPU将会转移它正常的执行顺序来进行中 断处理对于每个中断,可以编程中断控制器以生成一个唯一编号,叫作中断向量,标识中断源。

    时钟服务函数

    在几乎所有的操作系统(os)中,操作系统内核都会提供与时钟相关的各种服务,时钟服务可通过系统调用、库函数和用户级命令调用。

    通过gettimeofday()获取系统时间

    /********* gettimeofday.c file***/
    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/time.h>
    stiruct timeval t;
    int main()
    {
    gettimeofday(&tff NULL);
    printf("sec=%ld usec=%d\n", t.tv_sec, t.tv_usec);
    printf((char *)ctime(&t.tv_sec));
    )
    
    

    通过settimeofday()设置系统时间

    /********* settimeofday.c file***/
    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/time.h>
    #include <time.h>
    struct timeval t;
    int main()
    int r;
    t.tv_sec = 123456789;
    t.tv_usec= 0;
    r = set t: imeof day (&t, NULL);
    if (!r){
    printf (''settimeofday () failed\nz,);
    exit(1);
    }
    gettimeofday(&t, NULL);
    printf("sec=%ld usec=%ld\n"z t.tv_sec, t.tv_usec);
    printf	ctime (&t.tv_sec)) ; // show time in calendar form
    }
    

    time系统调用

    /************ time.c file ***********/
    #include <stdio.h>
    #include <time.h>
    time_t start, end;
    int main()
    (
    int i;
    start = time(NULL);
    printf (''start=%ld\nw , start);
    for (i=0; i<123456789; i++); // delay to simulate computation
    end = time (NULL);
    printf (''end =%ld time=%ld\nw , end, end-start);
    

    time 和 date 命令

    • date:打印或设置系统日期和时间。
    • time:报告进程在用户模式和系统模式下的执行时间和总时间。
    • hwclock:查询并设置硬件时钟(RTC),也可以通过BIOS来完成。

    时间间隔器

    Linux为每个进程提供了三种不同类型的间隔计时器,可用作进程计时的虚拟时钟。间隔定时器由setitimer()系统调用创建。getitimer()系统调用返回间隔定时器的状态。

    一个信号就是发送给某个进程进行处理的一个数字(1到31)。信号和信号处理将在第6章中讨论。有3类间隔定时器,分别是:

    1. ITIMER_REAL:实时减少,在到期时生成一个SIGALRM(14)信号。
    2. ITIMER_VIRTUAL:仅当进程在用户模式下执行时减少,在到期时生成一个SIGVTALRM(26)信号。
    3. ITIMER_PROF:当进程正在用户模式和系统(内核)模式下执行时减少。

    REAL模式间隔定时器

    VIRTUAL和PROF模式下的间隔计时器仅在执行进程时才有效。这类定时器的信息可保存在各进程的PROC结构体中。(硬件)定时器中断处理程序只需要访问当前运行进程的PROC结构体,就可以减少定时器计时,并向进程生成一个信号。

  • 相关阅读:
    HDOJ 1207 汉诺塔II
    [转]写代码的小女孩
    POJ Subway tree systems
    HDOJ 3555 Bomb (数位DP)
    POJ 1636 Prison rearrangement (DP)
    POJ 1015 Jury Compromise (DP)
    UVA 10003
    UVA 103 Stacking Boxes
    HDOJ 3530 Subsequence
    第三百六十二、三天 how can I 坚持
  • 原文地址:https://www.cnblogs.com/BillGreen/p/15522120.html
Copyright © 2011-2022 走看看