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