“代码执行环境”浅谈

“代码执行环境”不知道有没有这个专有名词。工作的经历让我感到这个概念需要摊出来好好说说。它是衡量你 coding 水平的重要指标。从计算机发明到现在,人们一直在努力使更多的人“不理解”这个概念,于是软件中的层级概念就随之产生了。内核,驱动,应用程序等的 3 个等级的大致的划分,也基本划分出了 3 种类型的程序员。操作系统的著作者更是竭力在营造一个好的“环境”给我们的代码。我们 --- “普通的程序员”则越来越傻。其实可以这样说,“代码执行环境”的深刻理解,是你有资格成为“高手”的必要条件。当代的多任务操作系统使我们这群傻瓜对“代码执行环境”的理解已经添加了很大的难度,可是当我们还没来的急仔细学习它时,“多核心处理器”又诞生了,使我们的代码可以真正的“并行执行”,我们的代码的“执行环境”就这样一步步复杂一下去,我们永远来不急学习它,我们将永远的傻瓜下去。

你甘心么?答案当然是否定的。

这个概念就从大家熟悉的DOS开始说起,在DOS之前的没有操作系统的年代,我们的代码都在一个纯净的环境的执行,我的代码是这个处理器的山大王,整个处理器的资源都归我们所有,代码不会被打扰。(在“中断”出现在处理器中之前,我想这个“执行环境”更加纯洁)。这个时期我们只要懂“处理器语言”就可以编程了,因此当时有着最为简单的“代码执行环境”。如今还是有很多人做着类似的工作,如单片机的编程等。我们公司做嵌入式多任务操作系统的驱动程序,我面试时一般不会选择在单片机编程有多年经验的人,除非他有出人的表现。因为我认为这样的人,多年禁锢在这样单纯的环境中编程,思维会跟不上我们公司的发展。周围同事中的一些例子也证明了我的想法。

DOS风靡的年代,程序员更多的接触到“中断服务历程”的概念。DOS虽然是一个单任务操作系统,但是当时已经有高手的代码可以使自己的程序同时运行多个任务。越来越多的需求迫切一个真正的多任务操作系统的出现。可是当时主流CPU都是单核的。终于操作系统的著作者客服了重重困难,实现了真正的多任务操作系统。这些是人是当时最理解“代码执行环境”的人,因为是他们营造了好的环境给我们的代码。

分时多任务操作系统一直延续至今,除了我们自己的应用程序之外,越来越多的不为自己“感知”的任务和我同时在竞争着处理器资源。他们的目的是力求将处理器的利用率提高。我们的代码的执行环境不再单纯。你当然可以全然不去理会我所说的概念,继续作你的傻瓜。拿windows举例来说,函数CreateThead为我们创建一个执行线程,当你会写多线程应用程序时,并且能过处理线程间的竞争问题。说明你已经可以意识到“代码执行环境”正在变得复杂,你能够很好的应对他们。我周围99%的程序员都可以达到这个境界。可惜的是他们最多也只能达到这个境界。由于多任务操作系统的良好封装,使他们几乎感觉不到“处理器语言”的存在。别看他们整天都在和硬件打交道,感觉自己在写伟大的驱动程序。你可能要疑问写驱动程序的人水平不是很高么?我告诉你,他们能成功让硬件动起来只是因为他们懂得处理器周围的某种设备的协议,她们懂得如何读写寄存器,仅此而已。如果你懂,那么你也可以到我们公司谋一职。他们从未意识到自己的代码其实在一个非常复杂的环境中执行。

对于我们目前使用的基于WinCE操作系统,如果你想让自己的代码回到DOS年代的单纯环境执行,你可以怎么做?因为WinCE目前尚未支持多核心处理器架构,所以关中断是可以让你回到远古时代的。在关中断之后,你的代码是不可以call某些系统API的,如GetTickCount(),因为多任务操作系统的“心脏”时钟的中断也被你关闭了,你可能会用得到GetTickCount()返回同一个数字。另外你的系统时钟会可能开始不再精确,因为你耽误了太长时间,使时钟中断无法按时处理他们该处理的问题。关闭CPU中断是个比较极端的例子。操作系统编写者尽量会避免使用这样的操作,换而关闭一些子中断。

再举个例子,为什么Sleep总比我们设置的参数等待的时间长?Sleep函数是多任务操作系统中非常非常重要的,它几乎是多任务系统的标志性函数。它的内部实现比我们自己的while循环进行等待要复杂不知多少倍。之所以说它标志,是因为它涉及只有多任务操作系统才有的任务调度的概念。WinCE中默认是1ms的“心脏”跳动间隔,也就是说1s内,WinCE的“心脏”要跳动1000下,想象一下我们的CPU是多么的忙碌。我们的代码就样在1s中之内至少被打扰1000次,再想象一下我们的代码是多么艰难的在向前执行。也就是这样让我们可以一边播放着音乐,一边打游戏。

我上面只是用平时的语言举了些极为简单的例子。在多任务操作系统中,更为正式的讨论,如调度的惊群问题,可重于代码等。

最近多核处理器时代到来,给操作系统的编写着带来了新的挑战。中断发生时分配到那个处理器,CPU中断处理的平衡,EnterCriticalSection函数的实现难度增大等等。还有前面的关中断已经不再可以使我们的代码处于单纯的环境,因为其他的核心也在运行代码。

总之,我们“代码的执行环境”越来越复杂,如果我们对它深刻的理解,对我们coding是非常有利的。是成为高手的必须。就像想成为“网络黑客”不懂unix系统那是不可能一样。

 
test是一种用来验证和确认软件功能和性能的活动。在软件开发过程中,test是一个非常重要的环节,它有助于发现并修复潜在的问题,确保软件的质量和稳定性。 在测试过程中,runtest是一种常用的方法。runtest是指执行测试用例,观察并记录软件在测试过程中的行为和结果。它是通过运行实际的测试代码和输入数据来模拟真实的使用场景,并评估软件的反应和性能。 运行测试的目的是为了确认软件的功能是否按照预期工作,并检查是否存在任何错误或缺陷。通过运行测试,我们可以了解软件在各种情况下的反应,提前识别潜在问题,并验证软件在各种环境和参数设置下的稳定性。 在runtest过程中,我们需要准备好测试环境和相关的测试数据,确保测试的真实性和可靠性。我们还需要编写测试用例,定义输入和预期输出,以便能够有条理地执行和验证软件的功能。 通过runtest,我们可以获取测试结果和日志,并进行分析和比较。如果测试结果与我们的预期相符,那么说明软件在相关方面是正常的。如果测试结果与预期不符,则需要进一步调试和修复错误,并重新运行测试,直到达到我们的期望为止。 总之,runtest是一种重要的测试方法,它可以帮助我们验证软件的功能和性能。通过运行实际的测试用例,我们可以及时发现和修复潜在问题,提高软件的质量和可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值