“代碼執行環境”淺談

來源:互聯網
上載者:User
“代碼執行環境”不知道有沒有這個專有名詞。工作的經曆讓我感到這個概念需要攤出來好好說說。它是衡量你coding水平的重要指標。從電腦發明到現在,人們一直在努力使更多的人“不理解”這個概念,於是軟體中的層級概念就隨之產生了。核心,驅動,應用程式等的3個等級的大致的劃分,也基本劃分出了3種類型的程式員。作業系統的著作者更是竭力在營造一個好的“環境”給我們的代碼。我們---“普通的程式員”則越來越傻。其實可以這樣說,“代碼執行環境”的深刻理解,是你有資格成為“高手”的必要條件。當代的多任務作業系統使我們這群傻瓜對“代碼執行環境”的理解已經添加了很大的難度,可是當我們還沒來的急仔細學習它時,“多核心處理器”又誕生了,使我們的代碼可以真正的“並存執行”,我們的代碼的“執行環境”就這樣一步步複雜一下去,我們永遠來不急學習它,我們將永遠的傻瓜下去。

你甘心嗎?答案當然是否定的。

這個概念就從大家熟悉的DOS開始說起,在DOS之前的沒有作業系統的年代,我們的代碼都在一個純淨的環境的執行,My Code是這個處理器的山大王,整個處理器的資源都歸我們所有,代碼不會被打擾。(在“中斷”出現在處理器中之前,我想這個“執行環境”更加純潔)。這個時期我們只要懂“處理器語言”就可以編程了,因此當時有著最為簡單的“代碼執行環境”。如今還是有很多人做著類似的工作,如單片機的編程等。我們公司做嵌入式多任務作業系統的驅動程式,我面試時一般不會選擇在單片機編程有多年經驗的人,除非他有出人的表現。因為我認為這樣的人,多年禁錮在這樣單純的環境中編程,思維會跟不上我們公司的發展。周圍同事中的一些例子也證明了我的想法。

在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系統那是不可能一樣。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.