進(jìn)程和線程

進(jìn)程

每個獨(dú)立執(zhí)行的程序成為進(jìn)程

進(jìn)程是程序的一次動態(tài)執(zhí)行過程,它經(jīng)歷了從代碼加載、執(zhí)行到執(zhí)行完畢的一個完整過程,這個過程也是進(jìn)程本身從產(chǎn)生、發(fā)展到最終消亡的一個過程。
多進(jìn)程(多任務(wù))操作系統(tǒng)能同時運(yùn)行多個(程序),由于CPU具有備份時機(jī)制,所以每個進(jìn)程都能獲得自己CPU時間片,由于CPU執(zhí)行速度非??欤沟盟谐绦蚝孟裨凇巴瑫r”運(yùn)行一樣。
在操作系統(tǒng)中進(jìn)程是進(jìn)行系統(tǒng)資源分配、調(diào)度和管理的最小單位,進(jìn)程在執(zhí)行過程中擁有更獨(dú)立的內(nèi)存單元。
比如:Windows采用進(jìn)程作為最小隔離單位,每個進(jìn)程都有自己的數(shù)據(jù)段、代碼段,并且與別人的進(jìn)程沒有任何關(guān)系,因此進(jìn)程間進(jìn)行信息交互比較麻煩
進(jìn)程也可以通過派生(fork或者spawn)新的進(jìn)程來執(zhí)行其他任務(wù),不過因?yàn)槊總€新進(jìn)程也都擁有自己的內(nèi)存和數(shù)據(jù)棧等,所以只能采用進(jìn)程間通信(IPC)的方式共享信息

線程

為了解決進(jìn)程調(diào)度資源的浪費(fèi),為了能夠共享資源,出現(xiàn)了線程,有時候把線程稱之為輕量級進(jìn)程。
線程是CPU調(diào)度和分派的基本單位,他可與同屬一個進(jìn)程的其他線程共享進(jìn)程所擁有的全部資源,多個線程共享內(nèi)存,從而極大的提高了程序的運(yùn)行效率。
線程是比進(jìn)程更小的執(zhí)行單位,線程是進(jìn)程內(nèi)部單一的一個順序控制流。
所謂多線程是指一個進(jìn)程在執(zhí)行過程中可以產(chǎn)生多個線程,這些線程可以同時存在,同時運(yùn)行,形成多條執(zhí)行線索,一個進(jìn)程可能包含了多個同時執(zhí)行的線程。
一個或更多的線程構(gòu)成一個進(jìn)程(操作系統(tǒng)是一進(jìn)程為單位的,而進(jìn)程是一線程為單位的,進(jìn)程中必須有一個主線程main)
如果一個進(jìn)程沒有了,那么這個進(jìn)程內(nèi)的所有線程肯定會消失,如果線程消失了,但是進(jìn)程未必會消失,只有所有的線程都結(jié)束了,今后才能才會結(jié)束,而且所有的線程都是在進(jìn)程的基礎(chǔ)之上同時運(yùn)行的。

在大多數(shù)系統(tǒng)上,python支持多進(jìn)程(基于消息傳遞)編程和多線程編程,大多人比較熟悉的事多線程編程,但是在python中的多線程編程卻是有諸多的限制。

python中的多線程的限制

為了線程安全考慮,python的解釋器還是使用了內(nèi)部的GIL(Global Interperter Lock,全局解釋器鎖定),在任意時刻只能運(yùn)行單個python的線程執(zhí)行。
即使有多個可用的cpu核心,也是如此,這就限制了python只能在一個cpu核心上運(yùn)行。

GIL的存在直接影響了程序的并發(fā)編程問題

如果一個應(yīng)用程序是大部分與I/O相關(guān),那么使用線程一般沒問題,因?yàn)榇蟛糠謺r間都是在I/O等待
如果一個應(yīng)用程序是CPU密集型的,則使用多線程壞處大于好處,返回會降低程序的運(yùn)行速度,一般比你想象的還要慢得多
因此,用戶在有些情況需要使用多進(jìn)程(多進(jìn)程和消息傳遞)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容