linux时间子系统之,linux时间子系统(四)

2.3 系统调用

timekeeper提供一系列的系统调用,使得用户空间可以获取想要的时间。下面简单的介绍一下clock_gettime系统调用

SYSCALL_DEFINE2(clock_gettime, const clockid_t, which_clock,

struct timespec __user *,tp)

{

struct k_clock *kc = clockid_to_kclock(which_clock);

struct timespec kernel_tp;

int error;

if (!kc)

return -EINVAL;

error = kc->clock_get(which_clock, &kernel_tp);

if (!error && copy_to_user(tp, &kernel_tp, sizeof (kernel_tp)))

error = -EFAULT;

return error;

}

static __init int init_posix_timers(void)

{

struct k_clock clock_realtime = {

.clock_getres   = hrtimer_get_res,

.clock_get      = posix_clock_realtime_get,

.clock_set      = posix_clock_realtime_set,

.clock_adj      = posix_clock_realtime_adj,

.nsleep         = common_nsleep,

.nsleep_restart = hrtimer_nanosleep_restart,

.timer_create   = common_timer_create,

.timer_set      = common_timer_set,

.timer_get      = common_timer_get,

.timer_del      = common_timer_del,

};

struct k_clock clock_monotonic = {

.clock_getres   = hrtimer_get_res,

.clock_get      = posix_ktime_get_ts,

.nsleep         = common_nsleep,

.nsleep_restart = hrtimer_nanosleep_restart,

.timer_create   = common_timer_create,

.timer_set      = common_timer_set,

.timer_get      = common_timer_get,

.timer_del      = common_timer_del,

};

struct k_clock clock_monotonic_raw = {

.clock_getres   = hrtimer_get_res,

.clock_get      = posix_get_monotonic_raw,

};

struct k_clock clock_realtime_coarse = {

.clock_getres   = posix_get_coarse_res,

.clock_get      = posix_get_realtime_coarse,

};

struct k_clock clock_monotonic_coarse = {

.clock_getres   = posix_get_coarse_res,

.clock_get      = posix_get_monotonic_coarse,

};

struct k_clock clock_boottime = {

.clock_getres   = hrtimer_get_res,

.clock_get      = posix_get_boottime,

.nsleep         = common_nsleep,

.nsleep_restart = hrtimer_nanosleep_restart,

.timer_create   = common_timer_create,

.timer_set      = common_timer_set,

.timer_get      = common_timer_get,

.timer_del      = common_timer_del,

};

posix_timers_register_clock(CLOCK_REALTIME, &clock_realtime);

posix_timers_register_clock(CLOCK_MONOTONIC, &clock_monotonic);

posix_timers_register_clock(CLOCK_MONOTONIC_RAW, &clock_monotonic_raw);

posix_timers_register_clock(CLOCK_REALTIME_COARSE, &clock_realtime_coarse);

posix_timers_register_clock(CLOCK_MONOTONIC_COARSE, &clock_monotonic_coarse);

posix_timers_register_clock(CLOCK_BOOTTIME, &clock_boottime);

posix_timers_cache = kmem_cache_create("posix_timers_cache",

sizeof (struct k_itimer), 0, SLAB_PANIC, NULL);

idr_init(&posix_timers_id);

return 0;

}

#define CLOCK_REALTIME                  0

#define CLOCK_MONOTONIC                 1

#define CLOCK_PROCESS_CPUTIME_ID        2

#define CLOCK_THREAD_CPUTIME_ID         3

#define CLOCK_MONOTONIC_RAW             4

#define CLOCK_REALTIME_COARSE           5

#define CLOCK_MONOTONIC_COARSE          6

#define CLOCK_BOOTTIME                  7

#define CLOCK_REALTIME_ALARM            8

#define CLOCK_BOOTTIME_ALARM            9

系统在初始化是会调用init_posix_timers等函数来初始化clock_gettime系统调用所需要的相关数据结构。这里,调用clock_gettime获取时间时,需要的是k_clock结构中的clock_get回调函数。对于clock_gettime的which_clock参数,系统支持获取包括xtime,boot time,monotonic time,raw monotonic time以及进程或者线程运行时间等共十种方式。对于获取xtime和monotonic time,which_clock有两种设置,分别是带_COARSE和不带两种方式。

2.3.1 _COARSE作用

