操作系統的進程管理(彙編角度)


操作系統進程的概念最早來自於jobs(作業),前面的程序運行完,後面的才能運行,這是一個弊端。於是出現了分時的概念,程序你跑一會,我跑一會。一個程序運行起來了,它就是一個進程,如果是靜態的,它就是程序。

A process includes:

program counter and other registers
text section代碼段
stack放置局部分配的變量
data section
heap放置動態分配的程序
如果撞到一起會發生內存不足。理論上,一個程序申請的進程內存是0-4G
在這裏插入圖片描述

process state(進程狀態)

new
ready(就緒)
running 運行獲得了cpu資源
waiting(等待)
terminated
在這裏插入圖片描述

等待後不直接去運行?軟件設計理念的問題,一個進程等待態當時有另一個進程在運行,會發生碰撞,增加代碼的複雜度
就緒態-等待狀態?等待發生的條件是出現IO請求或需要等待一個事件,所以說轉去等待需要系統調用,系統調用需要cpu資源,就緒態沒有cpu資源,只有運行態時纔會有cpu資源。
操作系統進入等待態是應用程序主動通過一些操作進入的,需要 系統調用,進入了內核。

PCB(進程控制塊)

和進行運行相關的所有信息都在裏面,知道進程在內存的哪個位置,運行狀態,歷史記錄……
進程切換時PCB的作用:保存與切換當前狀態,實際就是把寄存器的內容存到內存裏,然後把內存的另一塊內容放到寄存器裏,停止當前運行進程並調度其他進程。

多種策略:設置多個寄存器,每種進程切換一個寄存器來實現現場的保存與恢復。
在這裏插入圖片描述
每一個PCB是個結構體,全部組成在一起構成了一個隊列,處於就緒狀態的進程都放在一個就緒隊列裏,等待狀態的進程根據等待的不同的設備放到不同的設備隊列裏面。
隊列程序編寫時應該選擇哪一種數據結構:根據程序的局部性原理,選擇數組

進程的創建,加載執行,等待終止

軟件的自動啓動,有shell(資源管理器)啓動,內核會啓動shell,資源管理器這樣的進程,這樣的進程再啓動其他的程序,變成一個個的進程,形成一個樹。
從資源和執行上看
父進程與子進程:
共享-嵌入式系統
繼承父進程的一部分資源-unix系統
資源不共享-windows

併發執行和等待執行

進程最好是獨立的,互不干擾的,有獨立的內存運行空間,裏面放什麼?
1.子進程克隆父進程 unix-linux
2.子進程空,需要加載一個程序放到自己的內存空間 windows
unix fork()系統調用
在這裏插入圖片描述
一個進程在運行,執行fork()時,把當前進程所有的複製一份,pid不一樣。兩進程同時繼續往下執行,父進程執行下一步是社麼,子進程也是一樣,此時父進程和子進程是兩個獨立的進程,訪問不同的內存單元。fork返回值有OS決定,雖然兩進程一樣,給他們的返回值不同,給父進程返回子進程的pid,給子進程pid=0。這裏子進程加載了top這個程序,佔用了內存空間,這時os讓父進程進入等待態,只有子進程退出後,父進程才能到就緒態重新運行。
在這裏插入圖片描述
在這裏插入圖片描述
當9012進程執行完後,9011這個父類開始繼續執行復制,複製後的進程號爲9013,而9012作爲父類i的值還可以繼續複製,所以9012衍生出了9014。只要i的值滿足就可以一直複製。
在這裏插入圖片描述
在這裏插入圖片描述
windows下創建新進程的API叫做Create Process 文檔 google msdn API
unix linux man查找系統調用

return 返回值 ,告訴操作系統 本次運行返回的狀態,約定0表示運行正常,其他值表示返回錯誤。OS獲得返回值沒什麼用,他實際上可以把返回值 返回給與其相關進程,做邏輯判斷、
進程結束後的回收工作,不接受父進程回收的子進程 稱作殭屍進程(zombie),佔用很多進程不結束。
也可以他殺,linux 中的kill。高級用戶有權限可以殺任何進程。

