Unix 發展史概覽

這里是一個簡明清晰的 Unix 發展史概覽,涵蓋從起源到現代的重要節點和演變過程。


Unix 發展史概覽

1. Unix 起源(1969年)

  • 貝爾實驗室:Ken Thompson 和 Dennis Ritchie 開發出 Unix 操作系統。
  • 最初設計目標:簡潔、可移植、多任務。
  • 用匯編語言開發,后期移植為 C 語言,極大推動了跨平臺發展。

2. 早期版本(1970年代)

  • Unix Version 1 - 6(1971-1975)

    • 基礎系統設計與完善。
    • Version 6 (V6) 是首個廣泛傳播的版本,成為眾多高校教學和研究基礎。
  • Unix Version 7(1979)

    • 被稱為第一個“現代Unix”,功能更完備。
    • 引入 Bourne Shell、多種系統調用等。

3. Unix 分支與商業化(1980年代)

  • BSD Unix(伯克利軟件發行版)

    • 加入網絡協議棧(TCP/IP)、虛擬內存支持。
    • BSD 4.2 和 4.3 成為高性能的學術與商業系統基礎。
  • AT&T System V

    • 商業版本 Unix,廣泛推廣。
    • 引入 System V Interface Definition(SVID),統一標準。
  • Unix Wars

    • BSD 和 System V 爭奪市場主導權,導致標準割裂。

4. 標準化與統一(1990年代)

  • POSIX 標準

    • 統一操作系統接口,促使各種 Unix 系統兼容。
  • Unix 品牌管理

    • IEEE 和 The Open Group 推出 “The Single UNIX Specification”。
  • Linux 崛起(1991起)

    • Linus Torvalds 開發的免費 Unix-like 內核,快速普及。

5. 現代 Unix 與 Unix-like 系統(2000年代至今)

  • 商業 Unix 系統

    • 如 IBM AIX、HP-UX、Solaris 等繼續發展。
  • 開源 Unix-like 系統

    • BSD 系列(FreeBSD、OpenBSD、NetBSD)廣泛應用。
    • Linux 作為主流服務器和嵌入式平臺。

小結時間線

1969   Unix誕生(貝爾實驗室)
1970s  Unix早期版本(V1-V7)
1980s  BSD Unix & System V 發展與分裂
1990s  POSIX標準化,Linux興起
2000s  現代Unix與開源Unix-like系統共存

在 UNIX V6 中(特別是 PDP-11 架構下),只有進程(process)概念沒有線程(thread) 的支持。我們來詳細對比一下:


🧠 1. UNIX V6 的執行單元是「進程」

? 每個進程有:

  • 獨立的 地址空間(雖然沒有 MMU,但通過 relocation/base 寄存器實現簡單隔離)
  • 獨立的 堆棧、代碼段、數據段
  • 獨立的 打開的文件描述符列表
  • 獨立的 用戶態 / 內核態棧
  • PCB(進程控制塊):proc 結構體

📌 換句話說:一個進程就是一個完整的程序的運行實例


? 2. UNIX V6 沒有線程

🚫 不存在:

  • 多個線程共享同一地址空間
  • 用戶態或內核態的線程庫
  • 沒有 pthread、也沒有類似 clone() 的系統調用

在 UNIX V6 中,線程等同于進程的最小執行單元還未誕生


📚 補充:現代對比

特性UNIX V6現代 Linux / Windows
線程支持? 無? 有 pthread / clone / TCB
地址空間隔離? 基于 relocation? 基于 MMU
并發機制? 多進程 + fork()? 多進程 + 多線程
同步原語? 無? Mutex、Sem、Cond 等

?? 總結一句話:

UNIX V6 的“并發”全靠 fork() 創建多個獨立進程完成,沒有線程這個概念。
UNIX 在早期(包括 UNIX V6/V7)沒有線程的概念,所有的并發都是通過 fork() 創建進程來實現的,每個進程有獨立的地址空間,沒有共享內存,也沒有線程同步原語。


