前沿拓展:
導讀:這一篇聊**作系統(tǒng)。最近大家對“卡脖子”討論很多,首當其沖是芯片,緊接著就是**作系統(tǒng)。**作系統(tǒng),英文名Operating System,所以也常簡稱“OS”。**作系統(tǒng)很重要,計算機系的學生都知道,**作系統(tǒng)作為一門核心專業(yè)課,和數(shù)據(jù)庫、編譯原理合稱“三座大山”。
作者:木羊同學
來源:華章科技
01 **作系統(tǒng)都學些什么
**作系統(tǒng)的重要性當然不止于此。如果深入研究你就會發(fā)現(xiàn),**作系統(tǒng)在整個計算機學科體系中處于一個十分關鍵的位置。計算機科學的學科方向多如牛毛,但總的來說可以分成兩塊,硬件一塊,軟件一塊,這兩大塊都喜歡各玩各的,中間說是隔著次元壁也一點不夸張。
但都在一個體系內(nèi),總要想個辦法來打破次元壁呀,這個重要的工作由誰來做呢?就是**作系統(tǒng)。所以從體系架構的角度看,**心系統(tǒng)是處在所有硬件的最上層,和所有軟件的最下層,是一個“跨界”的角色。
**作系統(tǒng)很重要,那作為一門學科,難不難學呢?大家的態(tài)度走兩個極端,一邊的人覺得**作系統(tǒng)有什么可學的,不就是點鼠標劃玻璃,太簡單連小學的計算機課都不一定認真教,大學還專門設了專業(yè)課太夸張了。另一邊的人又覺得**作系統(tǒng)太難,**作系統(tǒng)的玩家不是Linus這樣的業(yè)界大神,就是微軟、谷歌這樣的行業(yè)大佬,萌新小本只好瑟瑟發(fā)抖。
這些觀點對不對呢?
都有一些理解上的偏差。我們平時常說的“安裝**作系統(tǒng)”,這里的“**作系統(tǒng)”,準確來說,應該叫“**作系統(tǒng)產(chǎn)品”,而**作系統(tǒng)這門課,主要內(nèi)容講的是**作系統(tǒng)的內(nèi)核原理。
**作系統(tǒng)產(chǎn)品和**作系統(tǒng)內(nèi)核二者的關系,有一點像計算機和CPU,沒有它不行,光有它也不行。一款**作系統(tǒng)產(chǎn)品,第一肯定得有**作系統(tǒng)內(nèi)核,但是光有內(nèi)核是沒法使用的,還得加上配套的周邊功能。
雖然叫“周邊配套”,但絕不是可有可無的意思,大部分我們所熟識**作系統(tǒng)功能,實際上都是屬于“周邊配套”,譬如說我們最最最熟悉的“桌面”,放著漂亮的壁紙,擺滿各色各樣的圖標,是**作系統(tǒng)主要的用戶交互界面,術語稱為圖形用戶界面(Graphical User Interface,簡稱GUI)。
前面感覺自己“精通**作系統(tǒng)”的那位同學,其實精通的只是GUI的使用,而且很抱歉,GUI不在**作系統(tǒng)內(nèi)核里面。
不過,話說回來,雖然專門有“**作系統(tǒng)內(nèi)核”這樣的術語,但并不意味著所謂的“內(nèi)核”與“周邊”之間,天然就存在一條清晰的界限。在**作系統(tǒng)里面,一直存在著宏內(nèi)核和微內(nèi)核兩條路線的爭論,爭論的焦點,正是什么該劃入“內(nèi)核”,什么又該算作周邊。
微內(nèi)核的主張,顧名思義,就是最小化內(nèi)核所需要提供的服務,只負責最基本的功能,把應用服務、驅(qū)動、GUI,甚至一些感覺上也挺基本的功能,譬如文件系統(tǒng)服務,都統(tǒng)統(tǒng)趕出內(nèi)核。
這樣做的好處是靈活方便,像是要提供新服務,那直接新增就可以了,不需要對內(nèi)核進行額外的改動,但缺點也很突出,什么功能都趕出去了,真到用的時候還需要進行內(nèi)核模式-用戶模式的切換,模式切換會增加額外的開銷,導致性能受損,因此就有人主張應該把常用的功能都接納進來,這就是宏內(nèi)核。
Windows早前采用的就是微內(nèi)核架構,把GUI趕了出去,結果性能損失受不了,后來又重新請回來,一直到現(xiàn)在,GUI仍然是Windows內(nèi)核的一部分。
02 **作系統(tǒng)的核心內(nèi)容
**作系統(tǒng)這門課主要研究的是**作系統(tǒng)內(nèi)核,這名字不太平易近人,容易給人“難學懂”的感覺。確實,現(xiàn)在**作系統(tǒng)的功能越來越豐富,連帶著**作系統(tǒng)內(nèi)核也越來越復雜。有一本**作系統(tǒng)業(yè)內(nèi)很有名的書,叫《Windows Internals》,講的是Windows**作系統(tǒng)的功能原理,從這本書就可以看出來**作系統(tǒng)的一個變化趨勢。
《Windows Internals》是跟著Windows推陳出新的,Windows不斷更新,這本書也不斷再版,一個肉眼可見的變化就是書越寫越厚,現(xiàn)在最新版干脆把一本書分成了上下兩卷,內(nèi)容太多,光一塊磚頭已經(jīng)不夠裝了。
這還只是Windows,現(xiàn)在是移動互聯(lián)網(wǎng)時代,還有**作系統(tǒng)還有一半多的江山被iOS和Android這哥倆占著,而且都以一年一個版本的速度迭代,要學的知識豈不是漫無邊際?
其實不用擔心,**作系統(tǒng)確實在迅速發(fā)展,但最最核心的還是那些老兄弟。**作系統(tǒng)有一本非常經(jīng)典的教材,只要你問就一定會有人推薦,叫《Operating System Concept》,中文譯為《**作系統(tǒng)概念》。因為這本書的封面畫著恐龍,所以學界也稱為“恐龍書”。
恐龍書不但介紹**作系統(tǒng)知識,還會引入“當前主流**作系統(tǒng)”作為研究案例。當然,恐龍書已經(jīng)從第1版發(fā)展到了第9版,書里的“當前主流**作系統(tǒng)”也一換再換,默默地記錄著**作系統(tǒng)的變化發(fā)展。
不過,我把幾個版本比較了一下,最新版知識點增加了不少,還補充了一些新的內(nèi)容,涵蓋了iOS、Android等移動**作系統(tǒng),但主要的知識結構并沒有大幅調(diào)整,核心的研究對象和問題,仍然是早就登場的那幾個。
具體是哪幾個呢?就仨:進程、內(nèi)存和存儲。**作系統(tǒng)最重要的功能就是“管理”,具體來說是兩項工作,資源的分配和資源的調(diào)度,那管理的核心對象是哪些呢?就是這仨,分別對應的硬件是CPU、內(nèi)存和硬盤,想想就能知道,這仨同樣是計算機里的三個扛把子部件。
我們說恐龍書經(jīng)典,其中一個地方就體現(xiàn)在對**作系統(tǒng)知識體系的劃分上面??铸垥斎粫攸c照顧這三個核心對象,為它們一一設有單元,再加上必不可少的概論、大家現(xiàn)在都很關注的安全,以及前面提到的案例分析,就構成了恐龍書最新第9版的六大知識板塊。
作為一名**作系統(tǒng)愛好者,我看過很多**作系統(tǒng)的書,有偏重原理的,有偏重實例的,也會有其它新的偏重,譬如會為網(wǎng)絡,硬件架構、設備管理等等內(nèi)容設置**章節(jié),但無論哪本書,進程、內(nèi)存和存儲(也有稱為外存)始終是書里的三條主線??偠灾?,學**作系統(tǒng),第一都得緊緊抓住進程、內(nèi)存和存儲學懂學通。
03 怎樣學**作系統(tǒng)
既然進程、內(nèi)存和存儲是**作系統(tǒng)的三個核心對象,那具體應該怎么學呢?一句話回答:帶著問題學。這里的“帶著問題學”,和我們平時常說的有所不同,在**作系統(tǒng)里面,進程、內(nèi)存和存儲都有各自需要重點關注的問題。
就拿進程來說,進程是**作系統(tǒng)中相對比較抽象的概念,所以大多數(shù)**作系統(tǒng)的教材都會不吝筆墨,給進程下一堆的定義,試圖只靠文字就解釋清楚什么是進程。不過效果總不太好,大家不容易看懂,還容易看暈,畢竟“抽象”的意思就是說,你懂了馬上心領神會,你不懂總感覺雞同鴨講。
我倒認為沒必要在進程的定義上作過多糾結,關鍵是功用,開始只需要記住一點,進程對應的是CPU。計算機所謂的“計算”,指的就是CPU運算,那運算什么內(nèi)容呢?這就是進程。
本來這個過程不算復雜,好像也沒什么問題,但是后來人們搞出了“多進程”,一個CPU能“同時”運行多個進程。但這個“同時”不是真正的同時,用術語來說,是并發(fā)執(zhí)行而不是并行執(zhí)行,結果一下就復雜起來,問題也就隨之而來了。
進程增多了,但CPU卻只有一個,出現(xiàn)了多對一的競態(tài)問題,這就是一切問題的起源。圍繞著競態(tài)問題,進程接著又衍生出了許多問題。
第一就是調(diào)度問題。對**作系統(tǒng)來說,調(diào)度是個大問題。書本肯定都會告訴你,進程有很多個狀態(tài),有些還畫成了狀態(tài)遷移圖,各種線飛來飛去,看得眼花繚亂。感覺上很難,但我覺得,把握好了背后的邏輯,這些看似凌亂的知識點就是條理清晰地串在一起。
在這里,我們只需要****盯住競態(tài)問題,正是因為進程和CPU不再是一一對應,所以需要調(diào)度,而所謂調(diào)度,就是雜技里的用兩只手玩五只球,總會區(qū)分出接回手里的、準備拋出的和停在空中的幾種情況,所以也需要根據(jù)情況給進程配套設計不同的狀態(tài),調(diào)度的具體工作,就是想辦法讓進程在這幾個狀態(tài)中來回遷移倒騰,最終營造出CPU同時執(zhí)行多個進程的假象。
進程之下是線程,現(xiàn)在又搞出了協(xié)程和纖程,以后不知道還會什么程,不過,目的只有一個,更充分地利用CPU時間,而且都難以避免一個問題,就是調(diào)度問題。
調(diào)度本身不難,難就難在設計調(diào)度原則,誰上誰下,執(zhí)行多久,等待多久,都需要一一加以考慮,而且最難的地方在于,調(diào)度是沒有最優(yōu)解的,只有在指定原則條件下,設計出相當不錯的調(diào)度方案。
進程除了競爭CPU,還要競爭資源,譬如兩個甚至更多的進程可能都需要同時讀寫同一個文件,我們熟悉的多對一的關系,會導致我們熟悉的競態(tài)問題,在CPU那導致了調(diào)度問題,而到了資源這里,則會導致同步問題和**鎖問題。
同步問題很簡單,進程既然要調(diào)度,那肯定沒辦法把活一口氣干完,譬如說讀寫某個文件,讀到一半被換下來了,下次再換上來的時候發(fā)現(xiàn),別的進程也在讀寫這個文件,內(nèi)容變了。
多線程有一個默契,就是前后環(huán)境要保持一致,你把我從CPU那換上換下我沒意見,但你得保證我所處的環(huán)境是相同的,別像雍正那樣一覺醒來發(fā)現(xiàn)大清亡了,后面也就沒法跟著劇本走。那怎么保證一致性呢,這就是同步問題,方法包括互斥鎖、信號量等等。
**鎖問題聽起感覺復雜一點,書上花了不少筆墨但內(nèi)容還是不好懂。其實也不復雜,我們在小區(qū)門口喜聞樂見的堵車就是**鎖。小區(qū)門口只有一條車道,早高峰大家都得排著隊出去,這時如果外面有一輛車回來,開到門口又不肯避讓,那就堵車了,用**作系統(tǒng)的術語來說,就是**鎖了。
前面說,為了解決同步問題,我們會采取互斥鎖等方法,簡單來說,當多個進程都要使用同一項資源時,只有當前正在使用的進程用完了,也就是術語所說的資源釋放了,后面的進程才可以接著用。這樣做的好處當然是保證了一致性,但壞處則是導致了另一個問題,就是**鎖問題。
拿前面的小區(qū)出口比劃一下就清楚了。單車道當然是互斥的,要么只進要么只出,不可能一邊進一邊出。如果兩頭的來車各占一半車道,結果當然是想進來的進不來,想出去的出不去,兩頭堵**,這就**鎖了。
那怎么解決**鎖問題呢,大方向有兩種,一種是避免出現(xiàn)**鎖,從根本上解決這個問題,不過難度較大。另一種則是想辦法對已經(jīng)發(fā)生的**鎖及時檢測發(fā)現(xiàn),第二進行恢復。但是怎么才能及時發(fā)現(xiàn)**鎖呢?這又是一個**作系統(tǒng)方向需要研究的問題。
關于作者:莫凡,網(wǎng)名木羊同學。娛樂向機器學習解說選手,《機器學習算法的數(shù)學解析與Python實現(xiàn)》作者,前沿技術發(fā)展觀潮者,擅長高冷技術的“白菜化”解說,微信**“睡前機器學習”,個人知乎號“木羊”。
延伸閱讀《現(xiàn)代**作系統(tǒng):原理與實現(xiàn)》
推薦語:**作系統(tǒng)和系統(tǒng)安全領域國際知名學者、上海交通大學陳海波、夏虞斌領銜撰寫。作者在復旦大學和上海交通大學十余年**作系統(tǒng)教學經(jīng)驗的科學小編綜合來說。由淺入深介紹現(xiàn)代**作系統(tǒng)經(jīng)典理論與方法,結合前沿研究與工業(yè)界實踐,面向真實場景與真實問題。全新打造ChCore微內(nèi)核系列課程實驗,建立對**作系統(tǒng)的第一手實踐經(jīng)驗。
拓展知識:
前沿拓展:
導讀:這一篇聊**作系統(tǒng)。最近大家對“卡脖子”討論很多,首當其沖是芯片,緊接著就是**作系統(tǒng)。**作系統(tǒng),英文名Operating System,所以也常簡稱“OS”。**作系統(tǒng)很重要,計算機系的學生都知道,**作系統(tǒng)作為一門核心專業(yè)課,和數(shù)據(jù)庫、編譯原理合稱“三座大山”。
作者:木羊同學
來源:華章科技
01 **作系統(tǒng)都學些什么
**作系統(tǒng)的重要性當然不止于此。如果深入研究你就會發(fā)現(xiàn),**作系統(tǒng)在整個計算機學科體系中處于一個十分關鍵的位置。計算機科學的學科方向多如牛毛,但總的來說可以分成兩塊,硬件一塊,軟件一塊,這兩大塊都喜歡各玩各的,中間說是隔著次元壁也一點不夸張。
但都在一個體系內(nèi),總要想個辦法來打破次元壁呀,這個重要的工作由誰來做呢?就是**作系統(tǒng)。所以從體系架構的角度看,**心系統(tǒng)是處在所有硬件的最上層,和所有軟件的最下層,是一個“跨界”的角色。
**作系統(tǒng)很重要,那作為一門學科,難不難學呢?大家的態(tài)度走兩個極端,一邊的人覺得**作系統(tǒng)有什么可學的,不就是點鼠標劃玻璃,太簡單連小學的計算機課都不一定認真教,大學還專門設了專業(yè)課太夸張了。另一邊的人又覺得**作系統(tǒng)太難,**作系統(tǒng)的玩家不是Linus這樣的業(yè)界大神,就是微軟、谷歌這樣的行業(yè)大佬,萌新小本只好瑟瑟發(fā)抖。
這些觀點對不對呢?
都有一些理解上的偏差。我們平時常說的“安裝**作系統(tǒng)”,這里的“**作系統(tǒng)”,準確來說,應該叫“**作系統(tǒng)產(chǎn)品”,而**作系統(tǒng)這門課,主要內(nèi)容講的是**作系統(tǒng)的內(nèi)核原理。
**作系統(tǒng)產(chǎn)品和**作系統(tǒng)內(nèi)核二者的關系,有一點像計算機和CPU,沒有它不行,光有它也不行。一款**作系統(tǒng)產(chǎn)品,第一肯定得有**作系統(tǒng)內(nèi)核,但是光有內(nèi)核是沒法使用的,還得加上配套的周邊功能。
雖然叫“周邊配套”,但絕不是可有可無的意思,大部分我們所熟識**作系統(tǒng)功能,實際上都是屬于“周邊配套”,譬如說我們最最最熟悉的“桌面”,放著漂亮的壁紙,擺滿各色各樣的圖標,是**作系統(tǒng)主要的用戶交互界面,術語稱為圖形用戶界面(Graphical User Interface,簡稱GUI)。
前面感覺自己“精通**作系統(tǒng)”的那位同學,其實精通的只是GUI的使用,而且很抱歉,GUI不在**作系統(tǒng)內(nèi)核里面。
不過,話說回來,雖然專門有“**作系統(tǒng)內(nèi)核”這樣的術語,但并不意味著所謂的“內(nèi)核”與“周邊”之間,天然就存在一條清晰的界限。在**作系統(tǒng)里面,一直存在著宏內(nèi)核和微內(nèi)核兩條路線的爭論,爭論的焦點,正是什么該劃入“內(nèi)核”,什么又該算作周邊。
微內(nèi)核的主張,顧名思義,就是最小化內(nèi)核所需要提供的服務,只負責最基本的功能,把應用服務、驅(qū)動、GUI,甚至一些感覺上也挺基本的功能,譬如文件系統(tǒng)服務,都統(tǒng)統(tǒng)趕出內(nèi)核。
這樣做的好處是靈活方便,像是要提供新服務,那直接新增就可以了,不需要對內(nèi)核進行額外的改動,但缺點也很突出,什么功能都趕出去了,真到用的時候還需要進行內(nèi)核模式-用戶模式的切換,模式切換會增加額外的開銷,導致性能受損,因此就有人主張應該把常用的功能都接納進來,這就是宏內(nèi)核。
Windows早前采用的就是微內(nèi)核架構,把GUI趕了出去,結果性能損失受不了,后來又重新請回來,一直到現(xiàn)在,GUI仍然是Windows內(nèi)核的一部分。
02 **作系統(tǒng)的核心內(nèi)容
**作系統(tǒng)這門課主要研究的是**作系統(tǒng)內(nèi)核,這名字不太平易近人,容易給人“難學懂”的感覺。確實,現(xiàn)在**作系統(tǒng)的功能越來越豐富,連帶著**作系統(tǒng)內(nèi)核也越來越復雜。有一本**作系統(tǒng)業(yè)內(nèi)很有名的書,叫《Windows Internals》,講的是Windows**作系統(tǒng)的功能原理,從這本書就可以看出來**作系統(tǒng)的一個變化趨勢。
《Windows Internals》是跟著Windows推陳出新的,Windows不斷更新,這本書也不斷再版,一個肉眼可見的變化就是書越寫越厚,現(xiàn)在最新版干脆把一本書分成了上下兩卷,內(nèi)容太多,光一塊磚頭已經(jīng)不夠裝了。
這還只是Windows,現(xiàn)在是移動互聯(lián)網(wǎng)時代,還有**作系統(tǒng)還有一半多的江山被iOS和Android這哥倆占著,而且都以一年一個版本的速度迭代,要學的知識豈不是漫無邊際?
其實不用擔心,**作系統(tǒng)確實在迅速發(fā)展,但最最核心的還是那些老兄弟。**作系統(tǒng)有一本非常經(jīng)典的教材,只要你問就一定會有人推薦,叫《Operating System Concept》,中文譯為《**作系統(tǒng)概念》。因為這本書的封面畫著恐龍,所以學界也稱為“恐龍書”。
恐龍書不但介紹**作系統(tǒng)知識,還會引入“當前主流**作系統(tǒng)”作為研究案例。當然,恐龍書已經(jīng)從第1版發(fā)展到了第9版,書里的“當前主流**作系統(tǒng)”也一換再換,默默地記錄著**作系統(tǒng)的變化發(fā)展。
不過,我把幾個版本比較了一下,最新版知識點增加了不少,還補充了一些新的內(nèi)容,涵蓋了iOS、Android等移動**作系統(tǒng),但主要的知識結構并沒有大幅調(diào)整,核心的研究對象和問題,仍然是早就登場的那幾個。
具體是哪幾個呢?就仨:進程、內(nèi)存和存儲。**作系統(tǒng)最重要的功能就是“管理”,具體來說是兩項工作,資源的分配和資源的調(diào)度,那管理的核心對象是哪些呢?就是這仨,分別對應的硬件是CPU、內(nèi)存和硬盤,想想就能知道,這仨同樣是計算機里的三個扛把子部件。
我們說恐龍書經(jīng)典,其中一個地方就體現(xiàn)在對**作系統(tǒng)知識體系的劃分上面。恐龍書當然會重點照顧這三個核心對象,為它們一一設有單元,再加上必不可少的概論、大家現(xiàn)在都很關注的安全,以及前面提到的案例分析,就構成了恐龍書最新第9版的六大知識板塊。
作為一名**作系統(tǒng)愛好者,我看過很多**作系統(tǒng)的書,有偏重原理的,有偏重實例的,也會有其它新的偏重,譬如會為網(wǎng)絡,硬件架構、設備管理等等內(nèi)容設置**章節(jié),但無論哪本書,進程、內(nèi)存和存儲(也有稱為外存)始終是書里的三條主線??偠灾?,學**作系統(tǒng),第一都得緊緊抓住進程、內(nèi)存和存儲學懂學通。
03 怎樣學**作系統(tǒng)
既然進程、內(nèi)存和存儲是**作系統(tǒng)的三個核心對象,那具體應該怎么學呢?一句話回答:帶著問題學。這里的“帶著問題學”,和我們平時常說的有所不同,在**作系統(tǒng)里面,進程、內(nèi)存和存儲都有各自需要重點關注的問題。
就拿進程來說,進程是**作系統(tǒng)中相對比較抽象的概念,所以大多數(shù)**作系統(tǒng)的教材都會不吝筆墨,給進程下一堆的定義,試圖只靠文字就解釋清楚什么是進程。不過效果總不太好,大家不容易看懂,還容易看暈,畢竟“抽象”的意思就是說,你懂了馬上心領神會,你不懂總感覺雞同鴨講。
我倒認為沒必要在進程的定義上作過多糾結,關鍵是功用,開始只需要記住一點,進程對應的是CPU。計算機所謂的“計算”,指的就是CPU運算,那運算什么內(nèi)容呢?這就是進程。
本來這個過程不算復雜,好像也沒什么問題,但是后來人們搞出了“多進程”,一個CPU能“同時”運行多個進程。但這個“同時”不是真正的同時,用術語來說,是并發(fā)執(zhí)行而不是并行執(zhí)行,結果一下就復雜起來,問題也就隨之而來了。
進程增多了,但CPU卻只有一個,出現(xiàn)了多對一的競態(tài)問題,這就是一切問題的起源。圍繞著競態(tài)問題,進程接著又衍生出了許多問題。
第一就是調(diào)度問題。對**作系統(tǒng)來說,調(diào)度是個大問題。書本肯定都會告訴你,進程有很多個狀態(tài),有些還畫成了狀態(tài)遷移圖,各種線飛來飛去,看得眼花繚亂。感覺上很難,但我覺得,把握好了背后的邏輯,這些看似凌亂的知識點就是條理清晰地串在一起。
在這里,我們只需要****盯住競態(tài)問題,正是因為進程和CPU不再是一一對應,所以需要調(diào)度,而所謂調(diào)度,就是雜技里的用兩只手玩五只球,總會區(qū)分出接回手里的、準備拋出的和停在空中的幾種情況,所以也需要根據(jù)情況給進程配套設計不同的狀態(tài),調(diào)度的具體工作,就是想辦法讓進程在這幾個狀態(tài)中來回遷移倒騰,最終營造出CPU同時執(zhí)行多個進程的假象。
進程之下是線程,現(xiàn)在又搞出了協(xié)程和纖程,以后不知道還會什么程,不過,目的只有一個,更充分地利用CPU時間,而且都難以避免一個問題,就是調(diào)度問題。
調(diào)度本身不難,難就難在設計調(diào)度原則,誰上誰下,執(zhí)行多久,等待多久,都需要一一加以考慮,而且最難的地方在于,調(diào)度是沒有最優(yōu)解的,只有在指定原則條件下,設計出相當不錯的調(diào)度方案。
進程除了競爭CPU,還要競爭資源,譬如兩個甚至更多的進程可能都需要同時讀寫同一個文件,我們熟悉的多對一的關系,會導致我們熟悉的競態(tài)問題,在CPU那導致了調(diào)度問題,而到了資源這里,則會導致同步問題和**鎖問題。
同步問題很簡單,進程既然要調(diào)度,那肯定沒辦法把活一口氣干完,譬如說讀寫某個文件,讀到一半被換下來了,下次再換上來的時候發(fā)現(xiàn),別的進程也在讀寫這個文件,內(nèi)容變了。
多線程有一個默契,就是前后環(huán)境要保持一致,你把我從CPU那換上換下我沒意見,但你得保證我所處的環(huán)境是相同的,別像雍正那樣一覺醒來發(fā)現(xiàn)大清亡了,后面也就沒法跟著劇本走。那怎么保證一致性呢,這就是同步問題,方法包括互斥鎖、信號量等等。
**鎖問題聽起感覺復雜一點,書上花了不少筆墨但內(nèi)容還是不好懂。其實也不復雜,我們在小區(qū)門口喜聞樂見的堵車就是**鎖。小區(qū)門口只有一條車道,早高峰大家都得排著隊出去,這時如果外面有一輛車回來,開到門口又不肯避讓,那就堵車了,用**作系統(tǒng)的術語來說,就是**鎖了。
前面說,為了解決同步問題,我們會采取互斥鎖等方法,簡單來說,當多個進程都要使用同一項資源時,只有當前正在使用的進程用完了,也就是術語所說的資源釋放了,后面的進程才可以接著用。這樣做的好處當然是保證了一致性,但壞處則是導致了另一個問題,就是**鎖問題。
拿前面的小區(qū)出口比劃一下就清楚了。單車道當然是互斥的,要么只進要么只出,不可能一邊進一邊出。如果兩頭的來車各占一半車道,結果當然是想進來的進不來,想出去的出不去,兩頭堵**,這就**鎖了。
那怎么解決**鎖問題呢,大方向有兩種,一種是避免出現(xiàn)**鎖,從根本上解決這個問題,不過難度較大。另一種則是想辦法對已經(jīng)發(fā)生的**鎖及時檢測發(fā)現(xiàn),第二進行恢復。但是怎么才能及時發(fā)現(xiàn)**鎖呢?這又是一個**作系統(tǒng)方向需要研究的問題。
關于作者:莫凡,網(wǎng)名木羊同學。娛樂向機器學習解說選手,《機器學習算法的數(shù)學解析與Python實現(xiàn)》作者,前沿技術發(fā)展觀潮者,擅長高冷技術的“白菜化”解說,微信**“睡前機器學習”,個人知乎號“木羊”。
延伸閱讀《現(xiàn)代**作系統(tǒng):原理與實現(xiàn)》
推薦語:**作系統(tǒng)和系統(tǒng)安全領域國際知名學者、上海交通大學陳海波、夏虞斌領銜撰寫。作者在復旦大學和上海交通大學十余年**作系統(tǒng)教學經(jīng)驗的科學小編綜合來說。由淺入深介紹現(xiàn)代**作系統(tǒng)經(jīng)典理論與方法,結合前沿研究與工業(yè)界實踐,面向真實場景與真實問題。全新打造ChCore微內(nèi)核系列課程實驗,建立對**作系統(tǒng)的第一手實踐經(jīng)驗。
拓展知識:
前沿拓展:
導讀:這一篇聊**作系統(tǒng)。最近大家對“卡脖子”討論很多,首當其沖是芯片,緊接著就是**作系統(tǒng)。**作系統(tǒng),英文名Operating System,所以也常簡稱“OS”。**作系統(tǒng)很重要,計算機系的學生都知道,**作系統(tǒng)作為一門核心專業(yè)課,和數(shù)據(jù)庫、編譯原理合稱“三座大山”。
作者:木羊同學
來源:華章科技
01 **作系統(tǒng)都學些什么
**作系統(tǒng)的重要性當然不止于此。如果深入研究你就會發(fā)現(xiàn),**作系統(tǒng)在整個計算機學科體系中處于一個十分關鍵的位置。計算機科學的學科方向多如牛毛,但總的來說可以分成兩塊,硬件一塊,軟件一塊,這兩大塊都喜歡各玩各的,中間說是隔著次元壁也一點不夸張。
但都在一個體系內(nèi),總要想個辦法來打破次元壁呀,這個重要的工作由誰來做呢?就是**作系統(tǒng)。所以從體系架構的角度看,**心系統(tǒng)是處在所有硬件的最上層,和所有軟件的最下層,是一個“跨界”的角色。
**作系統(tǒng)很重要,那作為一門學科,難不難學呢?大家的態(tài)度走兩個極端,一邊的人覺得**作系統(tǒng)有什么可學的,不就是點鼠標劃玻璃,太簡單連小學的計算機課都不一定認真教,大學還專門設了專業(yè)課太夸張了。另一邊的人又覺得**作系統(tǒng)太難,**作系統(tǒng)的玩家不是Linus這樣的業(yè)界大神,就是微軟、谷歌這樣的行業(yè)大佬,萌新小本只好瑟瑟發(fā)抖。
這些觀點對不對呢?
都有一些理解上的偏差。我們平時常說的“安裝**作系統(tǒng)”,這里的“**作系統(tǒng)”,準確來說,應該叫“**作系統(tǒng)產(chǎn)品”,而**作系統(tǒng)這門課,主要內(nèi)容講的是**作系統(tǒng)的內(nèi)核原理。
**作系統(tǒng)產(chǎn)品和**作系統(tǒng)內(nèi)核二者的關系,有一點像計算機和CPU,沒有它不行,光有它也不行。一款**作系統(tǒng)產(chǎn)品,第一肯定得有**作系統(tǒng)內(nèi)核,但是光有內(nèi)核是沒法使用的,還得加上配套的周邊功能。
雖然叫“周邊配套”,但絕不是可有可無的意思,大部分我們所熟識**作系統(tǒng)功能,實際上都是屬于“周邊配套”,譬如說我們最最最熟悉的“桌面”,放著漂亮的壁紙,擺滿各色各樣的圖標,是**作系統(tǒng)主要的用戶交互界面,術語稱為圖形用戶界面(Graphical User Interface,簡稱GUI)。
前面感覺自己“精通**作系統(tǒng)”的那位同學,其實精通的只是GUI的使用,而且很抱歉,GUI不在**作系統(tǒng)內(nèi)核里面。
不過,話說回來,雖然專門有“**作系統(tǒng)內(nèi)核”這樣的術語,但并不意味著所謂的“內(nèi)核”與“周邊”之間,天然就存在一條清晰的界限。在**作系統(tǒng)里面,一直存在著宏內(nèi)核和微內(nèi)核兩條路線的爭論,爭論的焦點,正是什么該劃入“內(nèi)核”,什么又該算作周邊。
微內(nèi)核的主張,顧名思義,就是最小化內(nèi)核所需要提供的服務,只負責最基本的功能,把應用服務、驅(qū)動、GUI,甚至一些感覺上也挺基本的功能,譬如文件系統(tǒng)服務,都統(tǒng)統(tǒng)趕出內(nèi)核。
這樣做的好處是靈活方便,像是要提供新服務,那直接新增就可以了,不需要對內(nèi)核進行額外的改動,但缺點也很突出,什么功能都趕出去了,真到用的時候還需要進行內(nèi)核模式-用戶模式的切換,模式切換會增加額外的開銷,導致性能受損,因此就有人主張應該把常用的功能都接納進來,這就是宏內(nèi)核。
Windows早前采用的就是微內(nèi)核架構,把GUI趕了出去,結果性能損失受不了,后來又重新請回來,一直到現(xiàn)在,GUI仍然是Windows內(nèi)核的一部分。
02 **作系統(tǒng)的核心內(nèi)容
**作系統(tǒng)這門課主要研究的是**作系統(tǒng)內(nèi)核,這名字不太平易近人,容易給人“難學懂”的感覺。確實,現(xiàn)在**作系統(tǒng)的功能越來越豐富,連帶著**作系統(tǒng)內(nèi)核也越來越復雜。有一本**作系統(tǒng)業(yè)內(nèi)很有名的書,叫《Windows Internals》,講的是Windows**作系統(tǒng)的功能原理,從這本書就可以看出來**作系統(tǒng)的一個變化趨勢。
《Windows Internals》是跟著Windows推陳出新的,Windows不斷更新,這本書也不斷再版,一個肉眼可見的變化就是書越寫越厚,現(xiàn)在最新版干脆把一本書分成了上下兩卷,內(nèi)容太多,光一塊磚頭已經(jīng)不夠裝了。
這還只是Windows,現(xiàn)在是移動互聯(lián)網(wǎng)時代,還有**作系統(tǒng)還有一半多的江山被iOS和Android這哥倆占著,而且都以一年一個版本的速度迭代,要學的知識豈不是漫無邊際?
其實不用擔心,**作系統(tǒng)確實在迅速發(fā)展,但最最核心的還是那些老兄弟。**作系統(tǒng)有一本非常經(jīng)典的教材,只要你問就一定會有人推薦,叫《Operating System Concept》,中文譯為《**作系統(tǒng)概念》。因為這本書的封面畫著恐龍,所以學界也稱為“恐龍書”。
恐龍書不但介紹**作系統(tǒng)知識,還會引入“當前主流**作系統(tǒng)”作為研究案例。當然,恐龍書已經(jīng)從第1版發(fā)展到了第9版,書里的“當前主流**作系統(tǒng)”也一換再換,默默地記錄著**作系統(tǒng)的變化發(fā)展。
不過,我把幾個版本比較了一下,最新版知識點增加了不少,還補充了一些新的內(nèi)容,涵蓋了iOS、Android等移動**作系統(tǒng),但主要的知識結構并沒有大幅調(diào)整,核心的研究對象和問題,仍然是早就登場的那幾個。
具體是哪幾個呢?就仨:進程、內(nèi)存和存儲。**作系統(tǒng)最重要的功能就是“管理”,具體來說是兩項工作,資源的分配和資源的調(diào)度,那管理的核心對象是哪些呢?就是這仨,分別對應的硬件是CPU、內(nèi)存和硬盤,想想就能知道,這仨同樣是計算機里的三個扛把子部件。
我們說恐龍書經(jīng)典,其中一個地方就體現(xiàn)在對**作系統(tǒng)知識體系的劃分上面。恐龍書當然會重點照顧這三個核心對象,為它們一一設有單元,再加上必不可少的概論、大家現(xiàn)在都很關注的安全,以及前面提到的案例分析,就構成了恐龍書最新第9版的六大知識板塊。
作為一名**作系統(tǒng)愛好者,我看過很多**作系統(tǒng)的書,有偏重原理的,有偏重實例的,也會有其它新的偏重,譬如會為網(wǎng)絡,硬件架構、設備管理等等內(nèi)容設置**章節(jié),但無論哪本書,進程、內(nèi)存和存儲(也有稱為外存)始終是書里的三條主線??偠灾?,學**作系統(tǒng),第一都得緊緊抓住進程、內(nèi)存和存儲學懂學通。
03 怎樣學**作系統(tǒng)
既然進程、內(nèi)存和存儲是**作系統(tǒng)的三個核心對象,那具體應該怎么學呢?一句話回答:帶著問題學。這里的“帶著問題學”,和我們平時常說的有所不同,在**作系統(tǒng)里面,進程、內(nèi)存和存儲都有各自需要重點關注的問題。
就拿進程來說,進程是**作系統(tǒng)中相對比較抽象的概念,所以大多數(shù)**作系統(tǒng)的教材都會不吝筆墨,給進程下一堆的定義,試圖只靠文字就解釋清楚什么是進程。不過效果總不太好,大家不容易看懂,還容易看暈,畢竟“抽象”的意思就是說,你懂了馬上心領神會,你不懂總感覺雞同鴨講。
我倒認為沒必要在進程的定義上作過多糾結,關鍵是功用,開始只需要記住一點,進程對應的是CPU。計算機所謂的“計算”,指的就是CPU運算,那運算什么內(nèi)容呢?這就是進程。
本來這個過程不算復雜,好像也沒什么問題,但是后來人們搞出了“多進程”,一個CPU能“同時”運行多個進程。但這個“同時”不是真正的同時,用術語來說,是并發(fā)執(zhí)行而不是并行執(zhí)行,結果一下就復雜起來,問題也就隨之而來了。
進程增多了,但CPU卻只有一個,出現(xiàn)了多對一的競態(tài)問題,這就是一切問題的起源。圍繞著競態(tài)問題,進程接著又衍生出了許多問題。
第一就是調(diào)度問題。對**作系統(tǒng)來說,調(diào)度是個大問題。書本肯定都會告訴你,進程有很多個狀態(tài),有些還畫成了狀態(tài)遷移圖,各種線飛來飛去,看得眼花繚亂。感覺上很難,但我覺得,把握好了背后的邏輯,這些看似凌亂的知識點就是條理清晰地串在一起。
在這里,我們只需要****盯住競態(tài)問題,正是因為進程和CPU不再是一一對應,所以需要調(diào)度,而所謂調(diào)度,就是雜技里的用兩只手玩五只球,總會區(qū)分出接回手里的、準備拋出的和停在空中的幾種情況,所以也需要根據(jù)情況給進程配套設計不同的狀態(tài),調(diào)度的具體工作,就是想辦法讓進程在這幾個狀態(tài)中來回遷移倒騰,最終營造出CPU同時執(zhí)行多個進程的假象。
進程之下是線程,現(xiàn)在又搞出了協(xié)程和纖程,以后不知道還會什么程,不過,目的只有一個,更充分地利用CPU時間,而且都難以避免一個問題,就是調(diào)度問題。
調(diào)度本身不難,難就難在設計調(diào)度原則,誰上誰下,執(zhí)行多久,等待多久,都需要一一加以考慮,而且最難的地方在于,調(diào)度是沒有最優(yōu)解的,只有在指定原則條件下,設計出相當不錯的調(diào)度方案。
進程除了競爭CPU,還要競爭資源,譬如兩個甚至更多的進程可能都需要同時讀寫同一個文件,我們熟悉的多對一的關系,會導致我們熟悉的競態(tài)問題,在CPU那導致了調(diào)度問題,而到了資源這里,則會導致同步問題和**鎖問題。
同步問題很簡單,進程既然要調(diào)度,那肯定沒辦法把活一口氣干完,譬如說讀寫某個文件,讀到一半被換下來了,下次再換上來的時候發(fā)現(xiàn),別的進程也在讀寫這個文件,內(nèi)容變了。
多線程有一個默契,就是前后環(huán)境要保持一致,你把我從CPU那換上換下我沒意見,但你得保證我所處的環(huán)境是相同的,別像雍正那樣一覺醒來發(fā)現(xiàn)大清亡了,后面也就沒法跟著劇本走。那怎么保證一致性呢,這就是同步問題,方法包括互斥鎖、信號量等等。
**鎖問題聽起感覺復雜一點,書上花了不少筆墨但內(nèi)容還是不好懂。其實也不復雜,我們在小區(qū)門口喜聞樂見的堵車就是**鎖。小區(qū)門口只有一條車道,早高峰大家都得排著隊出去,這時如果外面有一輛車回來,開到門口又不肯避讓,那就堵車了,用**作系統(tǒng)的術語來說,就是**鎖了。
前面說,為了解決同步問題,我們會采取互斥鎖等方法,簡單來說,當多個進程都要使用同一項資源時,只有當前正在使用的進程用完了,也就是術語所說的資源釋放了,后面的進程才可以接著用。這樣做的好處當然是保證了一致性,但壞處則是導致了另一個問題,就是**鎖問題。
拿前面的小區(qū)出口比劃一下就清楚了。單車道當然是互斥的,要么只進要么只出,不可能一邊進一邊出。如果兩頭的來車各占一半車道,結果當然是想進來的進不來,想出去的出不去,兩頭堵**,這就**鎖了。
那怎么解決**鎖問題呢,大方向有兩種,一種是避免出現(xiàn)**鎖,從根本上解決這個問題,不過難度較大。另一種則是想辦法對已經(jīng)發(fā)生的**鎖及時檢測發(fā)現(xiàn),第二進行恢復。但是怎么才能及時發(fā)現(xiàn)**鎖呢?這又是一個**作系統(tǒng)方向需要研究的問題。
關于作者:莫凡,網(wǎng)名木羊同學。娛樂向機器學習解說選手,《機器學習算法的數(shù)學解析與Python實現(xiàn)》作者,前沿技術發(fā)展觀潮者,擅長高冷技術的“白菜化”解說,微信**“睡前機器學習”,個人知乎號“木羊”。
延伸閱讀《現(xiàn)代**作系統(tǒng):原理與實現(xiàn)》
推薦語:**作系統(tǒng)和系統(tǒng)安全領域國際知名學者、上海交通大學陳海波、夏虞斌領銜撰寫。作者在復旦大學和上海交通大學十余年**作系統(tǒng)教學經(jīng)驗的科學小編綜合來說。由淺入深介紹現(xiàn)代**作系統(tǒng)經(jīng)典理論與方法,結合前沿研究與工業(yè)界實踐,面向真實場景與真實問題。全新打造ChCore微內(nèi)核系列課程實驗,建立對**作系統(tǒng)的第一手實踐經(jīng)驗。
拓展知識:
前沿拓展:
導讀:這一篇聊**作系統(tǒng)。最近大家對“卡脖子”討論很多,首當其沖是芯片,緊接著就是**作系統(tǒng)。**作系統(tǒng),英文名Operating System,所以也常簡稱“OS”。**作系統(tǒng)很重要,計算機系的學生都知道,**作系統(tǒng)作為一門核心專業(yè)課,和數(shù)據(jù)庫、編譯原理合稱“三座大山”。
作者:木羊同學
來源:華章科技
01 **作系統(tǒng)都學些什么
**作系統(tǒng)的重要性當然不止于此。如果深入研究你就會發(fā)現(xiàn),**作系統(tǒng)在整個計算機學科體系中處于一個十分關鍵的位置。計算機科學的學科方向多如牛毛,但總的來說可以分成兩塊,硬件一塊,軟件一塊,這兩大塊都喜歡各玩各的,中間說是隔著次元壁也一點不夸張。
但都在一個體系內(nèi),總要想個辦法來打破次元壁呀,這個重要的工作由誰來做呢?就是**作系統(tǒng)。所以從體系架構的角度看,**心系統(tǒng)是處在所有硬件的最上層,和所有軟件的最下層,是一個“跨界”的角色。
**作系統(tǒng)很重要,那作為一門學科,難不難學呢?大家的態(tài)度走兩個極端,一邊的人覺得**作系統(tǒng)有什么可學的,不就是點鼠標劃玻璃,太簡單連小學的計算機課都不一定認真教,大學還專門設了專業(yè)課太夸張了。另一邊的人又覺得**作系統(tǒng)太難,**作系統(tǒng)的玩家不是Linus這樣的業(yè)界大神,就是微軟、谷歌這樣的行業(yè)大佬,萌新小本只好瑟瑟發(fā)抖。
這些觀點對不對呢?
都有一些理解上的偏差。我們平時常說的“安裝**作系統(tǒng)”,這里的“**作系統(tǒng)”,準確來說,應該叫“**作系統(tǒng)產(chǎn)品”,而**作系統(tǒng)這門課,主要內(nèi)容講的是**作系統(tǒng)的內(nèi)核原理。
**作系統(tǒng)產(chǎn)品和**作系統(tǒng)內(nèi)核二者的關系,有一點像計算機和CPU,沒有它不行,光有它也不行。一款**作系統(tǒng)產(chǎn)品,第一肯定得有**作系統(tǒng)內(nèi)核,但是光有內(nèi)核是沒法使用的,還得加上配套的周邊功能。
雖然叫“周邊配套”,但絕不是可有可無的意思,大部分我們所熟識**作系統(tǒng)功能,實際上都是屬于“周邊配套”,譬如說我們最最最熟悉的“桌面”,放著漂亮的壁紙,擺滿各色各樣的圖標,是**作系統(tǒng)主要的用戶交互界面,術語稱為圖形用戶界面(Graphical User Interface,簡稱GUI)。
前面感覺自己“精通**作系統(tǒng)”的那位同學,其實精通的只是GUI的使用,而且很抱歉,GUI不在**作系統(tǒng)內(nèi)核里面。
不過,話說回來,雖然專門有“**作系統(tǒng)內(nèi)核”這樣的術語,但并不意味著所謂的“內(nèi)核”與“周邊”之間,天然就存在一條清晰的界限。在**作系統(tǒng)里面,一直存在著宏內(nèi)核和微內(nèi)核兩條路線的爭論,爭論的焦點,正是什么該劃入“內(nèi)核”,什么又該算作周邊。
微內(nèi)核的主張,顧名思義,就是最小化內(nèi)核所需要提供的服務,只負責最基本的功能,把應用服務、驅(qū)動、GUI,甚至一些感覺上也挺基本的功能,譬如文件系統(tǒng)服務,都統(tǒng)統(tǒng)趕出內(nèi)核。
這樣做的好處是靈活方便,像是要提供新服務,那直接新增就可以了,不需要對內(nèi)核進行額外的改動,但缺點也很突出,什么功能都趕出去了,真到用的時候還需要進行內(nèi)核模式-用戶模式的切換,模式切換會增加額外的開銷,導致性能受損,因此就有人主張應該把常用的功能都接納進來,這就是宏內(nèi)核。
Windows早前采用的就是微內(nèi)核架構,把GUI趕了出去,結果性能損失受不了,后來又重新請回來,一直到現(xiàn)在,GUI仍然是Windows內(nèi)核的一部分。
02 **作系統(tǒng)的核心內(nèi)容
**作系統(tǒng)這門課主要研究的是**作系統(tǒng)內(nèi)核,這名字不太平易近人,容易給人“難學懂”的感覺。確實,現(xiàn)在**作系統(tǒng)的功能越來越豐富,連帶著**作系統(tǒng)內(nèi)核也越來越復雜。有一本**作系統(tǒng)業(yè)內(nèi)很有名的書,叫《Windows Internals》,講的是Windows**作系統(tǒng)的功能原理,從這本書就可以看出來**作系統(tǒng)的一個變化趨勢。
《Windows Internals》是跟著Windows推陳出新的,Windows不斷更新,這本書也不斷再版,一個肉眼可見的變化就是書越寫越厚,現(xiàn)在最新版干脆把一本書分成了上下兩卷,內(nèi)容太多,光一塊磚頭已經(jīng)不夠裝了。
這還只是Windows,現(xiàn)在是移動互聯(lián)網(wǎng)時代,還有**作系統(tǒng)還有一半多的江山被iOS和Android這哥倆占著,而且都以一年一個版本的速度迭代,要學的知識豈不是漫無邊際?
其實不用擔心,**作系統(tǒng)確實在迅速發(fā)展,但最最核心的還是那些老兄弟。**作系統(tǒng)有一本非常經(jīng)典的教材,只要你問就一定會有人推薦,叫《Operating System Concept》,中文譯為《**作系統(tǒng)概念》。因為這本書的封面畫著恐龍,所以學界也稱為“恐龍書”。
恐龍書不但介紹**作系統(tǒng)知識,還會引入“當前主流**作系統(tǒng)”作為研究案例。當然,恐龍書已經(jīng)從第1版發(fā)展到了第9版,書里的“當前主流**作系統(tǒng)”也一換再換,默默地記錄著**作系統(tǒng)的變化發(fā)展。
不過,我把幾個版本比較了一下,最新版知識點增加了不少,還補充了一些新的內(nèi)容,涵蓋了iOS、Android等移動**作系統(tǒng),但主要的知識結構并沒有大幅調(diào)整,核心的研究對象和問題,仍然是早就登場的那幾個。
具體是哪幾個呢?就仨:進程、內(nèi)存和存儲。**作系統(tǒng)最重要的功能就是“管理”,具體來說是兩項工作,資源的分配和資源的調(diào)度,那管理的核心對象是哪些呢?就是這仨,分別對應的硬件是CPU、內(nèi)存和硬盤,想想就能知道,這仨同樣是計算機里的三個扛把子部件。
我們說恐龍書經(jīng)典,其中一個地方就體現(xiàn)在對**作系統(tǒng)知識體系的劃分上面??铸垥斎粫攸c照顧這三個核心對象,為它們一一設有單元,再加上必不可少的概論、大家現(xiàn)在都很關注的安全,以及前面提到的案例分析,就構成了恐龍書最新第9版的六大知識板塊。
作為一名**作系統(tǒng)愛好者,我看過很多**作系統(tǒng)的書,有偏重原理的,有偏重實例的,也會有其它新的偏重,譬如會為網(wǎng)絡,硬件架構、設備管理等等內(nèi)容設置**章節(jié),但無論哪本書,進程、內(nèi)存和存儲(也有稱為外存)始終是書里的三條主線??偠灾?,學**作系統(tǒng),第一都得緊緊抓住進程、內(nèi)存和存儲學懂學通。
03 怎樣學**作系統(tǒng)
既然進程、內(nèi)存和存儲是**作系統(tǒng)的三個核心對象,那具體應該怎么學呢?一句話回答:帶著問題學。這里的“帶著問題學”,和我們平時常說的有所不同,在**作系統(tǒng)里面,進程、內(nèi)存和存儲都有各自需要重點關注的問題。
就拿進程來說,進程是**作系統(tǒng)中相對比較抽象的概念,所以大多數(shù)**作系統(tǒng)的教材都會不吝筆墨,給進程下一堆的定義,試圖只靠文字就解釋清楚什么是進程。不過效果總不太好,大家不容易看懂,還容易看暈,畢竟“抽象”的意思就是說,你懂了馬上心領神會,你不懂總感覺雞同鴨講。
我倒認為沒必要在進程的定義上作過多糾結,關鍵是功用,開始只需要記住一點,進程對應的是CPU。計算機所謂的“計算”,指的就是CPU運算,那運算什么內(nèi)容呢?這就是進程。
本來這個過程不算復雜,好像也沒什么問題,但是后來人們搞出了“多進程”,一個CPU能“同時”運行多個進程。但這個“同時”不是真正的同時,用術語來說,是并發(fā)執(zhí)行而不是并行執(zhí)行,結果一下就復雜起來,問題也就隨之而來了。
進程增多了,但CPU卻只有一個,出現(xiàn)了多對一的競態(tài)問題,這就是一切問題的起源。圍繞著競態(tài)問題,進程接著又衍生出了許多問題。
第一就是調(diào)度問題。對**作系統(tǒng)來說,調(diào)度是個大問題。書本肯定都會告訴你,進程有很多個狀態(tài),有些還畫成了狀態(tài)遷移圖,各種線飛來飛去,看得眼花繚亂。感覺上很難,但我覺得,把握好了背后的邏輯,這些看似凌亂的知識點就是條理清晰地串在一起。
在這里,我們只需要****盯住競態(tài)問題,正是因為進程和CPU不再是一一對應,所以需要調(diào)度,而所謂調(diào)度,就是雜技里的用兩只手玩五只球,總會區(qū)分出接回手里的、準備拋出的和停在空中的幾種情況,所以也需要根據(jù)情況給進程配套設計不同的狀態(tài),調(diào)度的具體工作,就是想辦法讓進程在這幾個狀態(tài)中來回遷移倒騰,最終營造出CPU同時執(zhí)行多個進程的假象。
進程之下是線程,現(xiàn)在又搞出了協(xié)程和纖程,以后不知道還會什么程,不過,目的只有一個,更充分地利用CPU時間,而且都難以避免一個問題,就是調(diào)度問題。
調(diào)度本身不難,難就難在設計調(diào)度原則,誰上誰下,執(zhí)行多久,等待多久,都需要一一加以考慮,而且最難的地方在于,調(diào)度是沒有最優(yōu)解的,只有在指定原則條件下,設計出相當不錯的調(diào)度方案。
進程除了競爭CPU,還要競爭資源,譬如兩個甚至更多的進程可能都需要同時讀寫同一個文件,我們熟悉的多對一的關系,會導致我們熟悉的競態(tài)問題,在CPU那導致了調(diào)度問題,而到了資源這里,則會導致同步問題和**鎖問題。
同步問題很簡單,進程既然要調(diào)度,那肯定沒辦法把活一口氣干完,譬如說讀寫某個文件,讀到一半被換下來了,下次再換上來的時候發(fā)現(xiàn),別的進程也在讀寫這個文件,內(nèi)容變了。
多線程有一個默契,就是前后環(huán)境要保持一致,你把我從CPU那換上換下我沒意見,但你得保證我所處的環(huán)境是相同的,別像雍正那樣一覺醒來發(fā)現(xiàn)大清亡了,后面也就沒法跟著劇本走。那怎么保證一致性呢,這就是同步問題,方法包括互斥鎖、信號量等等。
**鎖問題聽起感覺復雜一點,書上花了不少筆墨但內(nèi)容還是不好懂。其實也不復雜,我們在小區(qū)門口喜聞樂見的堵車就是**鎖。小區(qū)門口只有一條車道,早高峰大家都得排著隊出去,這時如果外面有一輛車回來,開到門口又不肯避讓,那就堵車了,用**作系統(tǒng)的術語來說,就是**鎖了。
前面說,為了解決同步問題,我們會采取互斥鎖等方法,簡單來說,當多個進程都要使用同一項資源時,只有當前正在使用的進程用完了,也就是術語所說的資源釋放了,后面的進程才可以接著用。這樣做的好處當然是保證了一致性,但壞處則是導致了另一個問題,就是**鎖問題。
拿前面的小區(qū)出口比劃一下就清楚了。單車道當然是互斥的,要么只進要么只出,不可能一邊進一邊出。如果兩頭的來車各占一半車道,結果當然是想進來的進不來,想出去的出不去,兩頭堵**,這就**鎖了。
那怎么解決**鎖問題呢,大方向有兩種,一種是避免出現(xiàn)**鎖,從根本上解決這個問題,不過難度較大。另一種則是想辦法對已經(jīng)發(fā)生的**鎖及時檢測發(fā)現(xiàn),第二進行恢復。但是怎么才能及時發(fā)現(xiàn)**鎖呢?這又是一個**作系統(tǒng)方向需要研究的問題。
關于作者:莫凡,網(wǎng)名木羊同學。娛樂向機器學習解說選手,《機器學習算法的數(shù)學解析與Python實現(xiàn)》作者,前沿技術發(fā)展觀潮者,擅長高冷技術的“白菜化”解說,微信**“睡前機器學習”,個人知乎號“木羊”。
延伸閱讀《現(xiàn)代**作系統(tǒng):原理與實現(xiàn)》
推薦語:**作系統(tǒng)和系統(tǒng)安全領域國際知名學者、上海交通大學陳海波、夏虞斌領銜撰寫。作者在復旦大學和上海交通大學十余年**作系統(tǒng)教學經(jīng)驗的科學小編綜合來說。由淺入深介紹現(xiàn)代**作系統(tǒng)經(jīng)典理論與方法,結合前沿研究與工業(yè)界實踐,面向真實場景與真實問題。全新打造ChCore微內(nèi)核系列課程實驗,建立對**作系統(tǒng)的第一手實踐經(jīng)驗。
拓展知識:
原創(chuàng)文章,作者:九賢生活小編,如若轉載,請注明出處:http:///4170.html