标签归档:linux

计算机系统中的时间

本文不完全的总结了 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 库,否则会报错。

测量程序执行的时间

继续阅读

malloc 从哪里得到的内存空间

引子

在计算机高级编程语言中,C 语言相对来说是一种低级语言,从某种意义上讲,C 语言就是现代的“汇编语言”。说 C 语言低级很大程度上是因为 C 程序员需要手动管理存储,具体反应在公认最难最容易出错的指针上。比如编写 C 程序时,经常会出现莫名奇妙的段错误,并且内存泄漏会在不知不觉的情况下发生,直到耗尽你的计算机内存资源为止。更危险的则是缓冲区溢出,使程序非常容易受到攻击。

发明 C++ 的一个目的是为了提升 C 语言的抽象能力,还有一个目的就是为了消除指针,但 C++ 显然没有做到这一点。Java 则继承了 C++ 的遗愿,彻底的消灭了指针。Java 等高级语言采用严格的内存管理,动态的垃圾回收等机制使得程序员不用去手动管理内存,不用和底层打交道。但 C 语言的地位仍是无法取代的。在必须和底层打交道的时候,就得使用 C 语言(有时候甚至要用汇编语言),比如现代操作系统都是用 C 语言编写的。另外,高级语言在引入高级特征的同时,效率上就会有所损失,在非常强调执行效率的地方,C 语言通常是首选。

继续阅读

给电脑重装了系统

最近电脑反应速度越来越慢,并且有各种问题,还装了太多乱七八糟的软件,磁盘空间快要溢出了。本着用电脑而不是折腾电脑的精神,我艰难的下了决心给电脑重装了系统,轮流着把分区格式化一遍,发现有这么多自己不需要的东西。

额,我装的是 win7, 不是 Linux. 并且这次重装之前的双系统被覆盖掉了,近期不打算再安装 Linux, 虽然喜欢 Linux, 但用着太折腾,相对来说还是 Windows 用着舒心。还是那句话,电脑是拿来用的而不是拿来折腾的。

只安装了自己需要用的软件,发现自己常用的软件就那么几个。

浏览器:Chrome, 浏览器是我用的最频繁的软件了。安装了一个使用统计插件,发现自己平均每天用 Chrome 的时间有四个小时左右,浏览网页超过 500 个。Chrome 强大的同步功能,使得我在重装后体验和之前几乎一样。还安装了 IE9 Opera,  FireFox.

浏览器是电脑目前最重要的软件之一,Chrome 目前已经超过火狐成为世界上第二大浏览器。第一大是 IE, 不过我相信用 IE 的人群中有相当一部分还不知道什么是浏览器,拜微软所赐。不过中国就很特殊了,排名前两位的分别是 IE6 和 360浏览器,加起来超过了 50%, 这是多么可悲的一件事啊!IE6 是诞生于 10 年前的软件,身上还残留当年浏览器大战的痕迹。与标准不兼容,充满 BUG, 是所有前端开发者的噩梦。而 360 一个 IE 加壳浏览器,被流氓冠以“安全”之名,恐吓用户进行安装。互联网怎么能让流氓得道?

聊天:QQ, 不过现在用的少了。还安装了飞信阿里旺旺,分别用来发短信和淘宝网购。

工具:WPS 办公套件,office 的免费替代品,速度很快。有道笔记,一个可以自动同步的云笔记本。7-Zip, 开源解压软件。福昕阅读器,轻量级 PDF 阅读软件。QQ拼音输入法,很干净,没有广告。

多媒体:视频播放器 PotPlayer, 绿色无广告,轻量级速度快。图片管理器 QQ影像,批量编辑图片是个特色功能,我觉得比 picasa 好用。图片处理:GIMP,你可以理解为 PS 的开源免费替代品(什么,Photoshop 也是免费的?)

开发:CygWin, 一个运行在 Windows 上的 Linux, 可以安装各种 Linux 上的开发工具比如 GCC, GDB, Make, VI, Git 等等,配合 Notepad++ 文本编辑器,很实用。还有 Python, 虽然 CygWin 也有 Python 但一些第三方库依赖于 Python for Windows.

安全:这个真的不需要。我取消了那些所谓的安全卫士或者电脑管家和杀毒软件的开机启动项,电脑速度快多了。再也没有东西告诉我这次开机用了多长时间了,也没有一些弱智的提示,也不会有东西恐吓我电脑不安全,要装这个装那个了。事实上,这些安全软件拦截的通常是我自己的操作。当然如果你是菜鸟,或者经常上一些不健康的网站:) 建议你还是装上吧,心里也能有个安慰,虽然通常没什么作用。如果你喜欢自虐的话,建议安装 360 哦,这样你就可以体验到一遍一遍体检,把自己电脑折腾到 100 分的乐趣;会提示你这次开机又打败了多少人,没事还可以多开关机几次玩玩;会时刻知道自己电脑有多么的“安全”,这是多么开心的事啊!

如果有一些好用的软件,欢迎在此推荐。

多平台兼容时字符编码问题

