新聞中心
幾乎所有的操作系統(tǒng)都支持同時(shí)運(yùn)行多個(gè)任務(wù),一個(gè)任務(wù)通常就是一個(gè)程序,每一個(gè)運(yùn)行中的程序就是一個(gè)進(jìn)程。當(dāng)一個(gè)程序運(yùn)行時(shí),內(nèi)部可能包含多個(gè)順序執(zhí)行流,每一個(gè)順序執(zhí)行流就是一個(gè)線(xiàn)程。

線(xiàn)程和進(jìn)程
幾乎所有的操作系統(tǒng)都支持進(jìn)程的概念,所有運(yùn)行中的任務(wù)通常對(duì)應(yīng)一個(gè)進(jìn)程(Process)。當(dāng)一個(gè)程序進(jìn)入內(nèi)存運(yùn)行時(shí),即變成一個(gè)進(jìn)程。進(jìn)程是處于運(yùn)行過(guò)程中的程序,并且具有一定的獨(dú)立功能。進(jìn)程是系統(tǒng)進(jìn)行資源分配和調(diào)度的一個(gè)獨(dú)立單位。
一般而言,進(jìn)程包含如下三個(gè)特征:
獨(dú)立性:進(jìn)程是系統(tǒng)中獨(dú)立存在的實(shí)體,它可以擁有自己的獨(dú)立的資源,每一個(gè)進(jìn)程都擁有自己的私有的地址空間。在沒(méi)有經(jīng)過(guò)進(jìn)程本身允許的情況下,一個(gè)用戶(hù)進(jìn)程不可以直接訪(fǎng)問(wèn)其他進(jìn)程的地址空間。
動(dòng)態(tài)性:進(jìn)程與程序的區(qū)別在于,程序只是一個(gè)靜態(tài)的指令集合,而進(jìn)程是一個(gè)正在系統(tǒng)中活動(dòng)的指令集合。在進(jìn)程中加入了時(shí)間的概念。進(jìn)程具有自己的生命周期和各種不同的狀態(tài),在程序中是沒(méi)有這些概念的。
并發(fā)性:多個(gè)進(jìn)程可以在單個(gè)處理器上并發(fā)執(zhí)行,多個(gè)進(jìn)程之間不會(huì)互相影響。
并發(fā)(Concurrency)和并行(Parallel)是兩個(gè)概念,并行指在同一時(shí)刻有多條指令在多個(gè)處理器上同時(shí)執(zhí)行;并發(fā)才旨在同一時(shí)刻只能有一條指令執(zhí)行,但多個(gè)進(jìn)程指令被快速輪換執(zhí)行,使得在宏觀上具有多個(gè)進(jìn)程同時(shí)執(zhí)行的效果。
大部分操作系統(tǒng)都支持多進(jìn)程并發(fā)執(zhí)行,現(xiàn)代的操作系統(tǒng)幾乎都支持同時(shí)執(zhí)行多個(gè)任務(wù)。例如,程序員一邊開(kāi)著開(kāi)發(fā)工具在寫(xiě)程序,一邊開(kāi)著參考手冊(cè)備查,同時(shí)還使用電腦播放音樂(lè)……除此之外,每臺(tái)電腦運(yùn)行時(shí)還有大量底層的支撐性程序在運(yùn)行……這些進(jìn)程看上去像是在同時(shí)工作。
但事實(shí)的真相是,對(duì)于一個(gè) CPU 而言,在某個(gè)時(shí)間點(diǎn)它只能執(zhí)行一個(gè)程序。也就是說(shuō),只能運(yùn)行一個(gè)進(jìn)程,CPU 不斷地在這些進(jìn)程之間輪換執(zhí)行。那么,為什么用戶(hù)感覺(jué)不到任何中斷呢?
這是因?yàn)橄鄬?duì)人的感覺(jué)來(lái)說(shuō),CPU 的執(zhí)行速度太快了(如果啟動(dòng)的程序足夠多,則用戶(hù)依然可以感覺(jué)到程序的運(yùn)行速度下降了)。所以,雖然 CPU 在多個(gè)進(jìn)程之間輪換執(zhí)行,但用戶(hù)感覺(jué)到好像有多個(gè)進(jìn)程在同時(shí)執(zhí)行。
現(xiàn)代的操作系統(tǒng)都支持多進(jìn)程的并發(fā)執(zhí)行,但在具體的實(shí)現(xiàn)細(xì)節(jié)上可能因?yàn)橛布筒僮飨到y(tǒng)的不同而采用不同的策略。比較常用的策略有:
共用式的多任務(wù)操作策略,例如 Windows 3.1 和 Mac OS 9 操作系統(tǒng)采用這種策略;
搶占式的多任務(wù)操作策略,其效率更高,目前操作系統(tǒng)大多采用這種策略,例如 Windows NT、Windows 2000 以及 UNIX/Linux 等操作系統(tǒng)。
多線(xiàn)程則擴(kuò)展了多進(jìn)程的概念,使得同一個(gè)進(jìn)程可以同時(shí)并發(fā)處理多個(gè)任務(wù)。線(xiàn)程(Thread)也被稱(chēng)作輕量級(jí)進(jìn)程(Lightweight Process),線(xiàn)程是進(jìn)程的執(zhí)行單元。就像進(jìn)程在操作系統(tǒng)中的地位一樣,線(xiàn)程在程序中是獨(dú)立的、并發(fā)的執(zhí)行流。
當(dāng)進(jìn)程被初始化后,主線(xiàn)程就被創(chuàng)建了。對(duì)于絕大多數(shù)的應(yīng)用程序來(lái)說(shuō),通常僅要求有一個(gè)主線(xiàn)程,但也可以在進(jìn)程內(nèi)創(chuàng)建多個(gè)順序執(zhí)行流,這些順序執(zhí)行流就是線(xiàn)程,每一個(gè)線(xiàn)程都是獨(dú)立的。
線(xiàn)程是進(jìn)程的組成部分,一個(gè)進(jìn)程可以擁有多個(gè)線(xiàn)程,一個(gè)線(xiàn)程必須有一個(gè)父進(jìn)程。線(xiàn)程可以擁有自己的堆棧、自己的程序計(jì)數(shù)器和自己的局部變量,但不擁有系統(tǒng)資源,它與父進(jìn)程的其他線(xiàn)程共享該進(jìn)程所擁有的全部資源。因?yàn)槎鄠€(gè)線(xiàn)程共享父進(jìn)程里的全部資源,因此編程更加方便;但必須更加小心,因?yàn)樾枰_保線(xiàn)程不會(huì)妨礙同一進(jìn)程中的其他線(xiàn)程。
線(xiàn)程可以完成一定的任務(wù),可以與其他線(xiàn)程共享父進(jìn)程中的共享變量及部分環(huán)境,相互之間協(xié)同未完成進(jìn)程所要完成的任務(wù)。
線(xiàn)程是獨(dú)立運(yùn)行的,它并不知道進(jìn)程中是否還有其他線(xiàn)程存在。線(xiàn)程的運(yùn)行是搶占式的,也就是說(shuō),當(dāng)前運(yùn)行的線(xiàn)程在任何時(shí)候都可能被掛起,以便另外一個(gè)線(xiàn)程可以運(yùn)行。
一個(gè)線(xiàn)程可以創(chuàng)建和撤銷(xiāo)另一個(gè)線(xiàn)程,同一個(gè)進(jìn)程中的多個(gè)線(xiàn)程之間可以并發(fā)運(yùn)行。
從邏輯的角度來(lái)看,多線(xiàn)程存在于一個(gè)應(yīng)用程序中,讓一個(gè)應(yīng)用程序可以有多個(gè)執(zhí)行部分同時(shí)執(zhí)行,但操作系統(tǒng)無(wú)須將多個(gè)線(xiàn)程看作多個(gè)獨(dú)立的應(yīng)用,對(duì)多線(xiàn)程實(shí)現(xiàn)調(diào)度和管理,以及資源分配。線(xiàn)程的調(diào)度和管理由進(jìn)程本身負(fù)責(zé)完成。
簡(jiǎn)而言之,一個(gè)程序運(yùn)行后至少有一個(gè)進(jìn)程,在一個(gè)進(jìn)程中可以包含多個(gè)線(xiàn)程,但至少要包含一個(gè)主線(xiàn)程。
歸納起來(lái)可以這樣說(shuō),操作系統(tǒng)可以同時(shí)執(zhí)行多個(gè)任務(wù),每一個(gè)任務(wù)就是一個(gè)進(jìn)程,進(jìn)程可以同時(shí)執(zhí)行多個(gè)任務(wù),每一個(gè)任務(wù)就是一個(gè)線(xiàn)程。
多線(xiàn)程的好處
線(xiàn)程在程序中是獨(dú)立的、并發(fā)的執(zhí)行流。與分隔的進(jìn)程相比,進(jìn)程中線(xiàn)程之間的隔離程度要小,它們共享內(nèi)存、文件句柄和其他進(jìn)程應(yīng)有的狀態(tài)
因?yàn)榫€(xiàn)程的劃分尺度小于進(jìn)程,使得多線(xiàn)程程序的并發(fā)性高。進(jìn)程在執(zhí)行過(guò)程中擁有獨(dú)立的內(nèi)存單元,而多個(gè)線(xiàn)程共享內(nèi)存,從而極大地提高了程序的運(yùn)行效率。
線(xiàn)程比進(jìn)程具有更高的性能,這是由于同一個(gè)進(jìn)程中的線(xiàn)程都有共性多個(gè)線(xiàn)程共享同一個(gè)進(jìn)程的虛擬空間。線(xiàn)程共享的環(huán)境包括進(jìn)程代碼段、進(jìn)程的公有數(shù)據(jù)等,利用這些共享的數(shù)據(jù),線(xiàn)程之間很容易實(shí)現(xiàn)通信。
操作系統(tǒng)在創(chuàng)建進(jìn)程時(shí),必須為該進(jìn)程分配獨(dú)立的內(nèi)存空間,并分配大量的相關(guān)資源,但創(chuàng)建線(xiàn)程則簡(jiǎn)單得多。因此,使用多線(xiàn)程來(lái)實(shí)現(xiàn)并發(fā)比使用多進(jìn)程的性能要高得多。
總結(jié)起來(lái),使用多線(xiàn)程編程具有如下幾個(gè)優(yōu)點(diǎn):
進(jìn)程之間不能共享內(nèi)存,但線(xiàn)程之間共享內(nèi)存非常容易。
操作系統(tǒng)在創(chuàng)建進(jìn)程時(shí),需要為該進(jìn)程重新分配系統(tǒng)資源,但創(chuàng)建線(xiàn)程的代價(jià)則小得多。因此,使用多線(xiàn)程來(lái)實(shí)現(xiàn)多任務(wù)并發(fā)執(zhí)行比使用多進(jìn)程的效率高。
Python 語(yǔ)言?xún)?nèi)置了多線(xiàn)程功能支持,而不是單純地作為底層操作系統(tǒng)的調(diào)度方式,從而簡(jiǎn)化了 Python 的多線(xiàn)程編程。
在實(shí)際應(yīng)用中,多線(xiàn)程是非常有用的。比如一個(gè)瀏覽器必須能同時(shí)下載多張圖片;一個(gè) Web 服務(wù)器必須能同時(shí)響應(yīng)多個(gè)用戶(hù)請(qǐng)求;圖形用戶(hù)界面(GUI)應(yīng)用也需要啟動(dòng)單獨(dú)的線(xiàn)程,從主機(jī)環(huán)境中收集用戶(hù)界面事件……總之,多線(xiàn)程在實(shí)際編程中的應(yīng)用是非常廣泛的。
本文標(biāo)題:創(chuàng)新互聯(lián)Python教程:什么是線(xiàn)程(多線(xiàn)程),Python多線(xiàn)程的好處
文章URL:http://www.dlmjj.cn/article/cdeciii.html


咨詢(xún)
建站咨詢(xún)
