加入收藏 | 设为首页 | 会员中心 | 我要投稿 佛山站长网 (https://www.0757zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 搭建环境 > Linux > 正文

浅析Linux中的时间编程和实现原理(二)硬件和GLibC库的细节

发布时间:2016-10-31 01:41:20 所属栏目:Linux 来源:网络整理
导读:引子 熟悉了基本的编程方法之后,我们的兴趣就在于,计算机如何实现这一切的呢?在那些应用层 API 和底层系统硬件之间,操作系统和库函数究竟做了些什么? 首先

多数 GLibC 中的时间函数只是对系统调用的简单封装,不过 timer_create 要算是一个特例,虽然它的大部分功能都是通过系统调用 sys_timer_create 完成的。但是如果 GlibC 发现 timer 的到期通知方式被设置为 SIGEV_THREAD 时,Glibc 需要自己完成一些辅助工作,因为内核无法在 Timer 到期时启动一个新的线程。

考察文件 nptlsysdepsunixsysvlinuxtimer_create.c,可以看到 GLibc 发现用户需要启动新线程通知时,会自动调用 pthread_once 启动一个辅助线程(__start_helper_thread),用 sigev_notify_attributes 中指定的属性设置该辅助线程。

然后 Glibc 启动一个普通的 POSIX Timer,将其通知方式设置为:SIGEV_SIGNAL | SIGEV_THREAD_ID。这样就可以保证内核在 timer 到期时通知辅助线程。通知的 Signal 号为 SIGTIMER,并且携带一个包含了到期函数指针的数据。这样,当该辅助 Timer 到期时,内核会通过 SIGTIMER 通知辅助线程,辅助线程可以在信号携带的数据中得到用户设定的到期处理函数指针,利用该指针,辅助线程调用 pthread_create() 创建一个新的线程来调用该处理函数。这样就实现了 POSIX 的定义。

综上所述,除了少数 API(比如 timer_create),需要 GLibC 做部分辅助工作之外,大部分 GLibC API 的工作可以总结为:调用相应的系统调用。

ctime() 的实现

还有一些 API 我们还没有分析,即那些时间格式转换函数。这些函数的功能是将一个时间值转换为人类容易阅读的形式,因此这些函数的实现完全是在 GlibC 中完成,而无需内核的系统调用。下面我们看一看 ctime() 吧:

清单 3,ctime 的 GlibC 实现

char * ctime (const time_t *t)

{ return asctime (localtime (t));}

localtime() 和 asctime() 的实现都比较复杂,但归根结底是进行复杂的格式转换,时区转换计算等等。这些工作都是完全在 GlibC 内部实现的,无须内核参与。感兴趣的读者可以仔细研究 Glibc time 目录下的 localtime.c、tzset.c 等具体实现。

小结

在这一部分中,我们首先了解到了一些硬件时钟设备的简单知识。无论这些设备本身如何复杂和不同,它们只提供两个主要功能:计时功能和定时中断功能。要想利用这两个基本功能来满足应用的需求似乎还有很多工作,比如:如何衡量实时时间和 CPU 时间?

通过对 GlibC 的简单分析,我们也看到库函数实际上把复杂问题统统交给了内核。GlibC 仅仅是一个中转站,把用户请求发给内核。因此想了解更多,我们必须进入内核。

在接下来的第三部分和第四部分,我们将介绍 Linux 内核的时间系统。

(编辑:佛山站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读