我把自己在 Win 下写的 Python 程序拿到 Linux 下运行,遇到了一些问题。

第一个问题是汉字乱码问题。问题出现在 Win 下汉字的默认字符编码格式是 ANSI 格式,而 Linux 下默认使用 UTF-8 格式。如果你用的是 Ubuntu, 可以看看这篇文章:Gedit中文乱码。如果你想让你的程序能在多平台下正常运行,最好在编写程序时使用通用的 UTF-8 格式编码,或者在你的代码中不要出现除了 ASCII 码之外的字符。

第二个问题:在 Linux 的脚本程序第一行中写类似于下面的代码:

#!/usr/bin/python

可以指定运行脚本的程序,从而可以直接运行脚本文件。但是我的程序并没有直接运行成功,shell 提示找不到解释器文件。只能以类似如下命令方式运行:

python test.py

也就是说第一行代码没有起作用。

猜测出现这个问题是因为 Win 和 Linux 下文本换行符格式不一样。在 Linux/UNIX 下,换行符为 ‘n’, 而 Win 下为 ‘rn’, Mac 下为 ‘r’, 所以 shell 在运行文件时,’/usr/bin/python’ 后多出了一个字符 ‘r’, shell 按照这个文件名当然找不到。解决办法:在编写代码时以 UNIX 格式新建文件,使用 notepad++ 文本编辑器可以很容易做到这一点。

但在我使用了 UNIX 格式新建文件和 UTF-8 文本编码格式保存后程序还是无法直接运行。我试着以UTF-8 无 BOM 格式编码后问题得到解决。查找了资料,了解到:BOM (Byte-Order Mark),字节顺序记号,中文也叫字节顺序记号。对于 UTF-16 和 UTF-32,BOM 的作用是在文件开头加上三个字节来标识文件的字节序,即采用的是大端法还是小端法。但对 UTF-8 来说,没有字节序的问题,BOM 的作用只是来标识这是一个 UTF-8 编码的文本文件。在 UTF-8 中,BOM 在文件开头占三个字节为 EF BB BF (十六进制)。在类 UNIX 系统中,UTF-8 BOM 这种作法则不被建议采用。但是在windows系统中,它是默认存在的。UTF-8 BOM 可以在不知不觉间导致一系列莫名其妙的问题。

总结一下

如果你想让你的代码不但能在 Win 下,也能在 Linxu 下都正常运行(其他平台没有测试),那么最好以 UNIX 格式新建文件,使用 UtF-8 无 BOM 格式编码。Win 下推荐使用 notepad++ 文本编辑器

扩展阅读

字符编码笔记:ASCII,Unicode和UTF-8 —— 阮一峰

UTF-8文件的Unicode签名BOM(Byte Order Mark)问题

安装了ubuntu11.10

前天 Ubuntu 发布了11.10正式版,昨天下了 DVD 版,结果安装了好几次都是卡在一个地方无法安装成功。今天不死心,重新下载 64 位 CD 版,安装成功。

界面很不错,相比与 Ubuntu 11.04 充满 BUG 的 unity 界面,进步很大。特别是登录界面很漂亮,给人眼中一亮的感觉。开关机的速度也提升了不少。不准备再做过多的折腾了,毕竟电脑是拿来用的,而不是拿来折腾的,Ubuntu 上默认的配置和软件已经够用了。

我觉得对大部分人来说,把 Ubuntu 作为主要桌面还不到火候。并不是这个系统做的不好,而是缺乏应用提供商的支持,毕竟 Linux 用户还是非主流的。不过只要你勇于使用和学习,Ubuntu 下还是有大量的优质替代软件,并且绝大部分为免费开源软件。对于我来说,主要就是用来编程和学习,相比与 Win, 再 Linux 下编程简直就是一种享受。其他的话,现在越来越多的事情可以不是用软件,而通过浏览器来完成了。

附:

英文官方网站:http://www.ubuntu.com/

简体中文官方网站:http://www.ubuntu.org.cn/

官方下载:http://cdimage.ubuntu.com/releases/11.10/release/

网易镜像:http://mirrors.163.com/ubuntu-releases/11.10/

中科大镜像:http://mirrors.ustc.edu.cn/ubuntu-releases/11.10/

Ubuntu 简介:

Ubuntu 是一个以桌面应用为主的GNU/Linux操作系统,其名称来自非洲南部祖鲁语或豪萨语的“ubuntu”一词(译为吾帮托、乌班图、有奔头或乌斑兔),意思是“人性”、“我的存在是因为大家的存在”, 是非洲传统的一种价值观,类似华人社会的“仁爱”思想。Ubuntu的目标在于为一般用户提供一个最新的、同时又相当稳定的主要由自由软件构建而成的操作系统。Ubuntu具有庞大的社区力量,用户可以方便地从社区获得帮助。

Ubuntu基于Debian发行版和GNOME桌面环境,与Debian的不同在于它每6个月会发布一个新版本。普通的桌面应用版可以获得18个月的支持,标为LTS的桌面应用版可以获得更长时间的支持。

(来自维基百科,链接