标签归档:计算机

计算机系统中的时间

本文不完全的总结了 UNIX 环境编程中关于时间的操作。

计算机中有两种不同的时间参考系:一种为人们所熟悉的挂在墙上的时钟,即日历时间;另一种则为处理器时间,由于现代计算机系统一般为多任务系统,所以进程并不一直占用处理器。

计算机系统工作在数个不同的时间维度中,典型的 CPU 一个周期时间大约为 10^-9s, CPU 固定间隔时间的中断一般为 0.01s, 而人能够分辨的最小时间间隔在 0.1 s 左右。计算机能够提供的最小时间精度取决于其具体实现,一般计算机最少能提供其 CPU 时间片长度的时钟分辨率,一般为 10ms, 一些系统可以利用 CPU 周期数获取最高分辨率为 1ns 的时钟精度。

获取当前日期和时间

简单的,在 shell 中输入 date 命令即可打印出当前的日期和时间。

UNIX 系统提供的基本时间服务为国际标准时间公元1970年1月1日零点以来所经过的秒数,这个秒数是以数据类型 time_t 表示的,称为日历时间,可以使用 C 库函数 time 获得。另外 C 标准库 time.h 头文件中提供了一系列转换时间的函数,把 time 函数获得的秒数转换为可读的、本地的日期和时间。

#include <time.h>
time_t time(time_t *calptr); 

值得注意的是,time_t 被定义为 long int 类型,在32位系统中,最大只能表示到 2038 年左右。所幸随着64位系统的普及,这一问题将不复存在。

使用 gettimeofday 函数,能够获得比 time 函数具有更高分辨率的日历时间,最高能够达到微妙(10^-6s)级,但这取决与系统的具体实现。在有些平台上,操作系统能够使用 CPU 周期数来获取当前时间,能够达到微妙级的精度,但有些系统实现则使用系统时钟,一般只有 10ms (毫秒,10^-3s)的精度。

#include <sys/time.h>

struct timeval {
    long tv_sec; /* Seconds */
    long tv_usec; /* Microseconds */
}

int gettimeofday(struct timeval *tv, NULL);

在 linux 系统中,gettimeofday 的第二个参数应该简单的设置为 NULL, 因为它指向一个未被实现的校正时区的特性。

使用 clock_gettime 函数指定 clk_id 为 CLOCK_REALTIME 时可以获取系统纳秒级的日历时间。

#include <time.h>

struct timespec {
    time_t tv_sec; /* seconds */
    long tv_nsec; /* nanoseconds */
};

int clock_gettime(clockid_t clk_id, struct timespec *tp);

编译程序时需要链接 -lrt 库,否则会报错。

测量程序执行的时间

继续阅读

自学计算机的建议

本来是回复论坛上的求助,结果不小心写这么多,就单独贴在这发表了。

专业真的不是问题,如果你很喜欢计算机的话。计算机最终还是靠自去自学,去悟。

我也没什么好的建议,就是要多读书和写代码。读书要读好书,读大家推荐的,经过历史筛选的。在看一本书时,可以到豆瓣网上去看评论,太差就就还不如不读。代码当然要写,但分两种,一种是例子程序,一种是项目。我没参加过也没自己做过项目,主要是写了一些例子程序和实现了一些书上的算法。例子程序不必多写,只要掌握了理念就可以了。我上学期的时候实现了运筹学上的一些算法,当时挺自豪的,但现在看看那些程序太垃圾了:变量命名一团乱麻,全是一个字母表示,没有定义函数,一个main 到底,大量的重复代码,以至于自己都看不懂了。

其实我自学计算机也不久,从上学期才开始的。就是刚开始写了小程序,实现了一些算法,感觉挺有意思。就把大一的C 语言书翻出来又看了一遍。不满足就买了K&R,仔细的研读,接下来又看了几本C 语言的书。最后又把数据结构书翻出来看了一遍,感觉很简单,不知道当初学的时候为什么感觉那么难。

再接下来就不只是兴趣了,开始了系统的学习。看了一些操作系统方面的书,寒假学习了Python, 然后这学期开始才开始大量看书的。看书要有规划和计划,规划就是看什么书,最好自己买,这样在遇到困难时不会那么轻易的跳过(不然太浪费了)。我的计划是每天某本书读一章或读多少页,这样一本很厚的书没多久就看完了,很有自豪感。计算机方面书书看不太懂或记不住不用管,有个具体印象就好,用到了再回来翻书印象很深。

不盲目的追求新技术,新语言,学习阶段主要学习的是方法。也不要盲目的看别人学什么你就学什么,比如如果你准备做后台开发你就不要去花大量的时间MFC 之类的图形库。现在计算机分得很细,要有自己的目标和方向。编程语言要多学几种,并且是不同种类的,有句话说:当你只有一把锤子时,看什么都像钉子。

要注重基础知识,大公司招聘的时候主要还是看你的基础知识:C ,数据结构与算法,操作系统,系统结构之类的。经常多看多回顾。

还有就是追踪业界动向。我平时主要用google reader 订阅各种网站,博客,每天花大量时间去阅读。还有微博的消息很快也挺有意思。

最后就是要处理好和本专业的关系。我个人这学期处理的不太好,所以就没什么经验了。