進程間的協作
1.獨立
2.協作,有些時候是需要協作的。怎麼協作?
2.1消息傳遞,通過內核複製,需要系統調用,一個send,一個receive,需要建立通信鏈路
阻塞性系統調用:請求的結果不能立即得到,當前的進程掛起,等待狀態,當I/O結束(請求的事),才被喚醒
非阻塞性系統調用:當你起發起一個請求,操作系統會返回值告訴你操作有無完成,去做其他事(這樣的話程序複雜度提高)
消息也有阻塞性和非阻塞性系統調用。消息在操作系統內部有緩衝區。在這裏插入圖片描述
2.2 共享內存,更快速
A一寫,B就可以讀在這裏插入圖片描述事實上,OS不允許兩進程互相通信,需要一系列的系統調用;另外還要處理同步問題;並不是所有的OS都支持內存共享
POSIX系統兩套系統調用。
通過建立一塊共享的空間,一個變量指向它,另一個變量也指向它,只要它修改了,指向它的變量都會修改。

併發軟件設計的主要技術路線

1.多進程編程
2.多線程
進程的特點是分離,而線程的特點是不分離,所有屬於這個進程的線程共享資源
在這裏插入圖片描述
單線程一個時刻只有一個pc,只能執行一條指令;多線程:寄存器裏有pc,可以在某一時刻有三個指令在執行,指令的執行路線(函數調用的返回值保存在棧裏)如果共享棧和寄存器,就會很亂。
好處
1.快速響應:
當點擊一個動作時,窗口中鼠標沙漏狀,然後變白色,等待還是殺死他。說明這個動作複雜,cpu一直在算,cpu沒機會處理界面,界面是這個程序自己畫上去的,os告訴他顯示界面。
去訪問遠端的服務器,tcp連接的等待時間,對於OS來說就需要等待,進程不會需要cpu的資源,點擊會無反應。線程來做,耗時的動作交給一個線程,主線程與用戶的操作交互,操作會流暢。當然進程也可以做……但是耗時耗力
2.資源共享,協作方便,節約資源。理論上,進程的創建,切換,銷燬這種資源開銷比進程小。
分類
1.內核級線程,現在OS都是,當有線程時,cpu調度的單位是線程,有一個Tread control block(線程控制塊),與PCB一樣
2.用戶級線程,通過技術在自己的空間裏模擬出多寄存器效果,程序自己分配時間,保存斷點,恢復斷點。效率高,不要系統調用;可定製性好,線程間的調度算法自己決定。缺點是如果用戶線程中任何一個線程調用了阻塞性的系統調用,所有的用戶線程被阻塞。不能在多個處理器上並行運行,處理器分配有OS決定,一個線程只能在一個cpu上運行。遊戲裏的用戶級線程,每一植物和殭屍,太陽,都是一個獨立的個體,主線程控制切換線程,快速輪換。
在這裏插入圖片描述
線程庫
POsix 線程庫
win32 線程庫
java:語言級別的線程,有一個線程類
線程池
服務程序一啓動,先建幾十個線程在線程池,來一個用戶程序就去拿一個線程給他,用完再放到線程池中。
linux的線程的實現:同一個系統調用克隆進程和線程,變換克隆函數的參數來區別進程線程,進程間是獨立的內存,而線程間則共享內存,沒有針對線程的優化。

apache和IIS

apache:多進程,進程是完全獨立的,穩定安全
IIS:多線程,效率高,線程模型穩定,任何一個線程出問題,導致整個進程的崩潰。

firefox,chrome,IE

firefox,IE多線程的,網站間的密碼是不能獲取的(取決於cookie),不同窗口時,百度網的密碼不能獲取qq郵箱的密碼
chrome 在瀏覽器當中,任何 標籤和窗口包括插件都是一個獨立的進程,任何一個出問題瀏覽器不會崩潰。用sandox對操作做了保護,只允許瀏覽器該乾的的事情。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章