操作系統核心知識回顧與思維訓練
在之前的學習中,我們深入探討了CPU管理相關內容。
- CPU管理內容回顧:我們學習了CPU直觀管理方法,了解如何讓簡單程序執行,分析了CPU效率低下的原因及處理辦法,即實現多程序執行。接著引出進程概念,深入探討多進程圖像以及操作系統實現多進程所需的準備工作,其中核心是交替執行,包括用戶級線程和內核級線程的交替執行實現方式與相關源碼。
- 學習難點與課程目的:目前所學內容是操作系統中最核心的部分,理解起來難度較大。每年講到此處,很多同學會感到吃力。為激勵大家,同時幫助大家訓練思維能力,掌握構建復雜系統的方法,我們引入本堂課。本堂課旨在讓大家明白操作系統從初始想法逐步發展成復雜系統的過程,培養大家研究和構建復雜系統的決心與能力。
復雜系統與操作系統
復雜系統的時代意義
霍金曾指出,在21世紀,復雜系統將成為科學發展的核心。如今,像操作系統、互聯網、大腦神經網絡、豪華汽車、石油管道、宇宙、生物群落、生命循環等都屬于復雜系統。當前,對這些復雜系統的研究備受關注,例如腦科學領域對大腦工作機制的探索。若人類能深入了解這些復雜系統,如大腦工作原理、人體運作機制,將極大推動科學發展,甚至攻克癌癥等難題。
操作系統的發展歷程
操作系統作為復雜系統的典型代表,其發展并非一蹴而就。就像一棵大樹是從一顆種子逐漸生長而成,操作系統也是從一個初始想法,歷經不斷發展與完善,才形成如今龐大復雜的系統。我們接下來將梳理操作系統從簡單到復雜的發展思路,幫助大家理解其構建過程。
學習的本質與思維培養
學習的正確方式
哲學家曾說:“人的頭腦不是一個盛水的裝滿水的器皿,而是一團需要點燃的火。”這意味著學習不應僅僅是知識的機械記憶,像將知識簡單填充進大腦,只為應付考試。這種學習方式雖能記住知識,但無法將其轉化為思考和解決問題的能力,知識也就失去了實際價值。真正的學習應從一個點出發,激發思考,不斷向外探索,如同火焰燃燒般,將知識轉化為解決問題的動力。
操作系統學習的啟示
操作系統的構建過程充分體現了這種學習和思維方式。它從一個初始的小想法,不斷拓展思維,逐步實現復雜功能,最終形成完整系統。我們在學習操作系統時,也要培養這種從點到面、不斷深入思考的能力,學會運用已有知識解決實際問題,點燃思維的火焰,而不是被動接受知識。
操作系統的構建思路
從簡單想法到多程序切換
管理CPU的最初想法是設置PC初值,使其取指執行,讓CPU運轉起來,但這種方式導致CPU利用率低。
為解決此問題,借鑒生活中燒水時可同時做其他事的智慧,提出在CPU執行到需要等待時,切換執行其他程序,從而實現多個程序切換。由于程序切換類似于跳轉,我們利用棧來實現這一功能,通過實踐和思考,不斷改進和完善實現方式。
解決切換中的問題
在使用棧實現程序切換過程中,出現了混亂問題,一個棧無法滿足需求,于是自然想到使用兩個棧。
進一步明確在業務切換時,需先切換棧,再根據棧進行其他操作,如找到TCB(任務控制塊),切換新棧等,從而實現用戶多個執行序列之間的切換。
但此時僅能在用戶態實現,為實現在內核態的切換,通過思維遞進,考慮到內核也有棧,進而思考從用戶棧到內核棧,再到TCB之間的切換關系,最終形成兩套棧的切換機制。
實現想法的具體目標與實踐
有了上述想法后,我們需要在實際計算機上實現這些切換。以在屏幕上交替打出a和b為具體目標,該目標能體現多個執行序列在內核中的交替切換,若能實現,說明我們的想法具有可行性。
Linux 0.01最初就是在屏幕上交替打出a和b,這是Linux操作系統發展的起點,如同小樹的種子發芽。
為實現此目標,我們創建兩個進程,每個進程在死循環中分別循環打出a和b。
在這里插入圖片描述
具體實現過程涉及系統調用fork,fork執行int 0x80,在內核中通過一系列操作,如執行CS_call、cs_folk,最終跳轉到copy_process,在該函數中創建新的PCB(進程控制塊)和棧,設置相關參數,如eip指向打印a或b的函數地址,ax設為0等。父進程創建完子進程后,調用wait將自身狀態變為阻塞態,然后調用schedule進行進程調度。
調度算法與切換實現
schedule負責選擇進程,初始可采用簡單算法選擇第一個進程,后續可根據需求優化。選擇進程后,通過switch_to進行切換,切換過程基于對硬件手冊的研究,利用TSS(任務狀態段)完成,即將當前進程的CPU寄存器內容保存到TSS,再將下一個進程TSS中的內容恢復到CPU。
當a進程執行時,eip指向打印a的函數地址,開始打印a。此時為實現a和b的交替打印,需要引入調度點調用schedule,而進入內核調用schedule靠中斷實現,經思考選擇時鐘中斷。初始化時鐘中斷后,在每次時鐘中斷時,讓當前進程的counter減一,當counter減為0時,調用schedule,從而實現a和b進程的交替執行,在屏幕上交替打出a和b。
總結與展望
通過梳理操作系統從初始想法到實現屏幕上交替打出a和b的過程,我們串聯起之前所學知識,清晰呈現了一個想法如何通過程序逐步實現的思維過程。如果大家能根據上述思路,獨立編寫代碼實現該功能,就相當于擁有了操作系統的0.01版,這是操作系統構建的良好開端。即便大家未來不想開發操作系統,理解這一思維過程對研究和構建其他任何系統都具有重要意義。希望大家在學習中培養這種從點到面、不斷探索的思維能力,點燃思維火焰,創造出屬于自己的“大樹”。