static int posix_clock_realtime_get(clockid_t which_clock, struct timespec *tp)

{

ktime_get_real_ts(tp);

return 0;

}

#define ktime_get_real_ts(ts)   getnstimeofday(ts)

void getnstimeofday(struct timespec *ts)

{

unsigned long seq;

s64 nsecs;

WARN_ON(timekeeping_suspended);

do {

seq = read_seqcount_begin(&xtime_seq);

*ts = xtime;

nsecs = timekeeping_get_ns();

/* If arch requires, add in gettimeoffset() */

nsecs += arch_gettimeoffset();

} while (read_seqcount_retry(&xtime_seq, seq));

timespec_add_ns(ts, nsecs);

}

static inline s64 timekeeping_get_ns(void)

{

cycle_t cycle_now, cycle_delta;

struct clocksource *clock;

/* read clocksource: */

clock = timekeeper.clock;

cycle_now = clock->read(clock);

/* calculate the delta since the last update_wall_time: */

cycle_delta = (cycle_now - clock->cycle_last) & clock->mask;

/* return delta convert to nanoseconds using ntp adjusted mult. */

return clocksource_cyc2ns(cycle_delta, timekeeper.mult,

timekeeper.shift);

}

static int posix_get_realtime_coarse(clockid_t which_clock, struct timespec *tp)

{

*tp = current_kernel_time();

return 0;

}

struct timespec current_kernel_time(void)

{

struct timespec now;

unsigned long seq;

do {

seq = read_seqcount_begin(&xtime_seq);

now = xtime;

} while (read_seqcount_retry(&xtime_seq, seq));

return now;

}

从函数实现可以看到,当带_COARSE后缀时,函数直接返回xtime。而不带_COARSE后缀时,函数得首先统计当期时刻和上次更新xtime时的时间差,将时间差与xtime之和返回。从这点看,带后缀的比不带后缀的效率要高。当需要的时间不需要太精确时,可以使用带_COARSE后缀的参数来获取时间,这样可以略微提升应用的运行速度。当获取时间的操作很频繁时,作用尤其明显。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/554469.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

腾讯视频上传视频如何同步到企鹅号

企鹅号是腾讯的一个非常棒的产品,让一大批自媒体人赚了钱,我们都知道腾讯视频和企鹅号是互通的,腾讯视频中的视频也可以同步到企鹅号中。所以今天播放器家园网小编教大家如何将视频进行同步。 腾讯视频上传视频如何同步到企鹅号   1、我们首…

linux认令牌操作错误,验证令牌操作错误

问题描述我忘了我的Ubuntu密码,因此我启动进入恢复过程并进入root shell提示符,这就是发生了什么事:rootusername-PC:~# passwd usernameEnter new UNIX password:Retype new UNIX password:passwd: Authentication token manipulation error…

怎么将手机QQ浏览器里面的文章分享给QQ好友

qq浏览器是一个大家都会使用到的搜索软件,用户可以使用手机在这里掌握非常便捷的搜索服务,用户可以打开自己的手机在这里搜索自己想要的文章内容,可以将这些内容分享给朋友,让朋友一起来学习文章内容,那么用户在使用这…

风姐姐,对不起

风姐姐,对不起:一棵木棉树,生长在小山岗上。春风一吹,木棉花就开了,红彤彤的花朵缀满枝头,远看像一片彩云,又像一团火焰,吸引了无数崇敬的目光。每天,彩蝶飞到她身边翩翩…

linux bash 历史记录,Linux Bash History 命令历史记录

此处网址,有详细介绍标准状况下, bash命令历史记录的传统修改方式。linux下面文章,介绍了更符合实际须要的处理方法:git1. 在/etc/bashrc文件末尾内添加内容:不一样版本Linux,该文件名不一样,视…

优酷屏幕录制在哪里_手机优酷怎么录制视频

电脑屏录制软件有很多,但是大部分屏幕录制软件一般必须付钱,而且一些手机软件视频录制后的视頻也有图片水印,比较严重危害了视頻欣赏度。优酷视频的录屏功能设计方案精巧,简易好用,对第一次录制视频的人而言应用十分简…

上海电力大学c语言程序设计章测试,上海电力学院c语言报告:实验8 指针.doc

