講起操作系統(tǒng)焰薄,想必現(xiàn)代人都不陌生拿诸,特別是移動(dòng)通信這么發(fā)達(dá)的今天,每個(gè)人每天都要刷幾個(gè)小時(shí)的手機(jī)塞茅,與其說(shuō)使用手機(jī)亩码,不如說(shuō)手機(jī)陪伴你野瘦,這些手機(jī)使用這么流暢描沟,應(yīng)用這么豐富,這背后的功勞離不開(kāi)一個(gè)底層基礎(chǔ)軟件的功勞鞭光,那就是手機(jī)的操作系統(tǒng)席覆。
手機(jī)可以簡(jiǎn)單拆分為兩個(gè)部分:硬件+軟件。硬件是軟件的基石方库,所有的軟件功能最終都是由硬件來(lái)實(shí)現(xiàn),這是因?yàn)檐浖羌軜?gòu)在硬件之上垃环,然后逐層不斷抽象堆疊起來(lái)的劲赠。如果剝離軟件凛澎,讓一個(gè)使用者使用硬件,你會(huì)發(fā)現(xiàn)相當(dāng)?shù)耐纯嘌渡停枰私獠煌布氖褂梅绞绞妫⑶伊私饷總€(gè)硬件的特點(diǎn)磕谅,簡(jiǎn)單來(lái)說(shuō)怜庸,沒(méi)有了軟件割疾,硬件就是一堆破銅爛鐵拓诸。從中,我們也可以看到操作系統(tǒng)的重要性奠支。
馮.諾依曼結(jié)構(gòu)
無(wú)論是我們所熟知的PC機(jī),還是手機(jī)叉抡,還是其他能成為計(jì)算機(jī)的設(shè)備季春,無(wú)不遵循著馮.諾依曼計(jì)算機(jī)體系,可見(jiàn)馮.諾依曼是多么偉大的計(jì)算機(jī)科學(xué)家,它在1945年發(fā)表了一篇關(guān)于EDVAC(Electronic Discrete variable Automatic Computer宇攻,電子離散變量自動(dòng)計(jì)算機(jī))的論文亲桥。
就在這篇文章中提出了對(duì)于計(jì)算機(jī)領(lǐng)域產(chǎn)生深遠(yuǎn)影響的兩個(gè)觀點(diǎn):
1,采用二進(jìn)制番枚,拋棄十進(jìn)制
2,程序存儲(chǔ)
二進(jìn)制極大簡(jiǎn)化了計(jì)算機(jī)設(shè)備的邏輯線路拗馒,程序能存儲(chǔ)堤尾,程序指令和數(shù)據(jù)都存儲(chǔ)在同一個(gè)內(nèi)存儲(chǔ)器中,除了存儲(chǔ)器剩蟀,還有運(yùn)算器、控制器丙号、輸入輸出設(shè)備的先朦,我畫(huà)了簡(jiǎn)單的示意圖,如下:
從中可以看到犬缨,一個(gè)計(jì)算機(jī)基本包含這幾個(gè)部分:CPU(中央處理器)赤赊、內(nèi)存儲(chǔ)器滨达、輸入輸出設(shè)備(I/O設(shè)備)。
什么是操作系統(tǒng)
計(jì)算機(jī)發(fā)展到今天,市面上可選擇的操作系統(tǒng)已經(jīng)很多了盼铁,如果分類的話有:桌面型操作系統(tǒng)、服務(wù)器操作系統(tǒng)练链、嵌入式操作系統(tǒng)携丁。我們使用的手機(jī)可以理解為嵌入式操作系統(tǒng),常見(jiàn)的有Android系統(tǒng)和IOS系統(tǒng)焚碌,我們?nèi)粘^k公用的電腦可以理解為桌面型操作系統(tǒng)畦攘,比如常見(jiàn)的Windows系統(tǒng)、Mac系統(tǒng)十电,而服務(wù)器操作系統(tǒng)更多選擇Linux系列知押。
操作系統(tǒng)提供了可用的人機(jī)交互界面,比如打開(kāi)手機(jī)鹃骂,就能四處點(diǎn)點(diǎn)台盯,這里滑一滑,沒(méi)有用戶使用學(xué)習(xí)成本畏线,上手就可操作静盅,這些都得益于操作系統(tǒng)預(yù)裝的各種人機(jī)交互程序。出了有整體封裝的人機(jī)交互界面接口之外象踊,還有OS生態(tài)圈這個(gè)關(guān)鍵點(diǎn)温亲,比如整體第三方應(yīng)用程序豐富多彩棚壁,這也是一個(gè)成功的操作系統(tǒng)能夠流行普及的主要原因。
因此栈虚,操作系統(tǒng)肩負(fù)兩個(gè)重大責(zé)任:面向下層-管理硬件袖外,各種硬件設(shè)備集中調(diào)度,面向上層-提供各種友好的人機(jī)交互界面魂务,為第三方程序研發(fā)提供便捷曼验、可靠、高效的API接口功能粘姜。
所以簡(jiǎn)單來(lái)說(shuō)鬓照,計(jì)算機(jī)操作系統(tǒng)是負(fù)責(zé)管理系統(tǒng)硬件,并為上層應(yīng)用提供穩(wěn)定編程接口和人機(jī)交互界面的軟件集合孤紧。
進(jìn)程間通信
我們知道操作系統(tǒng)中的各個(gè)進(jìn)程通常運(yùn)行與獨(dú)立的內(nèi)存空間豺裆,并且有嚴(yán)格的機(jī)制來(lái)防止進(jìn)程間的非法訪問(wèn)。比如我們熟知的Android系統(tǒng)号显,每個(gè)應(yīng)用如果需要使用系統(tǒng)的私有數(shù)據(jù)臭猜,就需要向操作系統(tǒng)申請(qǐng),也就是說(shuō)要聲明使用哪些權(quán)限押蚤,操作系統(tǒng)才允許應(yīng)用具體使用蔑歌,這也是每個(gè)Android應(yīng)用在進(jìn)程沙盒運(yùn)行,也是Android系統(tǒng)安全架構(gòu)的出發(fā)點(diǎn)揽碘。
雖說(shuō)每個(gè)進(jìn)程是獨(dú)立運(yùn)行次屠,但不代表進(jìn)程與進(jìn)程之間不允許互相通信,反而恰恰相反雳刺,現(xiàn)實(shí)很多軟件產(chǎn)品需要多進(jìn)程協(xié)作才能使用流暢劫灶,進(jìn)程間通信(Inter-process communication,IPC)是操作系統(tǒng)中一個(gè)重要的概念煞烫,應(yīng)用非常廣泛浑此。
那么常見(jiàn)的IPC機(jī)制有哪些呢。如下:
- 共享內(nèi)存滞详。由于兩個(gè)進(jìn)程可以直接共享訪問(wèn)同一內(nèi)存區(qū)域凛俱,減少了數(shù)據(jù)的復(fù)制操作,因而速度上的優(yōu)勢(shì)比較明顯料饥。比如在Linux中可以通過(guò)shmget函數(shù)來(lái)實(shí)現(xiàn)創(chuàng)建內(nèi)存共享區(qū)蒲犬,這里會(huì)生成共享內(nèi)存塊與某個(gè)特定的key進(jìn)行綁定,用shmat函數(shù)來(lái)實(shí)現(xiàn)進(jìn)程映射岸啡,其他進(jìn)程然后利用key值來(lái)映射自己的內(nèi)存空間原叮。
- 管道。管道很形象的描述了通信雙方的行為,即進(jìn)程A與進(jìn)程B奋隶,管道一般是單雙工通信擂送,如果需要既要“讀”和“寫”的話,需要建立兩個(gè)管道唯欣。同時(shí)管道有容量限制嘹吨,讀為空的時(shí)候,需要阻塞境氢,等待有可讀內(nèi)容過(guò)來(lái)蟀拷,寫滿的時(shí)候,需要阻塞萍聊,等到繼續(xù)可寫入的時(shí)候问芬,再寫。
- Socket寿桨。這個(gè)更多應(yīng)用于網(wǎng)絡(luò)通信此衅,基于TCP/IP協(xié)議,有客戶端和服務(wù)端兩種角色亭螟,服務(wù)端負(fù)責(zé)監(jiān)聽(tīng)I(yíng)PC請(qǐng)求炕柔,客戶端發(fā)起IPC請(qǐng)求,雙方建立起IPC連接媒佣。
- RPC。這個(gè)一般應(yīng)用于通信雙方運(yùn)行在不同的機(jī)器上陵刹,對(duì)于上層調(diào)用人員來(lái)說(shuō)不需要特別關(guān)心具體的中間傳輸過(guò)程是如何實(shí)現(xiàn)的默伍,這種“透明性”可以較大程度地降低研發(fā)難度。
同步機(jī)制
我們經(jīng)常會(huì)聽(tīng)到資源鎖同步衰琐,因?yàn)樵诂F(xiàn)代操作系統(tǒng)中一個(gè)任務(wù)完成不僅僅是單線程執(zhí)行到底的也糊,而往往是需要多線程協(xié)同執(zhí)行,這里面如何保證系統(tǒng)資源同步就顯得至關(guān)重要了羡宙。
從嚴(yán)格意義來(lái)說(shuō)狸剃,如果多個(gè)進(jìn)程間存在時(shí)序關(guān)系,需要協(xié)同工作完成一個(gè)任務(wù)狗热,則稱為同步钞馁。如果資源具有排他性,那么此時(shí)的關(guān)系可以稱為互斥匿刮。那么常見(jiàn)的同步機(jī)制有哪些呢僧凰?如下:
- 信號(hào)量(Semaphore)。Semaphore S熟丸,Operation P也叫wait()训措,Operation V也叫signal()。其中S表示共享資源的可用數(shù)量,P可以減小S計(jì)數(shù)绩鸣,V則增加它的計(jì)數(shù)怀大。比如進(jìn)去共享區(qū)時(shí),首先執(zhí)行P操作呀闻,同理化借,要退出共享區(qū)時(shí),執(zhí)行V操作总珠。其中PV操作是具有原子性屏鳍,意味著它們?cè)趫?zhí)行過(guò)程中是不允許被中斷的。
- Mutex局服,又稱為互斥體钓瞭。Mutex通常是對(duì)某一排他性資源共享控制,要么資源被占用淫奔,要么就是可以訪問(wèn)山涡。
- 管程。是可以被多個(gè)進(jìn)程安全訪問(wèn)的對(duì)象唆迁,也就是在同一時(shí)刻只允許有一個(gè)訪問(wèn)者使用它們鸭丛,還具有安全性、互斥性唐责、共享性鳞溉。
內(nèi)存管理
不管是什么操作系統(tǒng),內(nèi)存管理都是絕對(duì)的重點(diǎn)鼠哥∈旆疲可以說(shuō)操作系統(tǒng)運(yùn)行基本都是玩內(nèi)存的游戲,比如虛擬內(nèi)存朴恳、內(nèi)存分配與回收抄罕、內(nèi)存保護(hù)等。
1于颖,虛擬內(nèi)存呆贿。
虛擬內(nèi)存的出現(xiàn)主要為了解決大體積程序的問(wèn)題。它將外部存儲(chǔ)器部分空間作為內(nèi)存的擴(kuò)展森渐,比如從硬盤劃分出4G大小做入,當(dāng)內(nèi)存資源不足時(shí),系統(tǒng)將按照一定算法自動(dòng)挑選優(yōu)先級(jí)低的數(shù)據(jù)塊章母,并且將它們存儲(chǔ)在硬盤中母蛛,后續(xù)如果用到這些數(shù)據(jù)庫(kù),系統(tǒng)將產(chǎn)生“缺頁(yè)”指令乳怎,然后把它們交換到內(nèi)存中彩郊,這些操作都是系統(tǒng)內(nèi)核自動(dòng)完成的前弯,對(duì)于上層來(lái)說(shuō)是完全透明的。
2秫逝,內(nèi)存分配與回收恕出。對(duì)于應(yīng)用程序來(lái)說(shuō),內(nèi)存的分配和回收是它們最關(guān)心的违帆,一般核心問(wèn)題是要保證硬件無(wú)關(guān)性浙巫、動(dòng)態(tài)分配內(nèi)存和回收、內(nèi)存碎片刷后。比如在Linux系統(tǒng)中常見(jiàn)的mmap()函數(shù)的畴,可以將某個(gè)設(shè)備或文件映射到英語(yǔ)進(jìn)程的內(nèi)存空間中,這樣訪問(wèn)內(nèi)存就相當(dāng)于對(duì)設(shè)備或文件進(jìn)行讀寫尝胆,而不需要通過(guò)read()丧裁、write(),同時(shí)通過(guò)mmap函數(shù)含衔,因?yàn)橛成渫粔K物理內(nèi)存來(lái)共享內(nèi)存煎娇,也減少了數(shù)據(jù)復(fù)制的次數(shù),在一定程度上提高進(jìn)程間通信的效率贪染。
小結(jié)
我們從馮.諾依曼計(jì)算機(jī)體系開(kāi)始缓呛,強(qiáng)調(diào)了操作系統(tǒng)的重要的幾個(gè)特性,進(jìn)程間通信機(jī)制杭隙、同步機(jī)制哟绊、內(nèi)存管理機(jī)制,從這幾個(gè)點(diǎn)切入痰憎,才能逐步去了解操作系統(tǒng)的面紗匿情。同樣,對(duì)于所處的上層開(kāi)發(fā)來(lái)說(shuō)信殊,在日常工作中經(jīng)常會(huì)碰到相關(guān)應(yīng)用程序的性能問(wèn)題,其實(shí)很多性能問(wèn)題基本都涉及進(jìn)程和同步概念汁果,內(nèi)存管理問(wèn)題涡拘,如果進(jìn)一步了解操作系統(tǒng)的特性,那么對(duì)于解決性能類問(wèn)題其實(shí)是如虎添翼据德。