“LWP(輕量級進程,Light Weight Process)” 是線程發展歷史中一個非常關鍵的概念,尤其在早期 UNIX(如 Solaris)中引入,是連接用戶線程與內核線程的中間層。下面我詳細解釋:


? 什么是 LWP(Light Weight Process)?

LWP 是一種內核調度單位,它像一個普通進程一樣能被內核調度,但:

  • 它和傳統的 UNIX 進程相比更輕量
  • 允許多個用戶線程綁定到一個或多個 LWP 上
  • 引入 用戶線程(user-level thread)與內核線程(kernel-level thread)之間的分離

🧠 為什么引入 LWP?

早期 UNIX:

  • 每個進程是調度單位
  • 多線程程序會導致所有線程都阻塞(因為調度粒度是整個進程)

引入 LWP 的目的:

  • 實現線程調度 不完全依賴內核
  • 用戶空間可以快速切換線程,減少系統調用
  • 實現 M:N 模型(多個用戶線程映射到多個內核線程)

🔧 結構示意圖

               用戶空間+--------------------------------+|  用戶線程1   用戶線程2   ...   |+--------------------------------+↓         ↓LWP1       LWP2        <- 綁定關系↓         ↓內核線程1   內核線程2      <- LWP由內核調度

📘 Solaris 中的 LWP 模型(經典代表)