上海电力学院c语言报告:实验8 指针.doc下载提示(请认真阅读)1.请仔细阅读文档,确保文档完整性,对于不预览、不比对内容而直接下载带来的问题本站不予受理。2.下载的文档,不会出现我们的网址水印。3、该文档所得收入(下载内容预览)…

如何删除2345浏览器网络导航主页

2345浏览器是一款非常便捷的服务软件,用户可以在这里体验一下全新的浏览感受,只要使用手机就可以快速体验最便捷的服务,浏览器是一种非常灵活的搜索软件,用户在使用的时候可以自由设置功能,这样用户可以享受自己想要的…

c语言.h文件怎么写,关于C语言中.h文件怎么书写?

其实,头文件的功能就是申明资源,特别是多个C文件的时候,简单地说,就像是库文件。例如:reg51.h头文件,就是单纯的申明资源,系统的其它头文件,还有申明函数的。如果自己编写头文件&…

腾讯视频怎样关闭推送迷你页面

腾讯视频是一款难得的好软件,本文给大家分享“腾讯视频怎样关闭推送迷你页面”,相信大家看完后在使用方面更加得心应手。腾讯视频客户端为您推荐更多精选热门视频,通过多条件筛选快速定位匹配结果,提供多种画质、多种语言切换播放…

python c语言 数据类型转换,Python类型转换,数据类型转换函数大全

虽然 Python 是弱类型编程语言,不需要像 Java 或 C 语言那样还要在使用变量前声明变量的类型,但在一些特定场景中,仍然需要用到类型转换。比如说,我们想通过使用 print() 函数输出信息“您的身高:”以及浮点类型 heigh…

帮助蚂蚁的小猪

帮助蚂蚁的小猪;小猪有个特别的爱好,那就是收集各种漂亮的树叶。 小猪最喜欢的就是秋天,因为在秋天,小猪可以收集到各种不同美丽的树叶。这一片像星星,这一片弯弯的像月亮,这一片有五个手指,这…

新闻发布系统C语言,资讯 | 助力期末之c语言专场圆满结束!

原标题:资讯 | "助力期末"之c语言专场圆满结束!大一生活如白驹过隙,一转眼便来到了期末,相信很多同学都对c语言期末考很在意,但是又不知道考点在哪里,感觉很多知识点都还不太清楚。确实&#xff…

c语言结构-的优先级,c语言运算符号优先级

/**************************************************************************/01 左结合_()、[]、->、.() 圆括号[] 下标运算符-> 指向结构体成员运算符. 结构体成员运算符/**************************************************************************/02 右结合 ( …

android自动化测试之robotium初探(三),Android自动化测试之Robotium--基础操作.pdf

Android自动化测试第五课Android 自劢化测试乊Robotium——基础操作Karen微信公众号:gloryroadtrainThreadingTest技术支持Q群:一群:339834199二群:311186106Android自动化测试全系列课程 Android系统级白盒测试以及不自劢化测试集成--核心…

PP视频如何播放本地视频文件

今天小编给广大用户分享PP视频如何播放本地视频文件。PP视频手机版是一款装机必备的手机视频播放软件,用户可在线观看PP视频全部免费高清正版视频,海量内容,高清画质,自由点播,配合先进的P2P下载技术,一键高…

android svn丢失文件恢复,SVN搭建(以此为准,成功)文后含备份与恢复

一,安装必须的软件包.yum install subversion (SVN服务器)mysql-server (用于codestriker)httpd mod_dav_svn mod_perl (用于支持WEB方式管理SVN服务器)sendmail (用于配置用户提交代码后发邮件提醒)wget gcc-c make unzip perl* (必备软件包)ntsysv vim-enhanced (…

搜狐视频怎么设置自动连播

本文播放器家园网小编给大家分享搜狐视频怎么设置自动连播,如果大家在使用搜狐视频过程当中遇到类似问题,欢迎阅读本文!搜狐视频拥有独立的播放界面,软件采用独立的播放界面进行播放,用户点击喜欢的影视播放之后不会干扰您对影视资…

PP视频怎么设置可以运行多个客户端

今天继续给大家分享PP视频方面的内容。PP视频怎么设置可以运行多个客户端。PP视频客户端是国内领先的视频播放器,以 “快者为王”为产品理念,注重用户体验,为用户提供视频播放,视频发布,视频搜索,视频分享功能,充分满足用户日益增…