進程與線程:06 操作系統之“樹”

操作系統核心知識回顧與思維訓練

在之前的學習中,我們深入探討了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版,這是操作系統構建的良好開端。即便大家未來不想開發操作系統,理解這一思維過程對研究和構建其他任何系統都具有重要意義。希望大家在學習中培養這種從點到面、不斷探索的思維能力,點燃思維火焰,創造出屬于自己的“大樹”。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/904318.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/904318.shtml
英文地址,請注明出處:http://en.pswp.cn/news/904318.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Android Studio Profiler

1.我們想要查看自己方法的調用鏈,或者分析方法耗時的情況,可以選擇Android Studio的Profiler,比較方便快捷。如下: 2.基本的面板參數講解: 3.可以通過搜索,查看對應的方法,以及方法的調用鏈…

33、VS中提示“以下文件中的行尾不一致。是否將行尾標準化?“是什么意思?

在Visual Studio(VS)中遇到提示“以下文件中的行尾不一致。是否將行尾標準化?”時,意味著當前打開或正在編輯的文件內部存在行尾符(EOL,End-Of-Line)格式不統一的情況。以下是詳細解釋和應對建議…

頭歌實驗 庫、表、數據的創建管理與備份遷移

第1關:創建db_ebank數據庫 drop database IF EXISTS db_ebank;/********** Begin **********/ create database db_ebank; /********** End **********/show databases; 第2關:創建數據表并設置約束 1.任務要求 在 db_ebank 數據庫中創建相應8個數據…

同城跑腿小程序幫取幫送接單搶單預約取件智能派單同城配送全開源運營版源碼優創

一、源碼描述 這是一套同城跑腿小程序,基于FastadminUniapp框架,全開源無加密,可私有化部署,包含用戶端、騎手端和運營端(后端),支持幫取/幫送模式,支持一鍵接單/搶單,主…

利用無事務方式插入數據庫解決并發插入問題

一、背景 由于項目中同一個網元,可能會被多個不同用戶操作,而且操作大部分都是以異步子任務形式進行執行,這樣就會帶來并發寫數據問題,本文通過利用無事務方式插入數據庫解決并發插入問題,算是解決問題的一種思路&…

Nuxt3還能用嗎?

Nuxt3還能用嗎? 前一段時間,我完成了整個產品,從Nuxt到Next的遷移,因為面臨了一些在框架層面就無法解決的問題。 payload json化 在所有的的Nuxt中,我們都能看到有這樣一個東西。 其實有這個東西也很正常&#xff0…

Dify 獲取天氣數據并以echarts圖表顯示

Dify 獲取天氣數據并以echarts圖表顯示 1. 創建一個 Chatflow2. 創建一個 HTTP 請求節點3. 創建一個代碼執行節點4. 創建一個直接回復節點5. 發布并預覽 1. 創建一個 Chatflow 2. 創建一個 HTTP 請求節點 請求地址:https://weather.cma.cn/api/climate?stationid5…

計算機圖形學編程(使用OpenGL和C++)(第2版)學習筆記 02.OpenGL圖像管線

1. OpenGL圖像管線 OpenGL(Open Graphics Library)是一個跨平臺的、功能強大的圖形渲染API,用于開發2D和3D圖形應用程序。它由Khronos Group維護,廣泛應用于游戲開發、圖形設計、虛擬現實等領域。 1.0.1. OpenGL的特點&#xff…

Linux架構篇、第1章_02源碼編譯安裝Apache HTTP Server 最新穩定版本是 2.4.62

Linux_基礎篇 歡迎來到Linux的世界,看筆記好好學多敲多打,每個人都是大神! 題目:源碼編譯安裝Apache HTTP Server 最新穩定版本是 2.4.62 版本號: 1.0,0 作者: 老王要學習 日期: 2025.05.01 適用環境: Centos7 文檔說明 本文…

算法基礎學習|03二分

一、思路 (1)mid(lr1)/2 if(check(mid)):1.true [mid,r] lmid 2.false [l,mid-1] rmid-1 (2)mid(lr)/2 if(check(mid)):1.true [l,mid] rmid 2.false [mid1,r] lmid1 二、模板 如何選擇模…

18. LangChain分布式任務調度:大規模應用的性能優化

引言:從單機到萬級并發的進化 2025年某全球客服系統通過LangChain分布式改造,成功應對黑五期間每秒12,000次的咨詢請求。本文將基于LangChain的分布式架構,詳解如何實現AI任務的自動擴縮容與智能調度。 一、分布式系統核心指標 1.1 性能基準…

Java泛型(補檔)

核心概念 Java 泛型是 Java SE 1.5 引入的一項重要特性,它的核心思想是 參數化類型(Parameterized Types),即通過將數據類型作為參數傳遞給類、接口或方法,使代碼能夠靈活地處理多種類型,同時保證類型安全性…

LeetCode 熱題 100:普通數組

53. 最大子數組和 給你一個整數數組 nums ,請你找出一個具有最大和的連續子數組(子數組最少包含一個元素),返回其最大和。 子數組是數組中的一個連續部分。 示例 1: 輸入:nums [-2,1,-3,4,-1,2,1,-5,4] 輸…

【kafka系列】消費者組

目錄 消費者組功能點 1. 動態負載均衡 2. 容錯高可用 3. 消費進度管理 4. 并行消費能力 5. 消費隔離性 其他要點 1. Rebalance過程詳解 2. 位移提交的精確語義 3. 消費者限速策略 4. 跨機房消費設計 消費者組功能點 1. 動態負載均衡 核心機制:通過Rebal…

黑馬點評day01(基于Redis)

1.7 Redis代替session的業務流程 1.7.1、設計key的結構 首先我們要思考一下利用redis來存儲數據,那么到底使用哪種結構呢?由于存入的數據比較簡單,我們可以考慮使用String,或者是使用哈希,如下圖,如果使用…

Python爬蟲實戰:獲取優美圖庫各類高清圖片,為用戶提供設計素材

一、引言 在互聯網時代,高清壁紙資源豐富多樣,而優美圖庫作為一個提供大量精美壁紙的網站,吸引了眾多用戶。通過 Python 爬蟲技術,可以自動化地從該網站獲取所需的壁紙資源,為用戶節省時間和精力。然而,網站通常會采取反爬措施來防止數據被惡意抓取,因此需要在爬蟲程序…

Go反射-通過反射調用結構體的方法(帶入參)

使用反射前,我們需要提前做好映射配置 papckage_struct_relationship.go package reflectcommonimport (api "template/api" )// 包名到包對象的映射 var structMap map[string]func() interface{}{"template/api": func() interface{} { re…

Git_.gitignore文件簡介及使用

.gitignore 這個文件的作用就是告訴Git哪些文件不需要添加到版本管理中。實際項目中,很多文件都是不需要版本管理的,比如Python的.pyc文件,Git會根據這個文件里配置的這些規則來判斷是否將文件添加到版本控制中。 注意,直接新建文…

HarmonyOS ArkUI安全控件開發指南:粘貼、保存與位置控件的實現與隱私保護實踐

目錄 安全控件1. 粘貼控件1.1 約束與限制1.2 開發步驟 2. 保存控件2.1 約束與限制2.2 開發步驟 3. 位置控件3.1 約束與限制3.2 開發步驟 安全控件 安全控件是系統提供的一組系統實現的ArkUI組件,其中保存控件在用戶首次使用時,會彈出通知彈窗&#xff0…

C++筆記之接口`Interface`

C++筆記之接口Interface code review! 一個簡潔簡短的 C++ 接口實現示例: #include <iostream>// 1. 定義接口(抽象類) class Shape {public: