第 10 章 时间管理_第1页
第 10 章 时间管理_第2页
第 10 章 时间管理_第3页
第 10 章 时间管理_第4页
第 10 章 时间管理_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第10章时间管理内容提要事件概述时间的度量睡眠定时器定时器文件10.1时间管理概述时间管理概述

时间管理作为操作系统的重要组成部分,无论对于内核和应用程序,均需利用时钟提供各种形式的时间服务,例如,超时、睡眠和定时器等。

为了满足在不同应环境下,应用程序对时间的要求,Linux系统为用户提供了各种形式的时间服务。内容包括:1.系统时间和进程时间2.睡眠(延迟执行)3.定时器应用编程接口分类API功能描述时间系统时间time/stime获取/设置系统时间gettimeofday/settimeofday获取/设置系统时间和时区clock_getres获取时钟精度clock_gettime/clock_settime获取/设置时钟进程时间times获取进程时间时间格式转换localtime日历型转换为分解型strftime分解型转换为可打印格式延迟/睡眠sleep低分辨率睡眠nanosleep/clock_nanosleep高分辨率睡眠alarm设置闹钟定时器定时器getitimer/setitimer获得/设置定时器POSIX定时器timer_create创建POSIX定时器timer_gettime/timer_settime获取/设置POSIX定时器timer_delete删除POSIX定时器文件通知定时器timerfd_create创建定时器文件timerfd_gettime获取定时器的当前状态timerfd_settime设置定时器10.2时间的度量系统时钟1.硬件时钟

硬件时钟有时也称为实时时钟,依靠电池供电,它是软件时钟的基础。2.软件时钟软件时钟提供一种周期性触发中断机制,用于度量流逝的时间。时钟中断的频率通常为100HZ,每秒产生100次,每隔10毫秒1次。系统时钟(续)3.时钟精度软件时钟可满足一般应用要求,高精度计时器自内核2.6.21版引入,通常,精度至少可达微秒级。4.到期延迟计时器到期事件的处理通常会延迟一段时间,时间的长短取决于时钟精度等因素,高精度计时器能减少延迟,要达到完全准确仍有一定的距离。系统时间和进程时间1.系统时间自Epoch(1970-01-0100:00:00)至今所经历的时间称为系统时间,单位为秒,显示的时间与系统所在的时区有关。2.进程时间进程时间是指进程运行所消耗的时间,根据所在空间的不同,进程时间可进一步划分为用户时间和内核时间。进程在用户态消耗的时间称为用户时间,在内核态消耗的时间则称为系统时间。获取/设置系统时间

头文件

#include<time.h>函数原型

time_t

time(time_t*tloc);

int

stime(const

time_t*tloc);功能 获取/设置系统时间。参数

tloc:系统时间。返回值

time函数成功返回系统时间,失败返回-1。

stime函数成功返回0,失败返回-1。获取/设置系统时间和市区头文件

#include<sys/time.h>函数原型

int

gettimeofday(struct

timeval*tv,struct

timezone*tz);

int

settimeofday(const

struct

timeval*tv,conststruct

timezone*tz);功能 获取/设置系统时间和时区。参数

tv:系统时间。

tz:时区。返回值 成功返回0,失败返回-1。时间类型的转换1.日历日历记录自1970年1月1日零时至今的秒数。2.分解时间

