“时间”和“空间”,在小的时候对我来说只是两个词语,没有什么实质的领悟;后来知道了霍金曾写《时间简史》来讨论时间,到现在也没读完过,估计读完也懂不了;貌似爱因斯坦还说过时间是现实世界的第四个维度?但时间对于人来说总是有别于空间的,但时间总是感觉很特别,感觉不应该和空间统一起来,我想两者应该是个对等的关系;再后来,相见别离,让我明白了时间的意义,房价飙涨,也让我了解了空间的残酷(2333…)。 倒是从大学后的一些课程开始,我对这两个概念有了更加现实的理解。比如,数据结构这门课貌似从第一节就让我们求一段程序的空间复杂度和时间复杂度,有些算法是用时间换空间(牺牲更多计算时间,减少存储空间),有些是用空间换时间。加上后来的各种经历和获得的知识,让我觉得,信息的存在需要空间和时间,而随着人类的发展,各种信息所需要的时间和空间之间可以互相转换替代。 生活中的信息和时间/空间 如果对算法复杂度一窍不通,我们也能在生活中找到一些例子。比如街上的小店铺门前挂的LED电子屏幕,上面可能滚动着各种最新的促销信息,如果你碰巧感兴趣,就需要驻足等所有字幕滚动一遍。看完你可能觉得很烦:“为什么字幕滚动这么慢,促销又这么没有诚意,完全是在浪费时间…”,这说明你的阅读速度很快,老板也许还想让更多心不在焉的人感受到他跳楼甩卖之决心呢。我们考虑这样一个问题,如果放到没有LED屏的30年前,也许把整个店铺的店面用横幅盖住也写不下这么多的字吧。这里,LED电子屏减小了店铺广告的空间,却增加了展示同样多信息的时间(不考虑人的阅读速度,时间由零秒变为字幕滚动所需的数秒)。 类似还有很多例子。我还可以想到电子书和纸质书,一个iPad可能可以存下原来一个图书馆的书籍,空间大大减小。但是要展示所有的书籍的信息,iPad却必须花时间:设想我们有足够的空间的话,可以把图书馆所有的书的每一页都撕下来摊开放在地上,所有信息展示的时间为零,而iPad只有一个屏幕,我们无法在一个时刻翻完所有的信息(假设屏幕帧率为100Hz,我们一秒最多翻100页)。再例如,如果你喜欢电子读物,只需要一个MP3和一个耳机,甚至连ipad的大屏幕都不需要,空间又减小了,但由于说话速度小于阅读速度,展示完所有信息需要的时间却又增加了。这里当然是把人接收书中信息的速度忽略不计了,因为有人会把音频书加快3倍听,而另一些人可能看文字书一目十行。 更接近信息本质的思考 在通信和计算机系统中,信息的传递和存储都是需要编码的,这些编码的过程就是对信息进行表示和压缩的过程。 莫尔斯码也许是为人熟知的系统,这种电码和现代计算机系统类似,最小的通信单元也是两种状态:长、短。长短电报音的各种组合就能表示各种各样不同的信息。最早的电报是需要电报员的,他只能戴上耳机,处于紧张的接收状态。设想如果我们是21世纪的操纵古老电报机的电报员,我们可能会想出各种办法把这种音频记录通过模式识别之类的手段存储起来,然后用Python写一个解码器就直接将翻译过来了。我们不考虑翻译过程的话,我们的“现代做法”便是用存储空间换取了持续在线接收的时间,或者说这是一种带不带“缓冲区”的区别。 数据压缩的概念也很常见,我们从网上下载的很多文件,格式都是rar或zip的,这时如果你想使用它,就必须用压缩软件解压。而这个解压速度,主要取决于你CPU的计算性能。很简单的道理:解压和压缩虽然都需要消耗时间,但可以节省更多的空间。这就是信息在时间和空间的一种转换。 信息的成本和价值 “时间就是金钱”。我认为,之所以人们经常那这句话提醒自己,肯定是因为通常金钱并不经常和时间有一个公认的“汇率”。也许空间就不一样了,在北京的房子可能需要10万一平米,其他有些地方的房子可能只要1千元一平米,大家都觉得很合理;一块普通硬盘可能需要5毛钱1GB的成本,可能固态硬盘就要5块钱1GB,大家也认为很合理,空间总有个价格。 …… 如果我假设,信息的产生、获取或者存储可以用存储空间和计算时间来度量,同时计算时间和存储空间之间又存在某种公认的价格(比如云计算–明码标价的计算能力和存储能力),那么也许时间就是真的可以用金钱来衡量了。而信息这种依赖时间和空间的产物,也便产生了其必然的价值。那么到了那个时候,时间就是金钱,金钱就是信息。 …… 最后要说明: 这篇博客并没有投入很多时间深入思考,只是最近偶然冒出的一些想法。在我看来,人生的意义很大程度上在于了解自己和自己之外的东西,这些想法也许有用也许没用,也许深奥也许通俗,但以我的角度,都是自己所学所见的一些积累所导致,所以对我来说都是值得记录的。谢谢大家的关注。

原文出处:QEMU当前的文档 qemu/docs/devel/tracing.txt 一、介绍 这篇文档描述了QEMU追踪的整体架构和如何使用追踪功能来进行debug、性能分析或者监测运行状况。 二、快速开始 步骤1. 编译QEMU时带上’simple’trace追踪后端: ./configure –enable-trace-backends=simple make 步骤2. 创建一个写有你想追踪的事件(events)的文件 echo memory_region_ops_read >/tmp/events 步骤3. 运行虚拟机来产生一个追踪文件 qemu -trace events=/tmp/events … #加上其他你需要的qemu选项参数 步骤4. 以美观的形式打印出二进制的追踪文件Pretty-print the binary trace file: ./scripts/simpletrace.py trace-events-all trace-* #用QEMU的进程号(pid)来代替”*” 三、Trace events 1. 设置子文件夹 Sub-directory setup 在源码目录的每个文件夹中都可以在trace-events文件中声明一组静态的trace events。所有包含有trace-events文件的子文件夹必须被列在源码根目录Makefile.objs的trace-events-subdirs项中。这样在编译时,被列出的子文件夹的trace-events文件就会被tracetool脚本处理来生成相关的追踪代码。 单独的trace-events文件会被merged到一个trace-events-all文件中,trace-events-all文件也将会被安装到/usr/share/qemu目录中,并改名为trace-events,这个文件最终会被simpletrace.py脚本用作simpletrace数据格式的追踪分析。 在子文件夹中,以下的文件会被自动生成 trace.c – the trace event state declarations trace.h – the trace event enums […]