概念描述
用戶線程程序員使用的線程接口(如 thr_create
LWP用戶線程與內核之間的橋梁,由內核調度
內核線程OS 級別線程,是 CPU 的實際執行單位
M:N 模型多個用戶線程通過多個 LWP 共享少量內核線程

🧵 與 POSIX 線程的關系

  • POSIX pthreads 抽象的是用戶線程接口
  • 在 Solaris 中,pthreads 是基于 LWP 實現的
  • 在 Linux 中,pthreads 實際上就是 每個線程 = 一個 LWP = 一個內核線程,是 1:1 模型

🔍 LWP 的優劣

優點缺點
用戶線程調度效率高實現復雜(需要管理映射關系)
可以復用 LWP,節省系統資源用戶線程阻塞時,LWP 也會被阻塞
更靈活:適合 IO 密集 + CPU 密集很難在 Linux 等平臺通用實現

🧠 總結一句話:

LWP 是一種由內核調度的輕量進程,用于支持用戶線程的執行,是早期 M:N 多線程模型的關鍵組成。

現代主流系統(如 Linux、macOS)已經普遍采用 1:1 模型(每個線程一個內核線程),放棄了復雜的 M:N 和 LWP,但它在線程設計歷史上具有里程碑意義。


是的,RT-Thread Smart 中的 LWP(Light Weight Process) 與 Solaris、早期 UNIX 系統中的 LWP 含義有相似之處,但也有一些區別,下面我來詳細說明:


? RT-Thread Smart 中的 LWP 是什么?

RT-Thread Smart 是 RT-Thread 的類 Unix 擴展(用戶空間 + 內核空間),LWP 是 Smart 中的用戶態進程模型實現的核心結構,代表一個用戶空間進程

在 RT-Thread Smart 中,LWP(輕量級進程):

  • 是一種用戶態進程,具有獨立的地址空間
  • 擁有獨立的虛擬內存、文件描述符表、信號處理等
  • 內核調度的是線程(rt_thread),線程屬于某個 LWP
  • 一個 LWP 可以有多個線程(共享用戶空間)

🧠 和傳統 UNIX 的 LWP 比較

特性Solaris / UNIX LWPRT-Thread Smart LWP
所屬系統UNIX(如 Solaris)RT-Thread Smart
實質用戶線程的橋梁 / 調度單位用戶空間進程
是否被內核調度是(間接調度)不是(線程調度)
是否有獨立地址空間否(多個線程共享)是(每個 LWP 是獨立地址空間)
線程關系多個線程通過 LWP 映射到內核線程多個線程屬于同一個 LWP,共享資源
內核視角LWP 是調度單位LWP 是運行環境(調度單位是 rt_thread

? 可以簡單類比為:

  • UNIX LWP ≈ 內核調度用的線程容器
  • RT-Thread LWP ≈ 獨立的用戶進程(帶地址空間)

📦 RT-Thread Smart 中的進程-線程模型

結構大致如下:

         內核空間
+----------------------------+
|        RT-Thread           |
|  +---------------------+  |
|  |  rt_thread(線程)  | <----- 調度單位
|  +---------------------+  |
|  |       LWP(進程)   | <----- 用戶進程環境
|  +---------------------+  |
+----------------------------+用戶空間(每個進程)
+----------------------------+
|  main() 用戶代碼           |
|  libc, heap, stack, ...    |
+----------------------------+

?? 為什么叫 LWP?

這個命名是借鑒 UNIX 世界的“輕量級進程”的概念,強調:

  • 它不是傳統大內核進程(如 Linux task_struct 那種)
  • 它比傳統進程更“輕”,適用于嵌入式環境
  • 支持獨立地址空間、用戶態運行,是 Smart 支持應用層的核心機制

? 總結

RT-Thread Smart 的 LWP 是“用戶態進程”的抽象,與傳統 UNIX 的 LWP 都強調輕量、可調度、可擴展,但意義略有差異。

方面RT-Thread Smart 中的 LWP
本質用戶進程(獨立地址空間)
是否支持線程是,多個線程屬于一個 LWP
是否被調度否,調度的是線程
內存隔離支持 MMU 的隔離(Smart 模式)

在具有多線程與多進程支持的操作系統(如 Linux、RT-Thread Smart 等)中,調度屬于不同進程的線程調度同一進程內的線程,在實現層面有一些關鍵區別,主要體現在以下幾個方面:


? 1. 地址空間切換(上下文)

? 不同進程的線程切換

  • 需要切換地址空間(切換頁表或 MMU 上下文);
  • 內核必須刷新 MMU 頁表基地址,切換到另一個進程的內存視圖;
  • 代價更高,因為涉及 TLB flush、cache coherence 等;
  • 所有進程私有的數據(堆、棧、代碼段)都會發生變化。

👉 舉個例子:

進程 A 的線程 T1 → 切換 → 進程 B 的線程 T2

系統必須切換頁表,所有內存訪問都按 B 的上下文來解釋。


? 同一進程的線程切換

  • 無需切換地址空間,因為線程共享進程的地址空間;
  • 只需要切換線程的 CPU 上下文(寄存器、堆棧等);
  • 開銷較小,調度速度快;
  • 常見于用戶態多線程庫、POSIX 線程(pthread)等。

👉 舉個例子:

進程 A 的線程 T1 → 切換 → 進程 A 的線程 T2

頁表不動,僅換棧、寄存器等上下文。


? 2. 資源管理與權限

不同進程的線程:

  • 擁有獨立的資源和權限
  • 文件描述符、信號處理器、環境變量等互不干擾;
  • 更適合服務隔離、安全場景。

同一進程的線程:

  • 共享幾乎所有資源:堆、靜態區、文件句柄、socket 等;
  • 適合高效協作、低開銷計算,但不利于隔離。

? 3. 調度粒度與策略

調度項目同進程線程切換跨進程線程切換
時間片輪轉通常一樣通常一樣
優先級調度適用適用
地址空間切換否(保留)是(重載)
系統負擔較低(僅 CPU 上下文)較高(CPU + MMU 上下文)

? 4. 在 RT-Thread Smart 中的例子

RT-Thread Smart 的 LWP + thread 模型支持這兩類調度:

示例結構:

進程 A(LWP 1)├── 線程 T1└── 線程 T2進程 B(LWP 2)└── 線程 T3
  • T1 ? T2 切換:共享地址空間,僅切換 rt_thread
  • T2 ? T3 切換:需要執行地址空間切換(虛擬內存重新映射)

? 總結表格

比較項同進程線程切換跨進程線程切換
是否切換地址空間
切換開銷低(快)高(慢)
資源共享程度高(幾乎完全共享)低(完全隔離)
安全性
典型用途多線程并發多任務/服務隔離

好問題!關于“進程和線程的關系”以及“多進程多線程的調度”,我來詳細解釋一下:


1. 一個進程是一個內核線程嗎?

  • 傳統意義上:不完全是。

  • 進程(Process) 是資源分配的單位,擁有獨立地址空間、打開的文件等。

  • 線程(Thread) 是 CPU 調度的基本單位,負責執行代碼。


在不同操作系統模型中的關系:

模型類型說明
1:1 模型(如 Linux)每個線程是一個內核線程,進程是線程集合。
進程本身不調度,調度的是線程。
M:N 模型(如 Solaris 舊版、RT-Thread Smart)用戶線程與內核線程映射不是一一對應。進程里可有多個用戶線程,通過多個內核線程調度。
單線程進程模型(如早期 UNIX)一個進程對應一個執行單元(線程),即進程就是內核線程。

2. 多個進程多個線程如何調度?

在現代系統(1:1 模型,如 Linux):

  • 內核維護所有線程的 PCB(Linux 中是 task_struct,每個線程一個);

  • 調度器按時間片、優先級等策略從所有線程里選擇一個運行;

  • 線程調度時,如果跨進程(切換地址空間),內核完成頁表切換;

  • 同進程線程調度時,內核切換 CPU 上下文,無需切換地址空間。


舉個例子:

假設有兩個進程:

  • 進程A 有線程A1、A2
  • 進程B 有線程B1、B2、B3

內核調度器會在這 5 個線程中輪換執行,比如:

A1 → A2 → B1 → B2 → B3 → A1 → ...

切換不同進程線程時切換地址空間,同進程線程切換時地址空間不變。


3. 調度器怎么實現?

  • 維護就緒隊列:里面存放所有可運行的線程;

  • 上下文切換:保存當前線程狀態,恢復下一個線程狀態;

  • 切換頁表(跨進程)或保持不變(同進程);

  • 搶占機制:支持搶占式多任務,定時器中斷觸發調度。


4. 在 RT-Thread Smart 中

  • 進程被稱為 LWP(輕量級進程);

  • 內核調度單位是線程(rt_thread);

  • 每個線程屬于某個 LWP(進程);

  • 調度器從所有線程中選一個運行;

  • 切換不同 LWP 線程時,完成地址空間切換。


總結:

概念說明
進程資源容器,擁有獨立地址空間
線程CPU 調度單位,執行代碼的“實體”
一個進程=一個內核線程?早期 UNIX 是,現代系統否。
多進程多線程調度統一調度所有線程,切換時根據是否跨進程切換地址空間。

下面是一個用 Mermaid 畫的關于 多進程多線程調度 的簡化流程圖示例,重點表現線程調度時是否需要切換地址空間:

flowchart TDStart[調度器觸發]SelectThread[選擇下一個線程執行]SameProcess{是否與當前線程同一進程?}SwitchContext[切換線程上下文]SwitchAddressSpace[切換地址空間(頁表切換)]RunThread[線程運行]TimerInterrupt[定時器中斷]Start --> SelectThreadSelectThread --> SameProcessSameProcess -- 是 --> SwitchContextSameProcess -- 否 --> SwitchAddressSpaceSwitchAddressSpace --> SwitchContextSwitchContext --> RunThreadRunThread --> TimerInterruptTimerInterrupt --> Start

說明:

  • 調度器周期性觸發(通常由定時器中斷觸發)。

  • 選擇下一個要執行的線程。

  • 判斷是否是同一進程線程:

    • 是:只切換線程上下文(寄存器、棧指針等)。
    • 否:需要先切換地址空間(更新 MMU 頁表),再切換上下文。
  • 切換完成后,線程開始運行。

  • 運行過程中,定時器中斷再次觸發調度。


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

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

相關文章

基于coze studio開源框架二次定制開發教程

目錄 一、 項目介紹 1.1 什么是Coze Studio 1.2 功能清單 1.3對比商業版本 二、 功能定開說明 2.1 技術棧簡介 2.2 項目架構

RHCE認證題解

考前說明請勿更改 IP 地址。DNS 解析完整主機名&#xff0c;同時也解析短名稱。? 所有系統的 root 密碼都是 redhat? Ansible 控制節點上已創建用戶賬戶 devops。可以使用 ssh 訪問? 所需的所有鏡像保存在鏡像倉庫 utility.lab.example.compodman 可使用下述賬號登錄使用 用…

調用com對象的坑

1、諫言 最近我在弄64位調用32位dll的問題&#xff0c;在幾種IPC之間&#xff0c;最后考慮了調用COM 畢竟我們只在windows平臺 2、第一坑–修改編譯后都需要重新注冊&#xff0c;注冊表 一直以為只需要編譯就好了&#xff0c;結果調用沒反應、報錯什么的&#xff0c;需要先撤銷…

【Python】PyQt 實現 TreeWidget 多級聯動選擇邏輯,打造素材搜索自定義樹形控件!

在開發自己的寫作素材管理工具時,我遇到了一個非常典型但又略顯棘手的 UI 問題: ?? 如何實現一個“可自由勾選分類標簽”的樹形結構界面,支持父子節點自動聯動勾選,提升用戶體驗? 雖然 PyQt 的 QTreeWidget 是構建多層分類結構的好幫手,但默認卻不具備父子節點的自動級…

27-數據倉庫與Apache Hive-2

1.數倉開發語言概述 理論上來說&#xff0c;任何一款編程語言只要具備讀寫數據、處理數據的能力&#xff0c;都可以用于數倉的開發。比如大家耳熟能詳的C、java、Python等&#xff1b; 關鍵在于編程語言是否易學、好用、功能是否強大。遺憾的是上面所列出的C、Python等編程語言…

軟件測試——接口自動化

測試中的自動化分為兩類&#xff1a; 1.ui自動化&#xff08;web、移動端&#xff09;2.接口自動化 前面的博客中&#xff0c;我們已經講解了web端的ui自動化&#xff0c;感興趣的同學可以去看看&#xff1a;軟件測試——自動化測試常見函數_自動化測試代碼編寫-CSDN博客 今…

Flask一個用戶同時只能在一處登錄實現

場景&#xff1a;web頁面如果多人用同一賬號同時登錄操作&#xff0c;可能會導致數據等的混亂甚至出現故障。并且可能損害開發者的利益。為此&#xff0c;本篇文章就講下如何實現同一賬戶同時僅能一個地方登錄操作。 思路&#xff1a;1. 用戶登陸時生成token&#xff08;uuid.u…

聯發科芯片組曝高危漏洞:越界寫入缺陷危及智能手機與物聯網設備安全

漏洞概況全球領先的芯片組制造商聯發科&#xff08;MediaTek&#xff09;近日發布最新產品安全公告&#xff0c;披露了影響其智能手機、物聯網設備及其他嵌入式系統芯片的多項安全漏洞。高危漏洞分析CVE-2025-20696 作為公告披露的首個且最嚴重的漏洞&#xff0c;該高危缺陷源于…

Android與Flutter混合開發:頁面跳轉與通信完整指南

Android與Flutter混合開發&#xff1a;頁面跳轉與通信完整指南 一、Android跳轉Flutter頁面的實現方式 1. 基礎跳轉方法 &#xff08;1&#xff09;使用全新引擎跳轉&#xff08;每次新建&#xff09; startActivity(FlutterActivity.withNewEngine().initialRoute("/home…

Web存儲技術詳解:sessionStorage、localStorage與Cookie

一、核心特性對比特性CookielocalStoragesessionStorage存儲大小4KB左右5-10MB5-10MB生命周期可設置過期時間永久存儲&#xff08;除非手動清除&#xff09;會話期間有效&#xff08;標簽頁關閉即清除&#xff09;作用域同源的所有窗口同源的所有窗口僅當前標簽頁自動發送每次H…

3. 為什么 0.1 + 0.2 != 0.3

總結 底層是二進制實現概述 在 JavaScript 中&#xff0c;0.1 0.2 的結果并不是精確的 0.3&#xff0c;而是 0.30000000000000004。這個現象并不是 JavaScript 的“bug”&#xff0c;而是由于浮點數在計算機底層的二進制表示方式導致的精度丟失問題。一、計算機如何表示小數&a…

股票數據接口哪家好?專業評測各主流接口的優勢與不足

Python股票接口實現查詢賬戶&#xff0c;提交訂單&#xff0c;自動交易&#xff08;1&#xff09; Python股票程序交易接口查賬&#xff0c;提交訂單&#xff0c;自動交易&#xff08;2&#xff09; 股票量化&#xff0c;Python炒股&#xff0c;CSDN交流社區 >>> 股票…

如何用分布式架構視角理解宇宙穩定性?從精細調參到微服務的類比思考

在調試一段多線程分布式代碼時&#xff0c;我忽然意識到一個不合理的事實&#xff1a;為什么現實世界這么穩定&#xff1f;為什么沒有“宇宙藍屏”或“感知崩潰”&#xff1f;為什么每天醒來&#xff0c;我們還能看到同樣的物理規律、感知同一個自我&#xff1f;站在程序員的角…

游戲畫面總是卡頓怎么辦 告別延遲暢玩游戲

玩游戲最讓人頭疼的問題之一就是畫面卡頓&#xff0c;影響操作流暢度與游戲體驗。卡頓可能由硬件性能、系統設置、網絡延遲等多種因素導致。本文將從不同角度出發&#xff0c;為你提供五個有效解決方法&#xff0c;幫助你快速提升游戲流暢度。 一、降低游戲畫質設置 高畫質雖然…

VUE+SPRINGBOOT從0-1打造前后端-前后臺系統-郵箱重置密碼

在現代Web應用中&#xff0c;密碼重置功能是用戶賬戶安全體系中不可或缺的一部分。本文將詳細介紹如何使用Vue.js前端框架和SpringBoot后端框架實現一個基于郵箱驗證的密碼重置功能。功能概述本密碼重置功能包含以下核心流程&#xff1a;用戶輸入注冊郵箱系統發送驗證碼到該郵箱…

華為云云產品的發展趨勢:技術創新驅動數字化未來

近年來&#xff0c;隨著5G、人工智能&#xff08;AI&#xff09;、大數據、物聯網&#xff08;IoT&#xff09;和邊緣計算等新興技術的快速發展&#xff0c;全球云計算產業正迎來新一輪變革。作為中國領先的云服務提供商&#xff0c;華為云依托華為集團在ICT&#xff08;信息與…

防御保護07-08

CIDR 可變長子網掩碼 VLSM 無類域間路由NET 用少量的私有地址替換大量的共有地址私網地址不能再互聯網上去使用、去分配。這里的互聯網指的是公網。服務器映射--用來使外部用戶能訪問私網服務器。靜態映射--公網地址和私網地址進行一對一的映射。地址池--中存在多個公網IP地址時…

PDF轉圖片工具技術文檔(命令行版本)

PDF轉圖片工具技術文檔&#xff08;命令行版本&#xff09; 1. 功能概述 本工具是一個基于PyMuPDF庫的PDF轉圖片命令行工具&#xff0c;能夠&#xff1a; 通過命令行參數接收PDF文件路徑將PDF的每一頁轉換為PNG格式的圖片自動創建輸出目錄&#xff08;./static&#xff09;保存…

k8s+isulad 國產化技術棧云原生技術棧搭建1-VPC

為響應政策&#xff0c;最近在搗鼓國產化云原生平臺的搭建。在搭建過程中遇到了問題記錄下來&#xff0c;以備后續查找。 我選用了中國電子云的云平臺來搭建K8S集群&#xff0c;選用的技術棧是華為開源的openeulerk8sisulad框架&#xff0c;參考官網文檔資料&#xff1a;iSula…

chatgpt plus簡單得,不需要求人,不需要野卡,不需要合租,不需要昂貴的價格

ChatGPT Plus&#xff1a;開啟智能對話的新紀元 引言&#xff1a;AI助手的時代已經到來 在當今信息爆炸的時代&#xff0c;人工智能助手已經成為我們工作、學習和生活中不可或缺的伙伴。作為AI領域的佼佼者&#xff0c;ChatGPT自問世以來就以其強大的語言理解和生成能力贏得了…