打印
[STM32F0]

【转】“代码执行环境”浅谈

[复制链接]
586|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
TXQDM|  楼主 | 2016-12-3 23:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
“代码执行环境”不知道有没有这个专有名词。工作的经历让我感到这个概念需要摊出来好好说说。它是衡量你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系统那是不可能一样。


发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

110

主题

593

帖子

11

粉丝