Linux內核實戰(二)- 操作系統概覽

来源:https://www.cnblogs.com/JavaEdge/archive/2019/08/05/11300760.html
-Advertisement-
Play Games

不知道你有沒有產生過這些疑問: 桌面上的圖標到底是啥?憑啥我在滑鼠上一雙擊,就會出來一些不可描述的畫面?都是從哪裡跑出來的? 憑什麼我在鍵盤上噼里啪啦地敲,某個位置就會顯示我想要的那些字元? 電腦怎麼知道我滑鼠點擊的是這個地方,又是怎麼知道我要輸入的是這個地方? 我在鍵盤上點“a”,是誰在顯示器上畫 ...


image

不知道你有沒有產生過這些疑問:

桌面上的圖標到底是啥?憑啥我在滑鼠上一雙擊,就會出來一些不可描述的畫面?都是從哪裡跑出來的?
憑什麼我在鍵盤上噼里啪啦地敲,某個位置就會顯示我想要的那些字元?

電腦怎麼知道我滑鼠點擊的是這個地方,又是怎麼知道我要輸入的是這個地方?

我在鍵盤上點“a”,是誰在顯示器上畫出“a”這個圖像呢?

為什麼我一回車,這些字元就發到遙遠的另外一臺機器上去了?

別小看“雙擊滑鼠打開聊天軟體”這樣一個簡單的操作,它幾乎涵蓋了操作系統的所有功能。我們就從這個熟悉的操作,來認識陌生的操作系統。

操作系統其實就像一個軟體外包,內核就相當於這家外包公司的老闆。所以接下來請你將自己的角色切換成這家軟體外包公司的老闆,設身處地地去理解操作系統是如何協調各種資源,幫客戶做成事情的。

image

今後所說的“用戶”,都是指操作系統的用戶,“客戶”則是指外包公司的客戶,這兩者是對應的。

1 雙擊運行軟體,觸動了哪些硬體呢

1.1 滑鼠和鍵盤

電腦的輸入設備。

用戶想要告訴電腦應該做什麼,都是通過這兩個設備。

如果是一家外包公司,怎麼才能知道客戶的需求呢?你需要配備銷售、售前等角色,專門負責和客戶對接,把客戶需求拿回來,我們把這些人統稱為客戶對接員。你可以跟客戶說,有什麼事兒都找對接員。

1.2 屏幕

也就是顯示器,是電腦的輸出設備,將電腦處理用戶請求後的結果反饋給客戶。

顯示器上面顯示的東西是由顯卡控制的。

無論是顯示器還是顯卡,這裡都有個“坐標”的概念,也就是說,什麼圖像在哪個坐標,都是定義好了才畫上去的。本來在某個坐標畫了一個滑鼠箭頭,當接到滑鼠移動的事件之後,你應該按相同的方向,按照一定的比例(滑鼠靈敏度),在屏幕的某個坐標再畫一個滑鼠箭頭。

作為外包公司,當客戶給你提了需求,不管你做還是不做,最終做成什麼樣,你都需要給客戶反饋,所以你要配備交付人員,將做好的需求展示給他們看。

1.3 輸入設備驅動

其實就是客戶對接員。有時候新插上一個滑鼠的時候,會彈出一個通知你安裝驅動,這就是操作系統這家外包公司給你配備對接人員呢。當客戶告訴對接員需求的時候,對於操作系統來講,輸入設備會發送一個中斷。這個概念很好理解。客戶肯定希望外包公司把正在做的事情都停下來服務它。所以,這個時候客戶發送的需求就被稱為中斷事件(Interrupt Event)。

1.4 輸出設備驅動

顯卡會有顯卡驅動,在操作系統中稱為輸出設備驅動,也就是上面說的交付人員。

2 從點擊程式,窺探OS全貌

有了客戶對接員和交付人員,外包公司就可以處理用戶“在桌面上點擊QQ圖標”的事件了。

首先,滑鼠雙擊會觸發一個中斷,這相當於客戶告知客戶對接員“有了新需求,需要處理一下”。你會事先把處理這種問題的方法教給客戶對接員。在操作系統裡面就是調用中斷處理函數。操作系統發現雙擊的是一個圖標,就明白了用戶的原始訴求,準備運行QQ和別人聊天。

你會發現,運行QQ是一件大事,因為將來的一段時間,用戶要一直和QQ進行交互。

這就相當於你們公司接了一個大單,而不是處理零星的客戶需求,這個時候應該單獨立項。一旦立了項,以後與這個項目有關的事情,都由這個項目組來處理。

2.1文件管理系統

立項可不能隨便立,一定要有一個項目執行計劃書,說明這個項目打算怎麼做,一步一步如何執行,遇到什麼情況應該怎麼辦等等。

