python网络编程基础(线程与进程、并行与并发、同步与异步、阻塞与非阻塞、CPU密集型与IO密集型)...
python網(wǎng)絡(luò)編程基礎(chǔ)(線程與進(jìn)程、并行與并發(fā)、同步與異步、阻塞與非阻塞、CPU密集型與IO密集型)
目錄
線程與進(jìn)程并行與并發(fā)同步與異步阻塞與非阻塞CPU密集型與IO密集型?
?
?
線程與進(jìn)程
進(jìn)程?
?
前言
進(jìn)程的出現(xiàn)是為了更好的利用CPU資源使到并發(fā)成為可能。 假設(shè)有兩個(gè)任務(wù)A和B,當(dāng)A遇到IO操作,CPU默默的等待任務(wù)A讀取完操作再去執(zhí)行任務(wù)B,這樣無疑是對(duì)CPU資源的極大的浪費(fèi)。聰明的老大們就在想若在任務(wù)A讀取數(shù)據(jù)時(shí),讓任務(wù)B執(zhí)行,當(dāng)任務(wù)A讀取完數(shù)據(jù)后,再切換到任務(wù)A執(zhí)行。注意關(guān)鍵字切換,自然是切換,那么這就涉及到了狀態(tài)的保存,狀態(tài)的恢復(fù),加上任務(wù)A與任務(wù)B所需要的系統(tǒng)資源(內(nèi)存,硬盤,鍵盤等等)是不一樣的。自然而然的就
需要有一個(gè)東西去記錄任務(wù)A和任務(wù)B分別需要什么資源,怎樣去識(shí)別任務(wù)A和任務(wù)B等等。登登登,進(jìn)程就被發(fā)明出來了。通過進(jìn)程來分配系統(tǒng)資源,標(biāo)識(shí)任務(wù)。如何分配CPU去執(zhí)行進(jìn)程稱之為調(diào)度,進(jìn)程狀態(tài)的記錄,恢復(fù),切換稱之
為上下文切換。進(jìn)程是系統(tǒng)資源分配的最小單位,進(jìn)程占用的資源有:地址空間,全局變量,文件描述符,各種硬件等等資源。
進(jìn)程的定義
首先進(jìn)程不是程序!!! 進(jìn)程是個(gè)抽象的概念 進(jìn)程:最小的資源單位 進(jìn)程就是一個(gè)程序在一個(gè)數(shù)據(jù)集上的一次動(dòng)態(tài)執(zhí)行過程 進(jìn)程一般由程序、數(shù)據(jù)集、進(jìn)程控制塊三部分組成 我們編寫的程序用來描述進(jìn)程要完成哪些功能以及如何完成 數(shù)據(jù)集則是程序在執(zhí)行過程中需要使用的資源。 進(jìn)程控制塊用來記錄進(jìn)程的外部特征。描述進(jìn)程的執(zhí)行變化過程,系統(tǒng)可以利用它來控制和管理進(jìn)程,它是系統(tǒng)感知進(jìn)程存在的唯一標(biāo)志。
進(jìn)程的三種狀態(tài)
?
進(jìn)程的再理解
1)進(jìn)程上下文:進(jìn)程的物理實(shí)體與支持進(jìn)程運(yùn)行的物理環(huán)境,包括:地址空間,系統(tǒng)棧,打開文件表,…2)上下文切換:由一個(gè)進(jìn)程的上下文轉(zhuǎn)到另一個(gè)進(jìn)程的上下文;3)系統(tǒng)開銷:運(yùn)行操作系統(tǒng)程序完成系統(tǒng)管理工作所花費(fèi)的時(shí)間和空間;4)一個(gè)進(jìn)程可以包含多個(gè)線程。
?
?
?
?
線程
前言
線程的出現(xiàn)是為了降低上下文切換的消耗,提高系統(tǒng)的并發(fā)性,并突破一個(gè)進(jìn)程只能干一樣事的缺陷,使到進(jìn)程內(nèi)并發(fā)成為可能。假設(shè),一個(gè)文本程序,需要接受鍵盤輸入,將內(nèi)容顯示在屏幕上,還需要保存信息到硬盤中。若只有一個(gè)進(jìn)程,勢(shì)必造成同一時(shí)間只能干一樣事的尷尬(當(dāng)保存時(shí),就不能通過鍵盤輸入內(nèi)容)。若有多個(gè)進(jìn)程,每個(gè)進(jìn)程負(fù)責(zé)一個(gè)任務(wù),進(jìn)程A負(fù)責(zé)接收鍵盤輸入的任務(wù),進(jìn)程B負(fù)責(zé)將內(nèi)容顯示在屏幕上的任務(wù),進(jìn)程C負(fù)責(zé)保存內(nèi)容到硬盤
中的任務(wù)。這里進(jìn)程A,B,C間的協(xié)作涉及到了進(jìn)程通信問題,而且有共同都需要擁有的東西-------文本內(nèi)容,不停的切換造成性能上的損失。若有一種機(jī)制,可以使任務(wù)A,B,C共享資源,這樣上下文切換所需要保存和恢復(fù)的內(nèi)
容就少了,同時(shí)又可以減少通信所帶來的性能損耗,那就好了。是的,這種機(jī)制就是線程。線程共享進(jìn)程的大部分資源,并參與CPU的調(diào)度, 當(dāng)然線程自己也是擁有自己的資源的,例如,棧,寄存器等等。 此時(shí),進(jìn)程同時(shí)也是線程
的容器。線程也是有著自己的缺陷的,例如健壯性差,若一個(gè)線程掛掉了,整一個(gè)進(jìn)程也掛掉了,這意味著其它線程也掛掉了,進(jìn)程卻沒有這個(gè)問題,一個(gè)進(jìn)程掛掉,另外的進(jìn)程還是活著。
線程的定義
線程:最小的執(zhí)行單位 一個(gè)進(jìn)程中可以開多個(gè)線程,為什么要有進(jìn)程,而不做成線程呢?因?yàn)橐粋€(gè)程序中,線程共享一套數(shù)據(jù),如果都做成進(jìn)程,每個(gè)進(jìn)程獨(dú)占一塊內(nèi)存,那這套數(shù)據(jù)就要復(fù)制好幾份給每個(gè)程序,不合理,所以有了線程。線程又叫輕量級(jí)進(jìn)程,是一個(gè)基本的cpu執(zhí)行單元,也是程序執(zhí)行過程中的最小單元。一個(gè)進(jìn)程最少也會(huì)有一個(gè)主線程,在主線程中通過threading模塊,在開子線程進(jìn)程下的執(zhí)行單位 而進(jìn)程相當(dāng)于線程的容器 也需要注意進(jìn)程下面還可以繼續(xù)創(chuàng)建進(jìn)程 當(dāng)然線程最大的特點(diǎn)就是共享這個(gè)進(jìn)程的所有資源
程序運(yùn)行的原理
分時(shí)調(diào)度 所有線程輪流使用 CPU 的使用權(quán),平均分配每個(gè)線程占用 CPU 的時(shí)間。搶占式調(diào)度 優(yōu)先讓優(yōu)先級(jí)高的線程使用 CPU,如果線程的優(yōu)先級(jí)相同,那么會(huì)隨機(jī)選擇一個(gè)(線程隨機(jī)性),Java使用的為搶占式調(diào)度。大部分操作系統(tǒng)都支持多進(jìn)程并發(fā)運(yùn)行,現(xiàn)在的操作系統(tǒng)幾乎都支持同時(shí)運(yùn)行多個(gè)程序。比如:現(xiàn)在我們上課一邊使用編輯器,一邊使用錄屏軟件,同時(shí)還開著畫圖板,dos窗口等軟件。此時(shí),這些程序是在同時(shí)運(yùn)行,”感覺這些軟件好像在同一時(shí)刻運(yùn)行著“。實(shí)際上,CPU(中央處理器)使用搶占式調(diào)度模式在多個(gè)線程間進(jìn)行著高速的切換。對(duì)于CPU的一個(gè)核而言,某個(gè)時(shí)刻,只能執(zhí)行一個(gè)線程,而 CPU的在多個(gè)線程間切換速度相對(duì)我們的感覺要快,看上去就是在同一時(shí)刻運(yùn)行。其實(shí),多線程程序并不能提高程序的運(yùn)行速度,但能夠提高程序運(yùn)行效率,讓CPU的使用率更高。
總結(jié)
1.一個(gè)程序至少有一個(gè)進(jìn)程,一個(gè)進(jìn)程至少有一個(gè)線程,(進(jìn)程可以理解成線程的容器) 2.進(jìn)程在執(zhí)行過程中擁有獨(dú)立的內(nèi)存單元,而多個(gè)線程共享內(nèi)存,從而極大地提高了程序的運(yùn)行效率 3.線程在執(zhí)行過程中與進(jìn)程還是有區(qū)別的。每個(gè)獨(dú)立的線程有一個(gè)程序運(yùn)行的入口,順序執(zhí)行序列和程序的出口。但是線程不能獨(dú)立執(zhí)行,必須依存在應(yīng)用程序中,由應(yīng)用程序提供多個(gè)線程執(zhí)行控制 4.進(jìn)程是具有一定獨(dú)立功能的程序關(guān)于某個(gè)數(shù)據(jù)集合上的一次運(yùn)行活動(dòng),進(jìn)程是系統(tǒng)進(jìn)行資源分配和調(diào)度的一個(gè)獨(dú)立單位 線程是進(jìn)程的一個(gè)實(shí)體,是cpu調(diào)度和分配的基本單位,它是比進(jìn)程更小的能獨(dú)立運(yùn)行的基本單位,線程自己基本不擁有系統(tǒng)資源,只擁有一點(diǎn)在運(yùn)行中必不可少的資源(如程序計(jì)數(shù)器,一組寄存器和棧)但是它可與同屬一個(gè)進(jìn)程的其他的線程共享進(jìn)程所擁有的全部資源 5.cpu分配給線程,即真正在cpu上運(yùn)行的是線程
6.一個(gè)線程可以創(chuàng)建和撤銷另一個(gè)線程:同一個(gè)進(jìn)程中的多個(gè)線程之間可以并發(fā)
?
?
?
并行與并發(fā)
?
并行
并行就是指同一時(shí)刻有兩個(gè)或兩個(gè)以上的“工作單位”在同時(shí)執(zhí)行,從硬件的角度上來看就是同一時(shí)刻有兩條或兩條以上的指令處于執(zhí)行階段。所以,多核是并行的前提,單線程永遠(yuǎn)無法達(dá)到并行狀態(tài)。可以利用多線程和度進(jìn)程到達(dá)并行狀態(tài)。另外的,Python的多線程由于GIL的存在,對(duì)于Python來說無法通過多線程到達(dá)并行狀態(tài)。并行處理是指計(jì)算機(jī)系統(tǒng)中能同時(shí)執(zhí)行兩個(gè)或多個(gè)任務(wù)的計(jì)算方法,并行處理可同時(shí)工作于同一程序的不同方面。
?
并發(fā)
并發(fā) 對(duì)于并發(fā)的理解,要從兩方面去理解 1.并發(fā)設(shè)計(jì) 2.并發(fā)執(zhí)行。 先說并發(fā)設(shè)計(jì),當(dāng)說一個(gè)程序是并發(fā)的,更多的是指這個(gè)程序采取了并發(fā)設(shè)計(jì)。 并發(fā)設(shè)計(jì)的標(biāo)準(zhǔn):使多個(gè)操作可以在重疊的時(shí)間段內(nèi)進(jìn)行 ,這里的重點(diǎn)在于重疊的時(shí)間內(nèi), 重疊時(shí)間可以理解為一段時(shí)間內(nèi)。例如:在時(shí)間1s秒內(nèi), 具有IO操作的task1和task2都完成,這就可以說是并發(fā)執(zhí)行。所以呢,單線程也是可以做到并發(fā)運(yùn)行的。當(dāng)然啦,并行肯定是并發(fā)的。 一個(gè)程序能否并發(fā)執(zhí)行,取決于設(shè)計(jì),也取決于部署方式。例如, 當(dāng)給程序開一個(gè)線程(協(xié)程是不開的),它不可能是并發(fā)的,因?yàn)樵谥丿B時(shí)間內(nèi)根本就沒有兩個(gè)task在運(yùn)行。當(dāng)一個(gè)程序被設(shè)計(jì)成完成一個(gè)任務(wù)再去完成下一個(gè)任務(wù)的
時(shí)候,即便部署是多線程多協(xié)程的也是無法達(dá)到并發(fā)運(yùn)行的。
?
?
?
?
?
總結(jié)
并發(fā):是指系統(tǒng)具有處理多個(gè)任務(wù)(動(dòng)作)的能力 并行:是指系統(tǒng)具有同時(shí)處理多個(gè)任務(wù)(動(dòng)作)的能力 并行與并發(fā)的關(guān)系: 并發(fā)的設(shè)計(jì)使到并發(fā)執(zhí)行成為可能,而并行是并發(fā)執(zhí)行的其中一種模式 并發(fā)處理是同一時(shí)間段內(nèi)有幾個(gè)程序都在一個(gè)cpu中處于運(yùn)行狀態(tài),但任一時(shí)刻只有一個(gè)程序在cpu上運(yùn)行。
?
?
?
同步與異步
同步和異步關(guān)注的是消息通信機(jī)制?(synchronous communication/ asynchronous communication)
同步
所謂同步,就是在發(fā)出一個(gè)*調(diào)用*時(shí),在沒有得到結(jié)果之前,該*調(diào)用*就不返回。但是一旦調(diào)用返回,就得到返回值了。 換句話說,就是由*調(diào)用者*主動(dòng)等待這個(gè)*調(diào)用*的結(jié)果。?
當(dāng)進(jìn)程執(zhí)行到一個(gè)IO操作(等待外部數(shù)據(jù))的時(shí)候,一直等待外部數(shù)據(jù),接收到數(shù)據(jù)后,再繼續(xù)運(yùn)行
?
異步
異步則是相反,*調(diào)用*在發(fā)出之后,這個(gè)調(diào)用就直接返回了,所以沒有返回結(jié)果。換句話說,當(dāng)一個(gè)異步過程調(diào)用發(fā)出后,調(diào)用者不會(huì)立刻得到結(jié)果。而是在*調(diào)用*發(fā)出后,*被調(diào)用者*通過狀態(tài)、通知來通知調(diào)用者,或通過回調(diào)函數(shù)處理這個(gè)調(diào)用。?
當(dāng)進(jìn)程執(zhí)行到一個(gè)IO操作(等待外部數(shù)據(jù))的時(shí)候,不主動(dòng)等待數(shù)據(jù),一邊執(zhí)行別的任務(wù),外部數(shù)據(jù)發(fā)送過來,接收到數(shù)據(jù)再回來繼續(xù)運(yùn)行。同步查詢 異步查詢
?
?
?
?
?
阻塞和非阻塞
阻塞和非阻塞關(guān)注的是程序在等待調(diào)用結(jié)果(消息,返回值)時(shí)的狀態(tài). 阻塞調(diào)用是指調(diào)用結(jié)果返回之前,當(dāng)前線程會(huì)被掛起。調(diào)用線程只有在得到結(jié)果之后才會(huì)返回。 非阻塞調(diào)用指在不能立刻得到結(jié)果之前,該調(diào)用不會(huì)阻塞當(dāng)前線程。網(wǎng)絡(luò)IO
1.對(duì)于網(wǎng)絡(luò)IO主要指socket;
2.socket會(huì)在conenct/read/write時(shí)發(fā)生阻塞。
概念
1.阻塞調(diào)用是指調(diào)用結(jié)果返回之前,當(dāng)前線程會(huì)被掛起。函數(shù)只有在得到結(jié)果之后才會(huì)返回
1)connect阻塞
?
2)接收數(shù)據(jù)阻塞
2.非阻塞指在不能立刻得到結(jié)果之前,該函數(shù)不會(huì)阻塞當(dāng)前線程,而會(huì)立刻返回
1)接收數(shù)據(jù)非阻塞
2)非阻塞面臨的問題
?
?
1.同步與異步
同步和異步關(guān)注的是消息通信機(jī)制 (synchronous communication/ asynchronous communication)
所謂同步,就是在發(fā)出一個(gè)*調(diào)用*時(shí),在沒有得到結(jié)果之前,該*調(diào)用*就不返回。但是一旦調(diào)用返回,就得到返回值了。
換句話說,就是由*調(diào)用者*主動(dòng)等待這個(gè)*調(diào)用*的結(jié)果。
而異步則是相反,*調(diào)用*在發(fā)出之后,這個(gè)調(diào)用就直接返回了,所以沒有返回結(jié)果。換句話說,當(dāng)一個(gè)異步過程調(diào)用發(fā)出后,調(diào)用者不會(huì)立刻得到結(jié)果。而是在*調(diào)用*發(fā)出后,*被調(diào)用者*通過狀態(tài)、通知來通知調(diào)用者,或通過回調(diào)函數(shù)處理這個(gè)調(diào)用。
典型的異步編程模型比如Node.js
舉個(gè)通俗的例子:
你打電話問書店老板有沒有《分布式系統(tǒng)》這本書,如果是同步通信機(jī)制,書店老板會(huì)說,你稍等,”我查一下",然后開始查啊查,等查好了(可能是5秒,也可能是一天)告訴你結(jié)果(返回結(jié)果)。
而異步通信機(jī)制,書店老板直接告訴你我查一下啊,查好了打電話給你,然后直接掛電話了(不返回結(jié)果)。然后查好了,他會(huì)主動(dòng)打電話給你。在這里老板通過“回電”這種方式來回調(diào)。
2. 阻塞與非阻塞
阻塞和非阻塞關(guān)注的是程序在等待調(diào)用結(jié)果(消息,返回值)時(shí)的狀態(tài).
阻塞調(diào)用是指調(diào)用結(jié)果返回之前,當(dāng)前線程會(huì)被掛起。調(diào)用線程只有在得到結(jié)果之后才會(huì)返回。
非阻塞調(diào)用指在不能立刻得到結(jié)果之前,該調(diào)用不會(huì)阻塞當(dāng)前線程。
還是上面的例子,
你打電話問書店老板有沒有《分布式系統(tǒng)》這本書,你如果是阻塞式調(diào)用,你會(huì)一直把自己“掛起”,直到得到這本書有沒有的結(jié)果,如果是非阻塞式調(diào)用,你不管老板有沒有告訴你,你自己先一邊去玩了, 當(dāng)然你也要偶爾過幾分鐘check一下老板有沒有返回結(jié)果。
在這里阻塞與非阻塞與是否同步異步無關(guān)。跟老板通過什么方式回答你結(jié)果無關(guān)。
如果是關(guān)心阻塞 IO/ 異步 IO, 參考 Unix Network Programming View Book
?
同步異步與阻塞,非阻塞區(qū)別1.阻塞/非阻塞, 它們是程序在等待消息(無所謂同步或者異步)時(shí)的狀態(tài);2.同步/異步,是程序獲得關(guān)注消息通知的機(jī)制。同步異步與阻塞,非阻塞組合1.同步阻塞效率最低(日志程序)。2.同步非阻塞效率也不高(需要輪詢)。3.異步阻塞一般模式線程回調(diào)。4.異步非阻塞IOCP。
舉例
老張愛喝茶,廢話不說,煮開水。出場(chǎng)人物:老張,水壺兩把(普通水壺,簡(jiǎn)稱水壺;會(huì)響的水壺,簡(jiǎn)稱響水壺)。 1 老張把水壺放到火上,立等水開。(同步阻塞)老張覺得自己有點(diǎn)傻2 老張把水壺放到火上,去客廳看電視,時(shí)不時(shí)去廚房看看水開沒有。(同步非阻塞)老張還是覺得自己有點(diǎn)傻,于是變高端了,買了把會(huì)響笛的那種水壺。水開之后,能大聲發(fā)出嘀~~~~的噪音。 3 老張把響水壺放到火上,立等水開。(異步阻塞)老張覺得這樣傻等意義不大4 老張把響水壺放到火上,去客廳看電視,水壺響之前不再去看它了,響了再去拿壺。(異步非阻塞) 老張覺得自己聰明了。同步就是燒開水,要自己來看開沒開;異步就是水開了,然后水壺響了通知你水開了。阻塞是燒開水的過程中,你不能干其他事情(即你被阻塞住了);非阻塞是燒開水的過程里可以干其他事情。同步與異步說的是你獲得水開了的方式不同。阻塞與非阻塞說的是的你得到結(jié)果之前能不能干其他事情。
?
?
?
?
?CPU密集型與IO密集型
CPU密集型(CPU-bound)CPU密集型也叫計(jì)算密集型,指的是系統(tǒng)的硬盤、內(nèi)存性能相對(duì)CPU要好很多,此時(shí),系統(tǒng)運(yùn)作大部分的狀況是CPU Loading 100%,CPU要讀/寫I/O(硬盤/內(nèi)存),I/O在很短的時(shí)間就可以完成,而CPU還有許多運(yùn)算要處理,CPU Loading很高。在多重程序系統(tǒng)中,大部份時(shí)間用來做計(jì)算、邏輯判斷等CPU動(dòng)作的程序稱之CPU bound。例如一個(gè)計(jì)算圓周率至小數(shù)點(diǎn)一千位以下的程序,在執(zhí)行的過程當(dāng)中絕大部份時(shí)間用在三角函數(shù)和開根號(hào)的計(jì)算,便是屬于CPU bound的程序。CPU bound的程序一般而言CPU占用率相當(dāng)高。這可能是因?yàn)槿蝿?wù)本身不太需要訪問I/O設(shè)備,也可能是因?yàn)槌绦蚴嵌嗑€程實(shí)現(xiàn)因此屏蔽掉了等待I/O的時(shí)間。IO密集型(I/O bound)IO密集型指的是系統(tǒng)的CPU性能相對(duì)硬盤、內(nèi)存要好很多,此時(shí),系統(tǒng)運(yùn)作,大部分的狀況是CPU在等I/O (硬盤/內(nèi)存) 的讀/寫操作,此時(shí)CPU Loading并不高。I/O bound的程序一般在達(dá)到性能極限時(shí),CPU占用率仍然較低。這可能是因?yàn)槿蝿?wù)本身需要大量I/O操作,而pipeline做得不是很好,沒有充分利用處理器能力。
CPU密集型 vs IO密集型我們可以把任務(wù)分為計(jì)算密集型和IO密集型。計(jì)算密集型任務(wù)的特點(diǎn)是要進(jìn)行大量的計(jì)算,消耗CPU資源,比如計(jì)算圓周率、對(duì)視頻進(jìn)行高清解碼等等,全靠CPU的運(yùn)算能力。這種計(jì)算密集型任務(wù)雖然也可以用多任務(wù)完成,但是任務(wù)越多,花在任務(wù)切換的時(shí)間就越多,CPU執(zhí)行任務(wù)的效率就越低,所以,要最高效地利用CPU,計(jì)算密集型任務(wù)同時(shí)進(jìn)行的數(shù)量應(yīng)當(dāng)?shù)扔贑PU的核心數(shù)。計(jì)算密集型任務(wù)由于主要消耗CPU資源,因此,代碼運(yùn)行效率至關(guān)重要。Python這樣的腳本語言運(yùn)行效率很低,完全不適合計(jì)算密集型任務(wù)。對(duì)于計(jì)算密集型任務(wù),最好用C語言編寫。第二種任務(wù)的類型是IO密集型,涉及到網(wǎng)絡(luò)、磁盤IO的任務(wù)都是IO密集型任務(wù),這類任務(wù)的特點(diǎn)是CPU消耗很少,任務(wù)的大部分時(shí)間都在等待IO操作完成(因?yàn)镮O的速度遠(yuǎn)遠(yuǎn)低于CPU和內(nèi)存的速度)。對(duì)于IO密集型任務(wù),任務(wù)越多,CPU效率越高,但也有一個(gè)限度。常見的大部分任務(wù)都是IO密集型任務(wù),比如Web應(yīng)用。IO密集型任務(wù)執(zhí)行期間,99%的時(shí)間都花在IO上,花在CPU上的時(shí)間很少,因此,用運(yùn)行速度極快的C語言替換用Python這樣運(yùn)行速度極低的腳本語言,完全無法提升運(yùn)行效率。對(duì)于IO密集型任務(wù),最合適的語言就是開發(fā)效率最高(代碼量最少)的語言,腳本語言是首選,C語言最差。總之,計(jì)算密集型程序適合C語言多線程,I/O密集型適合腳本語言開發(fā)的多線程。
?
掛起與阻塞
掛起:一般是主動(dòng)的,由系統(tǒng)或程序發(fā)出,甚至于輔存中去。(不釋放CPU,可能釋放內(nèi)存,放在外存)阻塞:一般是被動(dòng)的,在搶占資源中得不到資源,被動(dòng)的掛起在內(nèi)存,等待某種資源或信號(hào)量(即有了資源)將他喚醒。(釋放CPU,不釋放內(nèi)存)另外,有一段話很形象:首先這些術(shù)語都是對(duì)于線程來說的。對(duì)線程的控制就好比你控制了一個(gè)雇工為你干活。你對(duì)雇工的控制是通過編程來實(shí)現(xiàn)的。掛起線程的意思就是你對(duì)主動(dòng)對(duì)雇工說:“你睡覺去吧,用著你的時(shí)候我主動(dòng)去叫你,然后接著干活”。使線程睡眠的意思就是你主動(dòng)對(duì)雇工說:“你睡覺去吧,某時(shí)某刻過來報(bào)到,然后接著干活”。線程阻塞的意思就是,你突然發(fā)現(xiàn),你的雇工不知道在什么時(shí)候沒經(jīng)過你允許,自己睡覺呢,但是你不能怪雇工,肯定你 這個(gè)雇主沒注意,本來你讓雇工掃地,結(jié)果掃帚被偷了或被鄰居家借去了,你又沒讓雇工繼續(xù)干別的活,他就只好睡覺了。至于掃帚回來后,雇工會(huì)不會(huì)知道,會(huì)不會(huì)繼續(xù)干活,你不用擔(dān)心,雇工一旦發(fā)現(xiàn)掃帚回來了,他就會(huì)自己去干活的。因?yàn)楣凸な苓^良好的培訓(xùn)。這個(gè)培訓(xùn)機(jī)構(gòu)就是操作系統(tǒng)。掛 起 進(jìn)程在操作系統(tǒng)中可以定義為暫時(shí)被淘汰出內(nèi)存的進(jìn)程,機(jī)器的資源是有限的,在資源不足的情況下,操作系統(tǒng)對(duì)在內(nèi)存中的程序進(jìn)行合理的安排,其中有的進(jìn)程被暫時(shí)調(diào)離出內(nèi)存,當(dāng)條件允許的時(shí)候,會(huì)被操作系統(tǒng)再次調(diào)回內(nèi)存,重新進(jìn)入等待被執(zhí)行的狀態(tài)即就緒態(tài),系統(tǒng)在超過一定的時(shí)間沒有任何動(dòng)作.操作系統(tǒng)為什么要引入掛起狀態(tài)?掛起狀態(tài)涉及到中級(jí)調(diào)度,因?yàn)楫?dāng)內(nèi)存中的某個(gè)程序需要大的內(nèi)存空間來執(zhí)行,但這時(shí)內(nèi)存有沒有空余空間了,那么操作系統(tǒng)就回根據(jù)調(diào)度算法把一些進(jìn)程放到外存中去,以騰出空間給正在執(zhí)行的程序的數(shù)據(jù)和程序,所以引如了掛起狀態(tài)。引起掛起狀態(tài)的原因有如下幾方面: (1)終端用戶的請(qǐng)求。當(dāng)終端用戶在自己的程序運(yùn)行期間發(fā)現(xiàn)有可疑問題時(shí),希望暫停使自己的程序靜止下來。亦即,使正在執(zhí)行的進(jìn)程暫停執(zhí)行;若此時(shí)用戶進(jìn)程正處于就緒狀態(tài)而未執(zhí)行,則該進(jìn)程暫不接受調(diào)度,以便用戶研究其執(zhí)行情況或?qū)Τ绦蜻M(jìn)行修改。我們把這種靜止?fàn)顟B(tài)成為“掛起狀態(tài)”。 (2)父進(jìn)程的請(qǐng)求。有時(shí)父進(jìn)程希望掛起自己的某個(gè)子進(jìn)程,以便考察和修改子進(jìn)程,或者協(xié)調(diào)各子進(jìn)程間的活動(dòng)。 (3)負(fù)荷調(diào)節(jié)的需要。當(dāng)實(shí)時(shí)系統(tǒng)中的工作負(fù)荷較重,已可能影響到對(duì)實(shí)時(shí)任務(wù)的控制時(shí),可由系統(tǒng)把一些不重要的進(jìn)程掛起,以保證系統(tǒng)能正常運(yùn)行。 (4)操作系統(tǒng)的需要。操作系統(tǒng)有時(shí)希望掛起某些進(jìn)程,以便檢查運(yùn)行中的資源使用情況或進(jìn)行記賬。 (5)對(duì)換的需要。為了緩和內(nèi)存緊張的情況,將內(nèi)存中處于阻塞狀態(tài)的進(jìn)程換至外存上。下面再說下進(jìn)程和線程的狀態(tài):進(jìn)程:一般大家認(rèn)為是三種狀態(tài):運(yùn)行、阻塞、就緒。也有分為五態(tài)的(多了創(chuàng)建和退出狀態(tài))線程:一般認(rèn)為是四種狀態(tài):New Thread(not alive)、Runnable Thread(alive)、Blocked Thread(alive)、Dead Thread(not alive)?
轉(zhuǎn)載于:https://www.cnblogs.com/-wenli/p/10285074.html
總結(jié)
以上是生活随笔為你收集整理的python网络编程基础(线程与进程、并行与并发、同步与异步、阻塞与非阻塞、CPU密集型与IO密集型)...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: WordPress导出全静态化网站
- 下一篇: OSS全球传输加速开启公测,助力企业业务