解说天下之操作系统
解說天下之操作系統(tǒng)
本文由桌案drawon?(https://www.drawon.cn),云晶(https://www.yunjingxz.com)創(chuàng)始人根據(jù)多年從業(yè)經(jīng)驗, 從操作系統(tǒng)的起源,應(yīng)用分類, 設(shè)計分類,以及資源使用角度對操作系統(tǒng)進(jìn)行宏觀的闡述,通過閱讀本篇內(nèi)容,您將大致對操作系統(tǒng)有更系統(tǒng)、更宏觀,更深入的認(rèn)識。我們每個人每天都在高頻次的使用不同的操作系統(tǒng),有必要對操作系統(tǒng)從宏觀,深入淺出的有一個基本的認(rèn)識和了解。
前后臺系統(tǒng)
前后臺系統(tǒng)為操作系統(tǒng)的原古時期。 在沒有操作系統(tǒng)誕生之前,基本計算機(jī)系統(tǒng)就是前后臺系統(tǒng)架構(gòu)模型。
前后臺系統(tǒng)的概念
在沒有操作系統(tǒng)出現(xiàn)之前的系統(tǒng)為前后臺系統(tǒng),比如現(xiàn)在大多數(shù)嵌入式系統(tǒng)中所是用的MCU可以運(yùn)行簡單的C語言程序的單片機(jī)在裸跑的時候,我們認(rèn)為為前后臺系統(tǒng),下面一張圖介紹了前后臺系統(tǒng)的模型:
從圖中,我們可以看到,有如下特點(diǎn)
應(yīng)用程序是一個無限的循環(huán), 一般在主函數(shù)中,會寫一個死循環(huán),這個循環(huán)會有一定的延時,每隔一段時間循環(huán)執(zhí)行一次。 循環(huán)中調(diào)用相應(yīng)的函數(shù),完成相應(yīng)的操作, 這部分可以看成是后臺的行為(background)。無限循環(huán)掃描,就是一個輪詢 。
后臺系統(tǒng),總是會運(yùn)行,(The background is always running)這個Main函數(shù)是不會停止的。
當(dāng)有緊急任務(wù)需要處理時, 則MCU提供一種中斷機(jī)制, 每個中斷向量掛接一個中斷處理函數(shù), 進(jìn)行緊急的處理。這種中斷處理程序的行為,我們稱之為前臺行為(Foreground)。當(dāng)緊急事件發(fā)生時, 中斷處理機(jī)制會立即捕獲它。 而緊急事件,一般都是外部IO觸發(fā), 觸發(fā)行為有高電平變低觸發(fā),低電平變高觸發(fā),還有上升沿或者下降沿觸發(fā)。 還有一種內(nèi)部定時觸發(fā)等。
如下為前后臺系統(tǒng)的變成模型
{void main () {for(;;) {InitSystem();InitUartIsr(OnUartDataReceived);for(;;) {LED0 = ON;DelayMillisecs(500);LED1 = OFF;DelayMillisecs(500);}}} void OnUartDataReceived(byte[] buffer, int count) {// doing something.} }前后臺系統(tǒng)的優(yōu)點(diǎn)
前后臺系統(tǒng)的機(jī)制相對簡單, 對編程人員要求比較低。 只要學(xué)點(diǎn)C語言, 了解點(diǎn)基礎(chǔ)硬件相關(guān)的知識, 就能干點(diǎn)事情,如點(diǎn)亮LED燈。燈。 可以基于單片機(jī)來學(xué)習(xí)前后臺系統(tǒng)。
如下推薦一些單片機(jī)的書籍, 可以借助這些書籍去學(xué)習(xí)前后臺系統(tǒng)。
如下為前后臺系統(tǒng)的優(yōu)點(diǎn):
- 成本低, 一般情況下, 幾毛錢,甚至幾塊錢就能買到一個單片機(jī)。
- 需求量非常大, 只要帶一些簡單的控制邏輯的系統(tǒng),大多數(shù)都采用簡單的MCU, 內(nèi)部運(yùn)行一個前后臺系統(tǒng),如下我們給出一張操作系統(tǒng)的分布金字塔圖。
- 設(shè)計開發(fā)編碼都比較簡單。 一般是由嵌入式工程師完成前后臺系統(tǒng)的開發(fā)與設(shè)計。
前后臺系統(tǒng)的缺點(diǎn)
- 應(yīng)用場景比較簡單, 控制簡單的外圍電腦和簡單的運(yùn)算。 對于大型復(fù)雜的邏輯或者交互,前后臺系統(tǒng)很難勝任。還有一些比較厲害的高人, 使用前后臺系統(tǒng)可以完成操作系統(tǒng)能夠完成的任務(wù),甚至操作系統(tǒng)都難以完成的事情(小才大用)。
- 資源很難系統(tǒng)的調(diào)度,原地轉(zhuǎn)圈圈前后臺系統(tǒng)的CPU 一直都很忙,資源很難系統(tǒng)調(diào)度。
- 開發(fā)系統(tǒng)時,代碼的耦合度較高,你中有我,我中有你。前后臺系統(tǒng)中,每為一個系統(tǒng)添加一個軟件模塊,都可能影響到之前的功能。所以如果要把前后臺系統(tǒng)的系統(tǒng)玩好,一定得做到統(tǒng)領(lǐng)全局, 了解到別人的程序邏輯。
操作系統(tǒng)
基本概念
控制和管理計算機(jī)系統(tǒng)內(nèi)部各種硬件和軟件資源、有效的組織多道程序運(yùn)行的系統(tǒng)軟件(或程序集合),是用戶與計算機(jī)之間的接口。
下面分享上面上,主流的操作系統(tǒng)
Windows操作系統(tǒng)
MAC OS 操作系統(tǒng)
Chome OS 操作系統(tǒng)
移動端的IOS, Android ,Windows Phone(過去式)
操作系統(tǒng),決定了系統(tǒng)的交互方式,以及生態(tài),每個人,都有自己喜歡的操作系統(tǒng)。
操作系統(tǒng)分類
按照家族分類
如下為Unic的家族史:
從上圖可以看到, Unix(Unics)實(shí)際上是大部分操作系統(tǒng)的祖先。 很多操作系統(tǒng)都是從Unix演變而來。
Unix家族演進(jìn)圖
從上圖可以看出:
- 目前非常著名的蘋果公司的PC領(lǐng)域的操作系統(tǒng)MAC OS以及移動端操作系統(tǒng)IOS均是由Unix系統(tǒng)改寫而來。
- 谷歌的Android操作系統(tǒng),ChromeOS 均是由Linux系統(tǒng)修改而來。
- Ubuntu 更是Linux系統(tǒng)的社區(qū)開源版本。
- 還有在車載系統(tǒng)中,號稱是實(shí)現(xiàn)很強(qiáng)的微內(nèi)核系統(tǒng) QNX均來自Unix系統(tǒng)。
按照內(nèi)核類型分類
微內(nèi)核/宏內(nèi)核的概念
操作系統(tǒng)最核心的功能,任務(wù)調(diào)度、內(nèi)存和設(shè)備的抽象和管理。然后 ,為了我們方便使用,才集成進(jìn)了系統(tǒng)服務(wù)、驅(qū)動程序、文件系統(tǒng)之類的東西。
我們平時運(yùn)行的程序,每個程序各運(yùn)行幾十毫秒,大家來回輪換,這樣子我們看起來這些程序好像在“同時”運(yùn)行一樣。應(yīng)用程序之所以能夠被操作系統(tǒng)通過時間片的方式調(diào)度,是因為對于CPU而言,普通的應(yīng)用程序和操作系統(tǒng)的內(nèi)核運(yùn)行在不同的特權(quán)級別上,我們叫作rings。應(yīng)用程序運(yùn)行在Ring 3,而內(nèi)核運(yùn)行在Ring 0。
隨著科技的發(fā)展,操作系統(tǒng)變得越來越復(fù)雜,內(nèi)核里面的東西也越來越多。人們也就開始考慮是否應(yīng)該改變原有的架構(gòu),從而提高操作系統(tǒng)的性能和穩(wěn)定性,主要是精簡內(nèi)核降低開發(fā)的復(fù)雜度,還有就是把各種程序盡可能的隔離,保證一個程序的崩潰不會牽連到其他的程序。
上世紀(jì)80年代人們討論得火熱的微內(nèi)核就是這樣一種架構(gòu)。
幾種內(nèi)核架構(gòu)
理論設(shè)計,放到現(xiàn)實(shí)的工程中都是要做折衷的。所以有混合內(nèi)核的出現(xiàn),綜合宏內(nèi)核和微內(nèi)核的不同優(yōu)點(diǎn),在兩個方案中折衷設(shè)計。OS X和Windows就屬于這類。
微內(nèi)核的優(yōu)勢
微內(nèi)核考慮在操作系統(tǒng)的內(nèi)核中保留操作系統(tǒng)最基本的功能,也就是任務(wù)調(diào)度、內(nèi)存和設(shè)備的抽象和管理。其他的功能全部從內(nèi)核移出,放到用戶態(tài)中了實(shí)現(xiàn),并以C/S模式對其他應(yīng)用程序提供服務(wù)。
微內(nèi)核帶來的好處主要是穩(wěn)定性和實(shí)時性,即內(nèi)核中模塊數(shù)量少了,結(jié)構(gòu)更精簡更優(yōu)化了,能夠影響內(nèi)核的程序和驅(qū)動也減少了,穩(wěn)定性隨之提高;另外就是實(shí)時性,內(nèi)核精簡了以后,響應(yīng)的時延的減小。不過并不是精簡了以后會使得性能提升,微內(nèi)核使得內(nèi)核中只有最關(guān)鍵的部分,其他模塊和系統(tǒng)功能全部作為獨(dú)立模塊放到用戶態(tài)空間中運(yùn)行,功能分散了以后增加了通信的成本。不過微內(nèi)核操作系統(tǒng)的特點(diǎn)尤其適合工控系統(tǒng)的控制,而且設(shè)計簡單,在小型的系統(tǒng)中有不少的應(yīng)用。另外亦有不少實(shí)時操作系統(tǒng)是使用微內(nèi)核架構(gòu)設(shè)計。
總結(jié)幾句
-
Worse is better.
- 計算機(jī)領(lǐng)域往往經(jīng)過完善設(shè)計的產(chǎn)品,最終結(jié)果都是失敗的。
- 像Unix贏了Multics一樣。
- Lisp(通用高級計算機(jī)程序語言)并沒有C語言流行。
- OSI的愿景最后由TCP/IP協(xié)議完成。
- 相信,國內(nèi)號稱真正的云上操作系統(tǒng),最終是由云晶-新一代云上操作系統(tǒng)來完成(開玩笑)。
- 微軟的WPF, 把MVVM設(shè)計模式運(yùn)用的淋漓盡致,設(shè)計的如此純粹,并沒有流行起來。
......
-
宏內(nèi)核就是一座華麗的宮殿。
-
微內(nèi)核就是一座精致的小別墅。
Linux為什么不采用微內(nèi)核或者混合內(nèi)核模式?
理論上完美的問題在實(shí)踐過程中都會遇到各種不得不妥協(xié)的折衷。因為你制造出的東西是要部署到實(shí)際生活生產(chǎn)環(huán)境中使用。不是要一個只在實(shí)驗室中看起來很完美的作品。微內(nèi)核的高度模塊化,自然要付出成本的,那就是增加代碼交互的冗余與效率的損耗, 而這恰恰是很大的問題。
Linus可以把這些亂七八糟的東西,全都一個人寫了,一遍寫對了,還能穩(wěn)定跑起來,無bug,而我們這些渣渣,做不到,只能依靠保護(hù)模式來防止幾百個工程師寫出來的那一坨垃圾,動不動藍(lán)屏,自己弱,卻質(zhì)疑天才的做法,和明知自己弱,還要模仿天才的做法,都是認(rèn)不清現(xiàn)實(shí)的表現(xiàn)。
Linux本身在實(shí)現(xiàn)之初僅僅作為Linus一個業(yè)余項目而存在。而Monolithic Kernel由于不需要處理消息隊列等等原因從實(shí)現(xiàn)角度來說比Micro Kernel更為方便。
linus 這人對微內(nèi)核不感興趣,這個大家都知道,只要有他在一天,kernel就不會考慮微內(nèi)核化。他是一名實(shí)用主義者, 他說過一句名言:Talk is cheap. Show me the code。
Linus: "Gaah. Guys, this whole ARM thing is a fcking pain in the ass.” 推動了DeviceTree.(題外話,*霸氣)。這就是Linus這個人的張揚(yáng)與灑脫的一面。 仔細(xì)體會。
按照實(shí)時性分類
按照實(shí)時性,將操作系統(tǒng)分為硬實(shí)時和軟實(shí)時。 那么什么優(yōu)勢硬實(shí)時和軟實(shí)時,其實(shí)就是通過中斷的響應(yīng)時間來衡量的。
衡量實(shí)時性的標(biāo)準(zhǔn):
-
中斷的相應(yīng)時間。
中斷的相應(yīng)時間==關(guān)中斷的最長時間+保護(hù)CPU 內(nèi)部寄存器的時間+進(jìn)入中斷服務(wù)函數(shù)的執(zhí)行時間+開始執(zhí)行中斷服務(wù)例程(ISR)的第一條指令時間
-
任務(wù)的切換時間, 就是從當(dāng)前任務(wù)掛起,到要切換的任務(wù)開始運(yùn)行的時間。
-
一個硬實(shí)時操作系統(tǒng)面對變化的負(fù)載(從最小到最壞的情況)時,必須確定性地保證滿足時間要求。跟CPU強(qiáng)悍無關(guān),必須時間具有確定性。
-
實(shí)時操作系統(tǒng)的代表
- Linux為實(shí)時操作系統(tǒng)的代表
- Vxworks(Wind River)為硬實(shí)時操作系統(tǒng)的代表。
以下表中,該處了實(shí)時操作系統(tǒng)的實(shí)時性對比
WxWorksuCOS-IIRT-Linux2QNX6MACosXWindowsLinux-GP 硬件平臺 MC68000 33MHz-486 60MHz-486 33MHz-486 任務(wù)切換 3.8us < 9us 不詳 12.57us 中斷響應(yīng) < 3us < 7.5us 25us 7.54us
操作系統(tǒng)中與編程有關(guān)的基本知識
進(jìn)程線程的基本概念
- 并發(fā)和隔離。
- 程序執(zhí)行的上下文(Context of Execution)
- 執(zhí)行與調(diào)度的基本單位:thread
- 資源所有權(quán):process
- 進(jìn)程是資源的容器,包含(一個或)多個線程。 內(nèi)核調(diào)度的基本單位是線程(不完全是)、而非進(jìn)程。
- 同一進(jìn)程下的各個線程共享資源(address space、open files、signal handlers,etc),但寄存器、棧、PC指針等不共享。
進(jìn)程和線程到底有什么區(qū)別? 以上其實(shí)已經(jīng)說了一部分, 線程是調(diào)度和執(zhí)行的基本單位,最終代碼都在線程中執(zhí)行。 而進(jìn)程是資源的容器,包括一個或多個線程。 同一個進(jìn)程下的各個線程共享資源。
如下圖為區(qū)別:
Linux的線程進(jìn)程概念
Linux的線程是用戶級別的,也就是內(nèi)核中不存在線程。
- 所有的線程管理都在應(yīng)用層去執(zhí)行。
- 內(nèi)核不關(guān)心,實(shí)際上也覺察不到線程的存在。
Windows的線程進(jìn)程概念
而從上圖也可以看出,Windows和Linux顯然采用不同的理念。
windows的線程是內(nèi)核級別的。
- Windows是這些概念的一個例子。
- 內(nèi)核維護(hù)著線程和進(jìn)程的上下文。
- 調(diào)度實(shí)際上是基于線程而運(yùn)行的。
進(jìn)程間的通信
有了線程,進(jìn)程的隔離, 就需要線程進(jìn)程之間的通信機(jī)制來保證協(xié)作完成任務(wù),共享訪問數(shù)據(jù)。
Windows進(jìn)程間的通信
- 文件映射
- 共享內(nèi)存
- 匿名管道(單項,一端寫,一端讀)
- 命名管道。
- 動態(tài)鏈接庫
- 遠(yuǎn)程過程調(diào)用(可以在一臺機(jī)器內(nèi),也可以跨機(jī)器)
- UDS(Unix Domain Socket)
- 基于Windows的消息機(jī)制 ……
Linux進(jìn)程間的通信
- 管道(Pipe),以及有名管道
- 信號(Signal)
- 報文(Message)隊列(消息隊列)
- 共享內(nèi)存(效率最高)
- 信號量(Semaphore)
- 主要作用是進(jìn)程間,以及同一進(jìn)程的不同線程之間的同步手段 (UDS)Socket 套接字
以上Window和Linux雖然采用了不同的方式,概念上有所不同的方式進(jìn)行進(jìn)程間的通信,實(shí)際上,他們的基本原理類似。
線程間的通信
- 共享數(shù)據(jù)結(jié)構(gòu)。共享內(nèi)存
- 事件(Event)傳遞
- 消息隊列
- 郵箱(ucosII)
線程同步
線程同步,即當(dāng)有一個線程在對內(nèi)存或者外設(shè)進(jìn)行操作時,其他線程都不可以對這個內(nèi)存地址或者外設(shè)進(jìn)行操作,直到該線程完成操作, 其他線程才可以進(jìn)行操作,而其他線程又處于等待狀態(tài),實(shí)現(xiàn)線程同步的方法有很多,如下。
- 一般使用信號量(Semaphore)。
- 高級語言如java 本身語言的設(shè)計 就為此考慮,如synchronized 關(guān)鍵字,wait, notify 方法。
- 可以使用Mutex。
- 臨界區(qū)對象。
信號量與互斥鎖
Semaphore(信號量,或者信號燈)
以一個停車場的運(yùn)作為例。簡單起見,假設(shè)停車場只有三個車位,一開始三個車位都是空的。這時如果同時來了五輛車,看門人允許其中三輛直接進(jìn)入,然后放下車攔,剩下的車則必須在入口等待,此后來的車也都不得不在入口處等待。這時,有一輛車離開停車場,看門人得知后,打開車攔,放入外面的一輛進(jìn)去,如果又離開兩輛,則又可以放入兩輛,如此往復(fù)。在微觀世界里,計算機(jī)世界里,比如訪問硬盤空間,讀取數(shù)據(jù),往往資源有限。 可以可以使用該機(jī)制,進(jìn)行有效的對資源的訪問進(jìn)行協(xié)調(diào)控制。
Mutex(互斥鎖)
一次只能有一個線程進(jìn)入的特殊信號量。性能會比信號量好。對于某些特殊的應(yīng)用場景, 一次只能有一個線程訪問,待該線程退出后,其他線程方可繼續(xù)運(yùn)行。 例如操作系統(tǒng)的IO外設(shè),打印機(jī),現(xiàn)實(shí)生活當(dāng)中的公共衛(wèi)生間等等。
總結(jié)
- 上一篇: xml解析之dom、dom4j、SAX
- 下一篇: 求图像边界点坐标c语言,三、Window