換句話說,對QQ這個程式來說,它能做哪些事情,每個事情怎麼做,先做啥後做啥,都已經作為程式邏輯寫在程式裡面,並且編譯成為二進位了。這個程式就相當於項目執行計劃書。

電腦上的程式有很多,它們都以二進位文件的形式保存在硬碟上。硬碟是個物理設備,要按照規定格式化成為文件系統,才能存放這些程式。文件系統需要一個系統進行統一管理,稱為文件管理子系統(File Management Subsystem)。

2.2 進程與程式

對於你們公司,項目立得多了,項目執行計劃書也會很多,同樣需要有個統一保存文件的檔案庫,而且需要有序地管理起來。

當你從資料庫裡面拿到這個項目執行計劃書,接下來就需要開始執行這個項目了。項目執行計劃書是靜態的,項目的執行是動態的。

同理,當操作系統拿到QQ的二進位執行文件的時候,就可以運行這個文件了。

  • QQ的二進位文件是靜態的,稱為程式(Program),
  • 運行起來的QQ,是不斷進行的,稱為進程(Process)。

2.3 系統調用

你會發現,一個項目要想順暢進行,需要用到公司的各種資源,比如說蓋個公章、開個證明、申請個會議室、列印個材料等等。

這裡有個兩難的權衡

  • 資源有限,甚至是涉及機密的,不能由項目組濫取濫用
  • 效率,咱是一個私營企業,保證項目申請資源的時候只跑一次,這樣才能比較高效。

為了平衡這一點,一方面涉及核心許可權的資源,還是應該被公司嚴格把控,審批了才能用;

另外一方面,為了提高效率,最好有個統一的辦事大廳,明文列出提供哪些服務,誰需要可以來申請,然後就會有回應。

在操作系統中,也有同樣的問題。

例如多個進程都要往印表機上列印文件,如果隨便亂列印進程,就會出現同樣一張紙,第一行是A進程輸出的文字,第二行是B進程輸出的文字,全亂套了。所以,印表機的直接操作是放在操作系統內核裡面的,進程不能隨便操作。但是操作系統也提供一個辦事大廳,也就是系統調用(System Call)。

系統調用也能列出來提供哪些介面可以調用,進程有需要的時候就可以去調用。

這其中,立項是辦事大廳提供的關鍵服務之一。同樣,任何一個程式要想運行起來,就需要調用系統調用,創建進程。

2.4 進程管理系統

一旦項目正式立項,就要開始執行,就要成立項目組,將開發人員分配到這個項目組,按照項目執行計劃書一步一步執行。

為了管理這個項目,我們還需要一個項目經理、一套項目管理流程、一個項目管理系統,例如程式員比較熟悉的Jira。如果項目多,可能一個開發人員需要同時執行多個項目,這就要考驗項目經理的調度能力了。

在操作系統中,進程的執行也需要分配CPU進行執行,也就是按照程式裡面的二進位代碼一行一行地執行。

於是,為了管理進程,我們還需要一個進程管理子系統(Process Management Subsystem)。如果運行的進程很多,則一個CPU會併發運行多個進程,也就需要CPU的調度能力了。

2.5 記憶體管理系統

每個項目都有自己的私密資料,這些資料不能被其他項目組看到。這些資料主要是項目在執行的過程中,產生的很多中間成果,例如架構圖、流程圖。

執行過程中,難免要在白板上或者本子上寫寫畫畫,如果不同項目的辦公空間不隔離,一方面,項目的私密性不能得到保證,A項目的細節,B項目也能看到;另一方面,項目之間會相互干擾,A項目組的人剛在白板上畫了一個架構圖,出去上個廁所,結果B項目組的人就給擦了。

如果把不同的項目組分配到不同的會議室,就解決了這個問題。當然會議室是有限的,需要有人管理和分配,並且需要一個會議室管理系統。

在操作系統中,不同的進程有不同的記憶體空間,但是整個電腦記憶體就這麼點兒,所以需要統一的管理和分配,這就需要記憶體管理子系統(Memory Management Subsystem)。

如果想直觀地瞭解QQ如何使用CPU和記憶體,可以打開任務管理器,你就能看到QQ這個進程耗費的CPU和記憶體。

項目執行的時候,有了一定的成果,就要給客戶演示。例如客戶說要做個應用,我們做出來了要給客戶看看,如果客戶說哪裡需要改,可以根據客戶的需求再改,這就需要交付人員了。

QQ啟動之後,有一部分代碼會在顯示器上畫一個對話框,並且將鍵盤的焦點放在了輸入框裡面。CPU根據這些指令,就會告知顯卡驅動程式,將這個對話框畫出來。

於是使用QQ的用戶就會很開心地發現,他能和別人開始聊天了。

當用戶通過鍵盤噼里啪啦打字的時候,鍵盤也是輸入設備,也會觸發中斷,通知相應的輸入設備驅動程式。

