Linux操作系統從入門到實戰(十六)馮諾依曼體系結構,操作系統與系統調用和庫函數概念
- 前言
- 一、馮諾依曼體系結構
- 1. 馮諾依曼體系是什么?
- 2. 核心部件有哪些?
- 3. 數據是怎么跑的?
- 4. 發文件的流程也一樣
- 5. 為什么程序(比如C/C++寫的軟件)必須先加載到內存才能運行?
- 二、操作系統
- 1. 什么是操作系統?
- 2. 為什么要設計操作系統?
- 3. 操作系統的核心功能:
- 4. 怎么理解“管理”?
- 三、系統調用和庫函數概念
- 1. 先回憶個前提
- 2. 什么是系統調用?
- 3. 系統調用的特點
- 4. 庫函數又是什么?
- 5. 系統調用和庫函數的關系
前言
在前文中,我們圍繞 Linux 環境,系統講解了 Git 版本控制系統的核心知識,也展開了 GDB/CGDB 調試器的全方位使用詳解。
- 本篇博客將聚焦于馮·諾依曼體系結構與操作系統概念。
我的個人主頁,歡迎來閱讀我的其他文章
https://blog.csdn.net/2402_83322742?spm=1011.2415.3001.5343
我的Linux知識文章專欄
歡迎來閱讀指出不足
https://blog.csdn.net/2402_83322742/category_12879535.html?spm=1001.2014.3001.5482
一、馮諾依曼體系結構
1. 馮諾依曼體系是什么?
簡單說,現在我們用的筆記本、公司的服務器,幾乎都在遵循一個“規矩”——馮諾依曼體系。這個規矩規定了:電腦要干活,得靠幾個核心部件配合,而且它們的“溝通方式”是固定的。
2. 核心部件有哪些?
馮諾依曼體系主要有3類核心部件:
-
輸入單元:負責把我們的操作“告訴”電腦。比如鍵盤(敲字)、鼠標(點圖標)、掃描儀(掃文件),都是輸入設備——你操作它們,數據就進電腦了。
-
中央處理器(CPU):電腦的“大腦”,負責真正干活。里面有兩個關鍵角色:
- 運算器:算數學題、比較大小(比如1+1=2,判斷“a和b誰大”);
- 控制器:指揮其他部件干活(比如“讓鍵盤把輸入的字送過來”“讓顯示器顯示結果”)。
-
輸出單元:負責把電腦的結果“告訴”我們。比如顯示器(顯示畫面、文字)、打印機(打印文件),都是輸出設備——電腦處理完,結果通過它們給我們看。
馮諾依曼體系里,有個絕對不能破的規矩,也是理解的核心:
- 所有部件(輸入、輸出、CPU)都不能直接“私聊”,必須通過一個“中間人”——內存(存儲器)。
具體說:
- CPU(大腦),只認內存。它要讀數據、寫數據,只能找內存,絕對不直接碰鍵盤、鼠標、顯示器這些外設(輸入/輸出設備)。
- 外設(鍵盤、顯示器等)也一樣,想給電腦傳數據(比如你敲的字),或者想顯示電腦的結果,只能先把數據放到內存里,或者從內存里拿數據,不能直接找CPU。
3. 數據是怎么跑的?
光說規矩太抽象,我們拿“用QQ和朋友聊天”來看看數據是怎么按這個規矩流動的——
-
你發消息時:
- 你在鍵盤上敲字(輸入單元工作),敲的內容先傳到內存;
- CPU從內存里拿你敲的字,處理一下,處理完再放回內存;
- 內存再把處理好的消息傳給網絡設備(也算外設),通過網絡發給朋友。
-
朋友收到消息時:
- 朋友的電腦通過網絡設備(外設)收到消息,先存到他電腦的內存;
- 他電腦的CPU從內存里拿消息,處理一下(比如“顯示在聊天窗口”),再放回內存;
- 內存把消息傳給顯示器(輸出單元),朋友就看到你的消息了。
4. 發文件的流程也一樣
比如你給朋友發一個Word文檔:
- 文檔本來存在你的硬盤里(硬盤也是外設),發文件時,硬盤先把文檔數據讀到內存(給前臺);
- CPU處理一下(比如“打包文件”“標記收件人”),再放回內存;
- 內存通過網絡設備把文件發出去;
- 朋友收到后,文件數據先到他的內存,CPU處理后,再從內存寫到他的硬盤(存起來),或者直接在顯示器上打開。
5. 為什么程序(比如C/C++寫的軟件)必須先加載到內存才能運行?
- 因為CPU只認內存
程序平時是存在硬盤里的(硬盤是外設),就像文件存在抽屜里。
CPU要“執行”程序,必須讓程序先到內存里——就像你要讀抽屜里的文件,得先拿到桌面上(內存)才能看。這是馮諾依曼體系的硬性規定。
二、操作系統
1. 什么是操作系統?
你可以把操作系統(簡稱OS)理解成電腦/手機里的“大管家”。
- 任何電腦、手機、甚至智能手表,都得有這么個“管家”才能正常干活。
這個“管家”主要由兩部分組成:
-
內核:相當于管家的“大腦”,管著最核心的事兒,比如:
- 進程管理:同時開著微信、瀏覽器、游戲,內核得協調它們誰先占用電腦的“算力”(CPU),別打架;
- 內存管理:電腦的“臨時倉庫”(內存)就那么大,內核得分配好空間,保證每個程序都有地方放數據,用完了還能及時收回來;
- 文件管理:我們存的照片、文檔、視頻,內核得給它們“編好號、分好類”,讓我們想找的時候一點就能打開(比如Windows的文件夾、手機的文件管理);
- 驅動管理:電腦外接的打印機、鼠標,手機連的耳機、充電器,內核得懂它們的“語言”(通過驅動程序),不然設備插了也用不了。
-
其他程序:相當于管家的“助手”,幫著內核干活,比如:
- 函數庫:一些現成的“工具包”,比如計算、畫圖的基礎功能,手機APP或電腦軟件可以直接拿來用,不用自己從零開發;
- Shell程序:我們和操作系統溝通的“翻譯官”,比如Windows的命令提示符(輸入
dir
看文件)、蘋果的終端,你輸入指令,它傳給內核去執行。
2. 為什么要設計操作系統?
簡單說,就是為了“上下討好”:
- 對下(管硬件):電腦里的CPU、內存、硬盤、顯卡,手機里的芯片、攝像頭、電池,這些硬件本身“很笨”,不知道該干啥。操作系統就負責指揮它們:“CPU,你先處理一下微信消息;硬盤,把這張照片存到D盤去”,讓所有硬件高效配合,不亂跑。
- 對上(服務軟件和用戶):我們用的微信、王者榮耀,或者電腦里的Excel,這些應用程序不想操心“怎么調用CPU”“怎么存文件”——操作系統就提供一個“舒適的環境”,應用程序只需要告訴操作系統“我要干啥”,剩下的交給操作系統處理就行。
3. 操作系統的核心功能:
- 操作系統它就干一件事:管理。
就像學校里的教務處,不管上課、不管改作業,但負責排課表、管教室、安排考試——讓老師能好好教書,學生能好好上課。
操作系統也一樣,管好硬件資源,讓應用程序能順利運行,用戶能用得舒服。
4. 怎么理解“管理”?
- 被管理的對象:比如學校里的學生(對應電腦里的“資源”,像運行的程序、內存空間、文件等)。
- 怎么管理?
- 描述對象:先得知道每個學生的情況——比如記下來“張三,高一2班,成績A”(對應操作系統里的“數據結構”,記錄每個程序的狀態、內存用了多少、文件存在哪);
- 組織對象:把學生分好類、排好序——比如按班級分組,按學號排隊(對應操作系統里的“調度”,比如給程序排個運行順序,給文件分個文件夾);
- 協調對象:輔導員(對應操作系統的具體模塊,比如進程管理器)負責日常管理,校長(對應內核)統籌全局,確保整個學校(電腦)有序運行。
三、系統調用和庫函數概念
1. 先回憶個前提
-
前面說過,操作系統(OS)是管理電腦所有硬件(CPU、內存、硬盤等)的“大管家”。
-
硬件這東西很“金貴”,不能隨便讓外面的程序(比如微信、瀏覽器)直接碰——萬一程序亂操作,可能把硬盤里的文件刪了,或者占滿內存讓電腦卡崩。
-
所以,所有想操作硬件的需求,都得經過操作系統同意,由操作系統來“代勞”。那程序怎么跟操作系統“溝通”呢?這就要用到“系統調用”了。
2. 什么是系統調用?
系統調用可以理解成:操作系統給上層程序(比如APP、軟件)開的“官方接口”。
- 就像你想讓物業幫你修水管,不能直接闖進物業辦公室瞎指揮,得通過物業提供的“報修電話”(官方接口)才行。
- 程序想讓操作系統幫忙做一些底層操作(比如讀硬盤里的文件、申請內存空間、打印東西),也得通過這些“官方接口”——也就是系統調用。
舉個例子:
當你用記事本寫了一段話,點“保存”的時候,記事本程序不會自己直接去操作硬盤(它也沒這權限),而是會通過一個系統調用,告訴操作系統:“請幫我把這些數據寫到硬盤的XXX位置”。操作系統收到請求后,會自己去操作硬盤完成保存,然后告訴程序“搞定了”。
3. 系統調用的特點
- 系統調用是操作系統直接提供的,功能很基礎、很底層,能完成所有核心操作(比如讀寫文件、管理進程)。
- 但它有個缺點:對使用者(程序員)要求比較高。
比如你想通過系統調用讀一個文件,可能需要自己處理很多細節:先檢查文件是否存在、申請內存緩沖區、處理讀寫錯誤(比如文件被刪了)……步驟多,容易出錯。
4. 庫函數又是什么?
- 庫函數可以理解成:程序員對系統調用做的“封裝和優化”,目的是讓開發者用起來更方便。
就像物業的“報修電話”雖然能解決問題,但步驟繁瑣(要報地址、報問題、等確認),于是有人專門做了個“便民報修小程序”,把這些步驟簡化成“選地址+選問題+提交”,你用起來就簡單多了。這個“小程序”就相當于“庫函數”。
舉個例子:
C語言里有個庫函數叫
fopen
(打開文件),它的底層其實就是調用了系統調用。但fopen
幫你處理了很多細節:比如自動檢查文件是否存在、默認申請了內存緩沖區、出錯了會返回統一的錯誤碼……程序員用fopen
打開文件,比直接用系統調用簡單10倍。
5. 系統調用和庫函數的關系
簡單說:很多庫函數是基于系統調用實現的,是系統調用的“升級版”。
- 系統調用是“底層基礎”,是操作系統直接提供的“官方接口”,功能全但繁瑣;
- 庫函數是“上層工具”,是對系統調用的封裝,更易用、更適合日常開發。
承上啟下:和進程管理的關系
- 前面說過,操作系統管理進程的邏輯是“先描述,再組織”(用結構體描述進程,用鏈表組織進程)。
-
- 那程序怎么創建一個新進程、結束一個進程呢?其實也是通過系統調用!比如操作系統會提供“創建進程”的系統調用,程序通過它告訴操作系統“幫我建個新進程”,操作系統就會用結構體描述這個新進程,再把它加到鏈表中管理。后面學進程的時候,我們會具體看到這些系統調用是怎么工作的
以上就是這篇博客的全部內容,下一篇我們將繼續探索Linux的更多精彩內容
我的個人主頁
歡迎來閱讀我的其他文章
https://blog.csdn.net/2402_83322742?spm=1011.2415.3001.5343
我的Linux知識文章專欄
歡迎來閱讀指出不足
https://blog.csdn.net/2402_83322742/category_12879535.html?spm=1001.2014.3001.5482
非常感謝您的閱讀,喜歡的話記得三連哦 |