分解时间类型是将时间拆分成若干细小部分,便于用户提取,其格式如下所示。structtm{

int

tm_sec;//秒

int

tm_min;//分

int

tm_hour;//时

int

tm_mday;//日

int

tm_mon;//月

int

tm_year;//年

int

tm_wday;//星期几,0表示星期天

int

tm_yday;//一年中的第几天

int

tm_isdst;//夏令时标识,0为标准时,大于0为夏令时};3.打印格式

时间的打印格式是指以NULL结尾的字符串,例如,"WedJun3021:49:081993"。时间类型头文件

#include<time.h>函数原型

structtm*localtime(const

time_t*timep);

size_t

strftime(char*s,size_tmax,constchar*format,const

structtm*tm);功能 时间格式转换。参数

timep:日历时间。

s:可打印时间地址。

max:最大字节数。

format:时间格式。

tm:分解时间。返回值

localtime函数返回分解型时间。

strftime函数返回字符串长度。时间类型的转换头文件

#include<time.h>函数原型

structtm*localtime(const

time_t*timep);

size_t

strftime(char*s,size_tmax,constchar*format,const

structtm*tm);功能 时间格式转换。参数

timep:日历时间。

s:可打印时间地址。

max:最大字节数。

format:时间格式。

tm:分解时间。返回值

localtime函数返回分解型时间。

10.3睡眠延迟执行

进程有时需要挂起一段时间后继续运行,为此,Linux提供了两种面向不同精度的延迟,它们分别为低分辨率和高分辨率延迟。低精度延迟sleep函数头文件

#include<unistd.h>函数原型

unsignedint

sleep(unsigned

intseconds);功能 睡眠一段时间。参数

seconds:睡眠时间(秒)。返回值 若被信号中断,则返回剩余时间,否则返回0。高精度延迟nanosleep函数头文件

#include<time.h>函数原型

int

nanosleep(const

struct

timespec*req,struct

timespec*rem);功能 睡眠一段时间。参数

req:请求睡眠时间。

rem:剩余时间。返回值 成功返回0,失败返回-1。高精度延迟(续)3.clock_nanosleep函数头文件

#include<time.h>函数原型

int

clock_nanosleep(clockid_t

clock_id,int

flags,const

struct

timespec*request,struct

timespec*remain);功能 睡眠一段时间。参数

clock_id:时间度量方式。

flags:时间的参照坐标。

request:请求睡眠时间。

remain:剩余时间。返回值 成功返回0,失败返回-1。闹钟alarm函数头文件

#include<unistd.h>函数原型

unsignedint

alarm(unsigned

intseconds);功能 设置闹钟。参数

seconds:到期时间。返回值10.4定时器内容提要定时器概述传统的定时器POSIX定时器定时器概述

定时器有时也称为间隔定时器或间隔计时器,它是一种按固定时间间隔产生到期事件的计时方式,到期事件通常以信号的形式通知使用者。与alarm函数仅产生一次到期事件不同,定时器可连续产生到期事件。

Linux内核提供了两种定时器,一种是传统Unix使用的定时器,另一种是POSIX定时器。时间度量的方式1.真实时间真实时间是指系统真正流失的时间,无论进程处于何种状态,所有状态的时间都计算在内。2.虚拟时间虚拟时间是指进程处于用户态时间段之和。3.实用时间实用时间是指进程占有CPU的时间段之和,即用户时间与内核时间之和。时间度量的方式t6用户态:执行用户指令+=真实时间内核态:执行内核指令+睡眠:等待被重新调度+=实用时间时间t1t4t7t2t5t8t3t9用户态核心态休眠态传统定时器getitimer/setitimer函数头文件

#include<sys/time.h>函数原型

int

getitimer(intwhich,struct

itimerval*curr_value);

int

setitimer(intwhich,conststruct

itimerval*new_value,struct

itimerval*old_value);功能 获取/设置定时器。参数

which:计时器类型。

curr_value:指向当前间隔时间。

new_value:指向新间隔时间。

old_value:指向原间隔时间。返回值 成功返回0,否则返回?1。传统定时器(续)

struct

itimerval{

struct

timeval

it_interval; //间隔时间

struct

timeval

it_value; //首次到期时间,若为9,定时器禁止

};struct

timeval{longtv_sec; //秒

longtv_usec; //微妙};参数which含义ITIMER_REAL面向真实时间的定时器,若间隔时间到期,产生SIGALRM信号ITIMER_VIRTUAL面向虚拟时间的定时器,若间隔时间到期,产生SIGVTALRM信号ITIMER_PROF面向实用时间的定时器,若间隔时间到期,产生SIGPRT信号POSIX定时器

由于传统定时器仅支持标准信号,每类定时器仅能在进程中创建一个,加之支持的精度较低,为此,POSIX定义了功能更强精度更高的定时器,可支持实时信号,时间精度可达纳秒级。创建/删除POSIX定时器1.timer_create/timer_delete函数头文件

#include<signal.h> #include<time.h>函数原型

int

timer_create(clockid_t

clockid,struct

sigevent*sevp,timer_t*timerid);

int

timer_delete(timer_t

timerid);功能 创建/删除POSIX定时器。参数

clockid:定时器类型。

sevp:到期通知方式。

timerid:定时器ID。返回值 成功返回0,失败返回-1。创建/删除POSIX定时器(续)struct

sigevent{

int

sigev_notify;//通知方式

int

sigev_signo;//通知信号

unionsigval

sigev_value;//传递的数据

void(*sigev_notify_function)(unionsigval);//线程运行函数

void*sigev_notify_attributes;//通知线程属性

pid_t

sigev_notify_thread_id;//线程ID};sigev_notify成员变量含义SIGEV_NONE不通知SIGEV_SIGNAL以信号方式通知SIGEV_THREAD创建线程实例获取/设置POSIX定时器2.timer_gettime/timer_gettime函数头文件

#include<time.h>函数原型

int

timer_gettime(timer_t

timerid,struct

itimerspec*curr_value);

int

timer_settime(timer_t

timerid,int

flags,const

struct

itimerspec*new_value,struct

itimerspec*old_value);功能 获取/设置POSIX定时器。参数

timerid:POSIX定时器ID。

curr_value:指向当前间隔时间。

flags:首次到期时间的参照坐标。

new_value:指向新间隔时间。

old_value:指向原间隔时间。返回值 成功返回0,失败返回-1。struct

itimerspec{

struct

timespec

it_interval;//间隔时间

struct

timespec

it_value;//首次到期时间};10.5定时期文件定时器文件概述

Linux将定时器产生的间隔到期事件看做字节流,将定时器抽象为文件。Linux自内核2.6起引入定时器文件。

创建定时器文件1.timerfd_create函数头文件

#include<sys/timerfd.h>函数原型

int

timerfd_create(int

clockid,intflags);功能 创建定时器文件。参数

clockid:定时器类型。

flags:操作方式。返回值 成功返回文件描述符,失败返回-1。实例分析int

main(int

argc,char*ar

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论