安卓從入門到進階第三章(作業系統)

image
很多人在學習安卓的過程裡,總會覺得不知如何下手。究其原因,大多數因為不懂底層原理,很多從上層應用過來,聽過框架,但也不知到底這個範圍怎麼界定。這一節,我們來說說作業系統。
乍一聽好唬人,竟然想把作業系統講透。實話來說,這裡面要追細節,必然沒完沒了。於是,這節通過一種思維,將這些理論知識儘量清晰的講給大家。
這裡我再次丟擲幾個詞語。硬體-驅動-軟體。這裡我們用螢幕來舉例,做過微控制器的朋友很容易就能理解這三個的關係,我們再來看下這個過程。
拿到一個屏,直接是不能按照你的要求顯示。它需要做幾個事情,才能讓它正常工作。
主要有,把它連線到一個板子上。
然後要做的事,給屏安個開關,寫一個開關方法,寫一個讀寫某一位置的點亮情況,如果是多彩的,讀寫一個位置的顏色值。
寫完這個,我們再實現一些封裝。可以畫一條線,畫一條漸變的線條,畫個正方行,畫個圓,橢圓,扇形。
再繼續一層,可以畫個點陣字,支援國標碼的文字顯示。
再繼續一層,可以解析ttf字型檔,畫個向量字。
然後我們用這個東西,寫了個hello world!在螢幕上。
現在我們來拆解前面的資訊:
硬體部分:
把它連線到一個板子上
驅動部分:
給屏安個開關,寫一個開關方法,寫一個讀寫某一位置的點亮情況,如果是多彩的,讀寫一個位置的顏色值。
驅動層封裝:(SDK)
可以畫一條線,畫一條漸變的線條,畫個正方行,畫個圓,橢圓,扇形。
繼續封裝:(SDK)
可以畫個點陣字,支援國標碼的文字顯示。
可以解析ttf字型檔,畫個向量字。
軟體應用:
寫了個hello world!在螢幕上。
總結起來就是三部分 硬體--驅動--(二次封裝SDK)--軟體
這裡再感覺一個小板子,讓大家對板子有個概念。
一個手機系統,或者別的板子系統,主要有這幾個部分, 外設****--CPU--應用。 這裡簡單化,主要想說的是,我們的整體,都不過是 輸入--控制--輸出。
在剛開始的51微控制器,因為本身ROM,RAM比較小,功能也比較簡單,主要是做類似溫度檢測,然後LED顯示,或者加上報警,振動之類的。
所以基本不要作業系統介入,就是很簡單的上電之後,進入一個死迴圈。類似如下這種:
while(1)
{
int ret= getEvent (&evt)//獲取訊息
switch( evt.Type )
{
case XXX:
break;
}
wirteWatchDog(0);
}
然後這個在執行的時候,我們這裡 getEvent 可以是死等狀態,當然如果有看門狗,那麼就不能死等,要往下走,讓走到 wirteWatchDog 裡面,進行對某個位置寫入固定的值,系統會判定這裡的值,如果固定時間內,沒有進行寫值,則認為系統跑飛。而系統怎麼會跑飛呢?因為器件會老化,或者外部環境過熱,過冷,會導致器件出故障,這時候系統判定跑飛,讓系統重啟,進行恢復。
這裡我們引用一個網路對於看門狗的描述:
看門狗是用來防止萬一微控制器程式出錯造成重大損失的。防錯的原理很簡單,它在硬體上就是一個定時器,當它溢位的時候就會讓微控制器強制復位使程式重新開始執行。正常的情況下是不能讓它溢位的,所以在程式上每隔一段時間要給他置一次值(俗稱喂狗),只要程式中正常給它喂他就不會溢位。一旦程式跑飛了,有干擾或者進入死迴圈之類的情況時,不能正常執行程式了,那麼就永遠執行不到喂狗的指令了,但此時定時器是硬體控制的,仍然會走,所以溢位了,微控制器就復位了。一般安全性要求比較高的,系統跑飛了會造成重大事故的都會加一個“狗”保安全。通常,看門狗的溢位時間越短越靈敏,跑飛之後復位的時間越短,也就越安全,但是,你喂狗的操作也要更頻繁。
過了51微控制器,就進入了比較複雜的Arm嵌入式,這個時候RAM已經比較大了,系統也比較複雜,所以需要多個任務併發,來協同完成。
μC/OS-****II****FreeRTOS****ucLinux是在這個場景中,使用最廣泛的作業系統。當時的作業系統,沒有那麼複雜,同時也是使用的任務稱呼,可以對應linux中的執行緒了。
在開始講這些的時候,我想通過一些好玩的故事,來理解這些東西。
故事一:
有個單間澡堂,一次只能進入一個人,如果裡面有人,外面的就必須等著,等他洗完了,下一個人才能進去洗澡。
這裡我們把澡堂看成CPU,把人當做指令,那麼上面的話就是:
有個單CPU,一次只能執行一條指令,如果當前正在執行指令,後續的指令就只能等著,等它執行完了,下一條指令才能進去執行。
故事二:
這時候如果來了一個惡霸,要進行洗澡。我們假設裡面的人,聽不見外面的吵鬧,繼續忘我的洗澡。所以,惡霸能夠洗上澡的話,最快也是要等這個人洗完出來。
這裡我們把惡霸當做中斷的話,那麼上面的話就是:
這時候如果來了一箇中斷,要進行執行。中斷能夠執行,最快也是要等這條指令執行完。
於是,我們總結便是,CPU按照一條條指令執行,當有中斷來的時候,要等待這條指令執行完,CPU這時候掃描下中斷線,有中斷,則處理中斷任務。
故事三:
我們翻過之前的故事。然後再來一個故事。故事的主角還是澡堂。
話說村子裡有個老頭,開了個澡堂子,兩口子一直經營著,收益非常好。於是兩人喜形於色,上天也眷顧,覺得這麼多錢需要人花,老兩口就生了個雙胞胎。
雙胞胎長大之後,發現了澡堂的暴利,於是兩人都想佔為己有。一天為了這個打得不可開交。老頭回來一看,這可不行啊,於是想了個法子。
老頭子說兩個兄弟可以同時賣票,但是每個買完票的人,就在門口排隊,洗完澡的出來,然後排隊在前面的人便可以進去洗澡,如此就解決了。
這裡老頭子假定為作業系統,兩兒子就是兩個程序,排隊就可以認為是通訊機制,這裡成為佇列,澡堂子就是資源。
於是,我們總結便是,作業系統生成了兩個程序,兩個程序都在訪問一個資源,於是就發生了搶佔的事情,解決的思路就是作業系統實現一些機制,保證程序之間按照順序執行,也就有了程序間通訊。
故事四:
事情總會有意外,老頭子在把手,如果兩邊來的人,同時搶一個位置,互不相讓。都說下一個是他,該如何解決呢。
我們在第一個故事裡面知道,單核CPU只能一條條指令執行,如果有人想打斷,必須等到這條指令結束後,進行處理。
那麼我們繼續這個故事。兩個人互不相讓,糾纏不清的時候,老人說,有個方法,既然你們爭持不下,那麼我這邊配置了一個鎖子,這個鎖子非常神奇,你們兩個必然不能同時拿到,並且只要一個拿到後,下一個必然就拿不到了。拿到的就是先來的,沒拿到的自然在後面排序。
在你認為兩人同時到的時候,老人只管一個個執行,於是,老人在一瞬間,只會看到一個人來,而看到後他就交給了這個人,後面的人自然就要排在後面了。