计算机软件的硬件支持

计算机软件都是运行在硬件上的。您在学了更多的知识以后一定会有更深的体会。这里我想讲一讲我个人的一些经历和认识。

我学习计算机,是从解释型语言入门的。解释型语言的代表之一就是BASIC,它很适合初学者。但是,无论是初中时候初学BASIC(或BASICA,或GW-BASIC),还有LOGO,还是到了高中时候自学QBASIC,或者大纲里教的FOXBASE,都不是特别针对操作系统,都不能生成EXE可执行文件(或者即使生成出来了,也还是需要解释器的存在才能运行)。

进入大学以后,学校里教了C语言,后来又教了C++。C语言我在高中时就有所耳闻,特别因为它运行效率高、能生成可执行文件而感到十分向往。C语言底层生成的是机器代码,这是由硬件直接“解释”的代码,所以它和硬件是十分接近的。高三初学C语言时,看的是两本希望出版社的QuickC用户手册(共四本,我只有两本,第一本入门,第二本讲语言和基本库)。然后到了炜炜同学家里的386电脑“东海396A”上编了个小程序进行测试,看看到底是QuickC快还是Turbo Pascal快。后来发现居然是Turbo Pascal快,快了近一倍了,让我们不禁生疑。当然,那时没有想过的一点是,我的QuickC默认生成的是Debug版本的,不知如果改成Release版本会不会因为有了优化而更快些。QuickC当时的好处之一是,生成的程序默认是打开栈溢出检测的,而用Turbo C 2.0生成的程序默认没打开这个开关,速度快但是一旦栈溢出,程序就默默地死了,DOS也朵死了。

从逻辑上说,凡是硬件支持的逻辑,软件都可以模拟。比如市面上流行的NES模拟器,能模拟任天堂的游戏机,从而能在普通PC机上玩NES的游戏。但是,模拟的效率不高。比如说,NES模拟器因为它模拟的硬件平台本来的运行速度就不快,所以还能模拟得比较好;要求更高一些的文曲星模拟器,即使是在奔腾II的450兆赫的CPU上运行,速度还是不够快。模拟出来的速度,即便是全速运行的文曲星,还是奔腾II的几十分之一。

从这个方面来说,硬件支持的主要好处就在于效率。学习了C语言之后,就知道了编译生成机器码来执行与解释执行之间的效率差别了。这也就是为什么C#需要JIT、Java需要热点优化了——也是为了运行效率,把代码转成机器码再执行。然后,看到机器码的汇编以后,是不是就到底了呢?发现不是这样。首先,DOS单任务,Windows 3.1协作式多任务,而Windows 95就支持抢占式多任务了。前两者不用硬件支持就能做,因为本质上还是单线程的——即便是协作式多任务也还是这样,因为程序是自己主动放弃CPU的(当然靠C语言要这样做需要用到setjmp和longjmp和自己管理的栈内存;比较方便合理的还是用汇编)。

而后者就不一样了。抢占式多任务如果不用硬件支持,您想一想,怎么实现呢?每运行10000个语句然后调用您实现的线程切换函数?那么如果语句中有循环怎么办?在每个循环中都插入这个调用?那么如果循环体非常小,只有一两个指令,但调用这个函数却要花费十来个指令,这个效率问题怎么办?而且如果要这样做的话,还必须从编译器就要下手改掉生成的代码,否则到了运行时改的话,插入了代码以后,那些跳转地址什么的都会不对了。

所以,最后的答案还是得用硬件支持,靠中断。当时钟中断来临时,操作系统预先安装好的中断处理程序会被调用。这时,就可以进行线程的调度了。或者,也可以在APIC的帮助下(有待考证)起一个低优先级的中断,从而当CPU处理完高优先级的中断之后再去做线程的调度。

除了多任务以外,硬件的使用还不止于此。386的保护模式,能让应用程序试图访问不该访问的内存页时,操作系统能收到一个异常,从而中止或调试该应用程序。保护模式中页面的保护机制还是.NET框架中多代式垃圾回收扫描算法中用来标记引用是否被修改过的一种方式——如果用软件实现的话,所有引用修改的速度至少会降低到原来的一半。Intel-VT(AMD-V)、SLAT(Intel-EPT/AMD-NP)等新出现的硬件虚拟机支持则更是体现了硬件对软件效率提升所作的贡献。

奔腾CPU从MMX开始,就有了专门针对多媒体的扩展。有了这些扩展以后,浮点运算变得更快,某些多媒体算法使用了硬件支持以后也变得效率更高。比如lame这个开源的MP3编解码器,它能在WAV转MP3的过程中利用CPU的MMX支持,从而让编码速度更快。后来的奔腾III更是增加了SSE,能用于3D计算的加速。而SSE本身也经历了数代更新。

现在的显示卡,功能也越发强大,显存2GB不说,主频也升到了1GHz,复杂的3D渲染能高速合成,比软件渲染快了许多。

总之,硬件对软件的支持体现在方方面面。一些功能有了硬件支持,能实现得更快。有些功能只有得到了硬件的支持,才能得到良好的实现。当然,软件模拟或解释执行的前途也是很广阔的,因为它们在灵活性、可调试性方面又达到了硬件直接运行所达不到的程度。这两条道路想必在将来还会继续发展下去,让我们拭目以待。

返回“编程天地”