Windows系统技术的研究

Windows系统技术的研究

潘爱民,2008.5.23

最近两年来,一直在钻研Windows系统技术,之所以做这件事情,源于两年前的一个想法,我想看看Windows系统到底是怎么响应用户请求的,特别是当系统性能表现很差的时候,更想知道应用程序和操作系统在忙些什么。

一个看似简单的想法,在实现过程中走了不少弯路,前前后后有许多名来自国内最好学校的大学生和研究生跟我一起探索。真的要感谢他们,要不然我未必能坚持下来。

从某种程度上,我感觉差不多已经实现了当初的想法,虽然仍有不少细节尚待完成,但那已经不很重要了。我们有了一套比较系统化的方法,可以揭开许多谜团。每当发现一些意想不到的问题根源的时候,那种感觉真的很好。下面是两个很有意思的例子,写出来跟大家分享。

(1)在我的一台电脑上,每当进入一个目录的时候,窗口总要停滞好一会儿,有时候,右键菜单也有这问题。这给我的感觉很不好,我下决心要找到原因。可重现的问题总是不难查找根源,尤其对于有好奇心和耐心的人而言。后来我们发现,这是因为有一个文件类型关联到一个远程路径上,而远程路径所指的那台机器已经不存在了。所以,每次当Explorer处理这种文件类型时(比如显示图标、增加有关的菜单项等),发出的远程请求都要等到超时,如果远程请求发生在用户界面线程中,那么界面停滞也就不可避免了。

(2)有一天深夜在家,我的系统在搜索无线网络的时候发生极不正常的现象,而且不可重现,幸好,我当时打开了我们开发的一个工具,把那段纪录信息拿下来分析,半自动半手动地很快找到了原因。在Windows底层的一个驱动程序中,有一个5000次的循环,在循环中,它检查一个标记值然后睡眠1毫秒。但是我可以清楚地观察到,循环中实际的睡眠时间总是15或16毫秒。所以,程序代码本身的意图是执行5000*1ms=5秒,但实际执行时间超过了5000*15ms=75秒。至于为什么Sleep(1ms)变成了Sleep(15ms),我只做简单解释。在现代操作系统中,线程调度精度差不多都在10ms以上,多核版本的Windows XP是15ms。

钻研的过程非常有乐趣,我们搞清楚了Windows底下的线程们是如何协作做事情的。抓住这些要点,我相信,大多数异常行为我们都有可能解释清楚,但如何自动完成做并非易事。

其实我写的程序非常少,但是我们对于程序的理解在不断加深,最初我特别关注调用栈(call stack),到后来更加关注系统全局的协作,一步步的经验积累,让我们不断地化解系统的复杂性。向系统的复杂性挑战,非常有意思!

除了沿着已有的操作系统实现来考虑问题,我们也在研究和思考现代操作系统的发展和变革。毕竟硬件技术的飞速发展,使得个人电脑的系统环境发生了质的变化。多核处理器和64位系统的普及,将会带来挑战和机遇。

顺便提一下,根据这几年的工作经历,我发现精通系统技术的人才太少,无论是学生还是工业界的从业人员,都鲜有碰到者,或许是因为我接触人太少的缘故。我很希望能做些工作来带动一些人,但似乎个人的努力总是很渺小。如果在校学生对系统技术很有兴趣,也有不错的基础,我很愿意跟你们交流。

阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