我們假設用戶輸入了一個“a”。這就像客戶提出了新的需求給客戶對接員。客戶對接員收到需求後,因為是對接這個項目的,因而就回來報告,客戶提新需求了,項目組需要處理一下。項目執行計劃書裡面一般都會有當遇到何種需求應該怎麼做的規定,項目組就按這個規定做了,然後讓交付人員再去客戶那裡演示就行了。

對於QQ來講,由於鍵盤閃啊閃的焦點在QQ這個對話框上,因而操作系統知道,這個事件是給這個進程的。QQ的代碼裡面肯定有遇到這種事件如何處理的代碼,就會執行。一般是記錄下客戶的輸入,並且告知顯卡驅動程式,在那個地方畫一個“a”。顯卡畫完了,客戶看到了,就覺得自己的輸入成功了。

當用戶輸入完畢之後,回車一下,還是會通過鍵盤驅動程式告訴操作系統,操作系統還是會找到QQ,QQ會將用戶的輸入發送到網路上。QQ進程是不能直接發送網路包的,需要調用系統調用,內核使用網卡驅動程式進行發送。

這就像客戶對接員接到一個需求,但是這個需求需要和其他公司溝通,這就需要依靠公司的對外合作部,對外合作部在辦事大廳有專門的視窗,非常方便。

image

總結

到這裡,一個外包公司大部分的職能部門都湊齊了。你可以對應著下圖的操作系統內核體繫結構,回顧一下它們是如何組成一家公司的。

QQ的運行過程,只是一個簡單的比喻。在後面的章節中,我會展開講述每個部分是怎麼工作的,最後我會再將這個過程串起來,這樣你就能瞭解操作系統的全貌了。

操作系統內核體繫結構圖

image

參考

趣談Linux操作系統


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • ldconfig命令的作用 ldconfig是一個動態鏈接庫管理命令,其目的為了讓動態鏈接庫為系統所共用。 ldconfig預設搜尋/lib和/usr/lib,以及配置文件/etc/ld.so.conf內所列的目錄下的庫文件。搜索出可共用的動態鏈接庫,庫文件的格式為lib***.so.**,進而創建 ...
  • 前面做了在ubuntu中安裝jenkins+docker實現自動部署,但是得安裝jdk8+tomcat8環境,比較麻煩,因此本文記錄如何將jenkins直接裝在dockers內並且實現遠程觸發功能。 docker的安裝不做闡述,詳見 https://www.cnblogs.com/dhcnblog/ ...
  • 多命令語句 Linux中我們在shell輸入命令一般是一條一條執行,但是我們同樣可以用一行語句寫出多命令,下麵就舉出幾個常見的方法 “;”分號用法 方式:command1 ; command2 用;號隔開每個命令, 每個命令按照從左到右的順序,順序執行, 彼此之間不關心是否失敗, 所有命令都會執行。 ...
  • 1、硬碟和分區 1.1 Linux中如何表示硬碟和分區 硬碟劃分為 主分區、擴展分區和邏輯分區三部分。 主分區只有四個; 擴展分區可以看成是一個特殊的主分區類型,在擴展分區中還可以建立相應的邏輯分區。 主分區一般是用來安裝操作系統。擴展分區用來存儲數據。 有個重要的Linux和Unix系統的特點:一 ...
  • 一、概述 如圖所示,在海思平臺上將記憶體分為兩個部分:os記憶體和mmz記憶體。os記憶體指:由linux操作系統管理的記憶體;mmz記憶體:由mmz驅動模塊進行管理供媒體業務單獨使用的記憶體,在驅動載入時可以指定該模塊管理記憶體的大小: 二、數據結構 1、mmz區域描述符 2、mmb記憶體描述符 hil_media ...
  • Linux中最常見的5中壓縮格式: zip gz bz2 tar.gz tar.bz2 一、.zip壓縮命令 壓縮文件 zip [壓縮文件名] [源文件] 例如: zip zijeak.zip zijeak 註意:linux中不區分文件的尾碼名,但為了人閱讀方便,在建立壓縮文件時,必須帶上壓縮尾碼 ...
  • ls - 列出目錄內容 語法: ls (選項) (參數) 選項: linux下文件的一些文件顏色的含義(預設,顏色在CRT客戶端可以修改) 最後說一下linux下文件的一些文件顏色的含義(預設,顏色在CRT客戶端可以修改) 綠色 >代表可執行文件,(綠色代表通行證的意思)呵呵 紅色 >代表壓縮文件 ...
  • 假定當前分支下,abc/123.txt需要從git倉庫中刪除: git rm -r --cached abc/123.txt //刪除abc目錄下的123.txt文件,如果要刪除abc目錄,使用命令:git rm -r --cached abc git commit -m "刪除abc目錄下的12... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...