JavaScript is required to for searching.
跳过导航链接
退出打印视图
编程接口指南     Oracle Solaris 10 1/13 Information Library (简体中文)
search filter icon
search icon

文档信息

前言

1.  内存和 CPU 管理

2.  用于 Solaris Cluster 的远程共享内存 API

3.  会话描述协议 API

4.  进程调度程序

5.  地址组 API

6.  输入/输出接口

7.  进程间通信

8.  套接字接口

9.  使用 XTI 和 TLI 编程

10.  包过滤钩子

11.  传输选择和名称到地址映射

12.  实时编程和管理

实时应用程序的基本规则

延长响应时间的因素

同步 I/O 调用

中断服务

共享库

优先级倒置

粘滞锁

失控实时进程

异步 I/O 行为

实时文件

实时调度程序

分发延迟

调度类

分发队列

分发进程

进程抢占

内核优先级倒置

用户优先级倒置

控制调度的接口调用

使用 priocntl

其他接口调用

控制调度的实用程序

priocntl(1)

dispadmin(1M)

配置调度

分发程序参数表

重新配置 config_rt_dptbl

内存锁定

锁定页面

解除页面锁定

锁定所有页面

恢复粘滞锁

高性能 I/O

POSIX 异步 I/O

Solaris 异步 I/O

通知 (SIGIO)

使用 aioread

使用 aiowrite

使用 aiocancel

使用 aiowait

使用 poll()

使用 poll 驱动程序

使用 close

同步的 I/O

同步模式

同步文件

进程间通信

处理信号

管道、命名管道和消息队列

使用信号量

共享内存

异步网络通信

联网模式

计时功能

时间戳接口

间隔计时器接口

13.  Solaris ABI 和 ABI 工具

A.  UNIX 域套接字

索引

计时功能

本节介绍可用于 SunOS 中的实时应用程序的计时功能。使用这些机制的实时应用程序需要本节中所列出例程的手册页中的详细信息。

SunOS 的计时接口分为两个不同的方面:时间戳间隔计时器。时间戳接口可测量已经过的时间。时间戳接口还允许应用程序测量状态的持续时间或事件之间的相隔时间。间隔计时器允许应用程序在指定的时间唤醒以及根据时间的推移调度活动。

时间戳接口

两个接口提供时间戳。gettimeofday(3C)timeval 结构提供当前时间,表示自格林威治标准时间 1970 年 1 月 1 日午夜以来的时间(以秒和微秒为单位)。clock_gettimeclockidCLOCK_REALTIME)以 timespec 结构提供当前时间,表示 gettimeofday(3C) 所返回的相同时间间隔(以秒和纳秒为单位)。

SunOS 使用硬件定期计时器。对于某些工作站,硬件定期计时器是计时信息的唯一来源。如果硬件定期计时器是计时信息的唯一来源,则时间戳的精确度将限制为计时器的分辨率。对于其他平台,分辨率为 1 微秒的计时器寄存器表示时间戳精确到 1 微秒。

间隔计时器接口

通常,实时应用程序使用间隔计时器来调度操作。间隔计时器可以分为以下两种类型:一次性类型或定期类型。

一次性计时器是已经过设置的计时器,设置为相对于当前时间或绝对时间的到期时间。计时器到期一次后即解除设置。此类型的计时器对于将数据传输到存储后清除缓冲区,或使操作超时很有用。

定期计时器设置有初始到期时间(绝对或相对)以及重复间隔。每次间隔计时器到期时,都会按照重复间隔重新装入此计时器。然后,重新设置此计时器。此计时器可帮助进行数据日志记录或伺服控制。调用间隔计时器接口时,会将小于计时器分辨率的时间值向上舍入为下一个硬件计时器间隔的倍数。此间隔通常为 10ms。

SunOS 具有两组计时器接口。setitimer(2)getitimer(2) 接口运行固定设置的计时器,此类计时器称为 BSD 计时器,使用 timeval 结构指定时间间隔。使用 timer_create(3RT) 创建的 POSIX 计时器用于运行 POSIX 时钟 CLOCK_REALTIME。POSIX 计时器操作以 timespec 结构表示。

getitimer(2)setitimer(2) 函数分别用于检索和确定指定的 BSD 间隔计时器的值。可用于进程的三个 BSD 间隔计时器包括指定了 ITIMER_REAL 的实时计时器。如果 BSD 计时器已进行设置并允许到期,则系统会向设置此计时器的进程发送适当的信号。

timer_create(3RT) 例程最多可以创建 TIMER_MAX 个 POSIX 计时器。调用者可以指定计时器到期时应向进程发送的信号和关联值。timer_settime(3RT)timer_gettime(3RT) 例程分别用于检索和确定指定的 POSIX 间隔计时器的值。所需的信号暂挂传送时,POSIX 计时器便会到期。此时会对计时器到期的次数进行计数,并且 timer_getoverrun(3RT) 将检索此计数。timer_delete(3RT) 用于取消分配 POSIX 计时器。

以下示例说明了如何使用 setitimer(2) 生成定期中断,以及如何控制计时器中断的到达。

示例 12-2 控制计时器中断

#include    <unistd.h>
#include    <signal.h>
#include    <sys/time.h>

#define TIMERCNT 8

void timerhandler();
int     timercnt;
struct     timeval alarmtimes[TIMERCNT];

main()
{
    struct itimerval times;
    sigset_t    sigset;
    int        i, ret;
    struct sigaction act;
    siginfo_t    si;

    /* block SIGALRM */
    sigemptyset (&sigset);
    sigaddset (&sigset, SIGALRM);
    sigprocmask (SIG_BLOCK, &sigset, NULL);

    /* set up handler for SIGALRM */
    act.sa_action = timerhandler;
    sigemptyset (&act.sa_mask);
    act.sa_flags = SA_SIGINFO;
    sigaction (SIGALRM, &act, NULL);
    /*
     * set up interval timer, starting in three seconds,
     *    then every 1/3 second
     */
    times.it_value.tv_sec = 3;
    times.it_value.tv_usec = 0;
    times.it_interval.tv_sec = 0;
    times.it_interval.tv_usec = 333333;
    ret = setitimer (ITIMER_REAL, &times, NULL);
    printf ("main:setitimer ret = %d\n", ret);

    /* now wait for the alarms */
    sigemptyset (&sigset);
    timerhandler (0, si, NULL);
    while (timercnt < TIMERCNT) {
        ret = sigsuspend (&sigset);
    }
    printtimes();
}

void timerhandler (sig, siginfo, context)
    int        sig;
    siginfo_t    *siginfo;
    void        *context;
{
    printf ("timerhandler:start\n");
    gettimeofday (&alarmtimes[timercnt], NULL);
    timercnt++;
    printf ("timerhandler:timercnt = %d\n", timercnt);
}

printtimes ()
{
    int    i;

    for (i = 0; i < TIMERCNT; i++) {
        printf("%ld.%0l6d\n", alarmtimes[i].tv_sec,
                alarmtimes[i].tv_usec);
    }
}