[點晴永久免費OA]操作系統是如何一步步發明進程、線程的?
當前位置:點晴教程→點晴OA辦公管理信息系統
→『 經驗分享&問題答疑 』
你是一名1960年代IBM計算機中心的工程師,你每天都在面對一個棘手的問題:如何讓更多用戶能夠使用昂貴的System/360大型機。 ![]() 這臺價值數百萬美元(相當于今天的數千萬美元)的龐然大物,是當時最先進的計算設備,但它的價格實在太昂貴了,即使是大型企業也很難獨自承擔。 而且這臺機器的用戶需要提前好幾天來登記使用時間,每次都只能為單個用戶服務,所有任務都在串行執行。 當某個程序等待磁帶讀取時整個機器就會處于空閑狀態,你體驗到的是時間和金錢的雙重流逝。 顯然你會想為什么當某個程序讀寫外部慢速設備時讓寶貴的CPU空閑呢?這就好比程序員在等待程序編譯完成時ta還可以去寫第二個需求的代碼啊,必須并行起來。 必須并行起來要實現這一點程序必須具備暫停運行以及恢復運行的能力,要想讓程序具備暫停運行/恢復運行的能力就必須保存CPU上下文信息。 為此你必須定義一個結構體來保存處理器上下文信息:
每個運行起來的任務都需要這樣一個結構體,當任務需要暫停時就把處理器上下文保存在context結構體中,需要恢復任務運行時就根據context中數據恢復處理器狀態。 現在你就可以同時運行多個任務了,當任務A讀取慢速磁帶時就暫停任務A的運行并把CPU分配給任務B,這樣你可以充分利用寶貴的機器資源。 多個程序相互干擾當系統中可以運行多個任務后你發現了新的問題,那就是多個程序之間會相互干擾,因為在早期計算機系統中,程序被鏈接到固定的內存基址,且加載器缺乏重定位能力。當多個程序加載到內存時,程序中的變量可能被分配到相同的物理地址,導致互相覆蓋。 舉個例子:
這個示例中兩個同時運行的程序global_data變量的內存地址可能相同,因此兩個程序的運行會相互干擾,原因你很清楚,因為它們共享同一個內存空間,你開始意識到,僅僅依靠程序員的自覺來避免互相干擾是不夠的,需要從系統層面提供隔離機制。 于是,你開始設計一個新的抽象概念,讓各個運行的程序彼此隔離,為每個程序提供獨立的內存空間,你決定采用段氏內存管理,每個運行的程序中的各個段都有自己的內存區域:
進程誕生了現在你設計了struct context以及struct memory_map,顯然它們都屬于某一個運行起來的程序,“運行起來的程序”是一個新的概念,你給起了個名字叫做進程,process,現在進程上下文以及內存映射都可以放到進程這個結構體中:
就這樣你實現了操作系統最核心的功能:多任務。 進程這種設計效果嗷嗷好:
不過,新的挑戰也隨之而來... 進程切換的性能瓶頸多任務系統的使用解決了多用戶共享計算機的問題。但很快,你就發現了一個令人頭疼的新問題:隨著系統中運行的進程越來越多,整個系統的響應速度開始明顯下降。 通過仔細觀察和測試,你發現問題出在進程切換上。每次從一個進程切換到另一個進程時,系統都需要執行大量的工作。 看一下你實現的進程:
進程切換時處理器上下文和內存映射都需要切換,尤其對于現代操作系統中的頁式內存管理來說內存映射切換的開銷非常高(CR3切換、TLB刷新等)。 是否有必要創建過多進程?真的有必要創建這么多進程嗎?你仔細檢查了一個開啟大量進程的web服務器,web服務器會創建多個工作進程來處理不同的HTTP請求,這些工作進程運行完全相同的代碼來處理請求,卻各自占用一份獨立的內存空間,同時這些進程在切換時又會帶來大量開銷。 但是等等,既然這些進程使用的是相同的代碼,為什么不能讓它們共享這部分內存呢?你開始意識到,也許可以創造一種新的執行單元,它們能共享進程的大部分資源,同時又保持足夠的獨立性,如果多個執行流可以共享同一個進程的資源,那切換的開銷不就能大大降低了嗎? 這個想法最終引導你走向了一個全新的概念。 線程概念的誕生經過反復設計,你找到了一個突破性的解決方案:同一個進程內部支持多個執行流。這個想法來源于一個關鍵觀察 ,很多時候,我們其實并不需要完全獨立的進程,只需要能夠并行執行不同的任務就夠了。 于是,你設計了一個全新的概念 —— 線程。每個線程都是進程內的一個獨立執行單元,它們:
這就是線程的誕生故事,它完美平衡了資源共享和執行獨立性,是操作系統發展史上一個重要的里程碑。 ![]() 閱讀原文:原文鏈接 該文章在 2025/4/3 17:37:56 編輯過 |
關鍵字查詢
相關文章
正在查詢... |