在早期的計(jì)算機(jī)中不包含操作系統(tǒng),它們從頭到尾只執(zhí)行一個(gè)程序,并且這個(gè)程序能訪問計(jì)算機(jī)中的所有資源。
操作系統(tǒng)的出現(xiàn)使得計(jì)算機(jī)每次運(yùn)行多個(gè)程序,并且不同的程序都在單獨(dú)的進(jìn)程中運(yùn)行:操作系統(tǒng)為各個(gè)獨(dú)立執(zhí)行的進(jìn)程分配各種資源,包括內(nèi)存、文件句柄、安全證書等。
不同進(jìn)程中交換數(shù)據(jù)的通信機(jī)制(粗粒度):
套接字共享內(nèi)存文件信號量信號處理器在計(jì)算機(jī)中加入操作系統(tǒng)來實(shí)現(xiàn)多個(gè)程序同時(shí)執(zhí)行的原因:
資源利用率。在某些情況下,程序必須等待某個(gè)外部操作執(zhí)行完成,比如輸入輸出操作,而在等待時(shí)程序無法執(zhí)行其他任何工作。因此,如果在等待的同時(shí)計(jì)算機(jī)可以運(yùn)行其他程序,那么無疑將提高資源的利用率。公平性。不同的用戶和程序?qū)τ?jì)算機(jī)上的資源有著同等的使用權(quán)。一種高效的運(yùn)行方式是通過粗粒度的時(shí)間分片(Time Slicing)使這些用戶和程序能夠共享計(jì)算機(jī)資源,而不是由一個(gè)程序從頭運(yùn)行到尾,然后再啟動下一個(gè)程序。便利性。通常來說,在計(jì)算多個(gè)任務(wù)時(shí),應(yīng)該編寫多個(gè)程序,每個(gè)程序執(zhí)行一個(gè)任務(wù)并在必要時(shí)互相通信,這比只編寫一個(gè)程序來計(jì)算所有任務(wù)更容易實(shí)現(xiàn)。在早期的分時(shí)系統(tǒng)中,每個(gè)進(jìn)程相當(dāng)于一臺虛擬的馮諾依曼計(jì)算機(jī),他擁有存儲 指令和數(shù)據(jù) 的內(nèi)存空間,根據(jù)機(jī)器語言的語義以串行方式執(zhí)行指令,并通過一組I/O指令與外部設(shè)備通信。
串行編程模型的優(yōu)勢在于其直觀性和簡單性,因?yàn)樗7铝巳祟惖墓ぷ鞣绞剑好看沃蛔鲆患虑椋鐾曛笤僮隽硪患?/p>
線程允許在同一個(gè)進(jìn)程中同時(shí)存在多個(gè)程序控制流,線程會共享進(jìn)程范圍內(nèi)的資源,例如內(nèi)存句柄和文件句柄,但每個(gè)線程都有各自的程序計(jì)數(shù)器(PRogram Counter)、棧、局部變量等。
線程的優(yōu)勢:降低程序的開發(fā)和維護(hù)成本,提升復(fù)雜應(yīng)用程序的性能,提高GUI程序的響應(yīng)靈敏度,提高資源利用率和系統(tǒng)吞吐率。
發(fā)揮多處理器的強(qiáng)大能力建模的簡單性異步事件的簡化處理響應(yīng)更靈敏的用戶界面線程帶來的風(fēng)險(xiǎn):
安全性問題(競態(tài)條件(Race Condition))活躍性問題性能問題安全性的含義是“永遠(yuǎn)不發(fā)生糟糕的事情” 活躍性則關(guān)注另一個(gè)目標(biāo):“某件正確的事情最終會發(fā)生”。單線程程序中:無限循環(huán);多線程程序中:死鎖、饑餓、活鎖。
性能問題包括服務(wù)時(shí)間過長、響應(yīng)不靈敏、吞吐率過低、資源消耗過高、可伸縮性較低等。
線程帶來的運(yùn)行時(shí)開銷:
在多線程程序中,當(dāng)線程調(diào)度器臨時(shí)掛起活躍線程并轉(zhuǎn)而運(yùn)行另一個(gè)線程時(shí),就會頻繁地出現(xiàn)上下文切換操作(Context Switch),這種造作將帶來極大的開銷:保存和恢復(fù)執(zhí)行上下文,丟失局部性,并且CPU時(shí)間將更多地花在線程調(diào)度而不是線程運(yùn)行上。當(dāng)線程共享數(shù)據(jù)時(shí),必須使用同步機(jī)制,而這些機(jī)制往往會抑制某些編譯器優(yōu)化,使內(nèi)存緩存區(qū)中的數(shù)據(jù)無效,以及增加共享內(nèi)存總線的同步流量。當(dāng)某個(gè)框架在應(yīng)用程序中引入并發(fā)性時(shí),通常不可能將并發(fā)性僅僅局限于框架代碼,因?yàn)榭蚣鼙旧頃卣{(diào)(Callback)應(yīng)用程序的代碼,而這些代碼將訪問應(yīng)用程序的狀態(tài)。
新聞熱點(diǎn)
疑難解答
圖片精選