堆、棧、隊(duì)列之間的區(qū)別
1.堆 是在程序運(yùn)行時(shí),申請某個(gè)大小的內(nèi)存空間。即動(dòng)態(tài)分配內(nèi)存,對其訪問和對一般內(nèi)存的訪問沒有區(qū)別。
2.棧 就是一個(gè)桶(先進(jìn)后出),后放進(jìn)去的先拿出來,它下面本來有的東西要等它出來之后才能出來。堆棧就是一個(gè)特殊的棧。
3.隊(duì)列(先進(jìn)先出)只能在隊(duì)頭做刪除操作,在隊(duì)尾做插入操作,而棧只能在棧頂做插入和刪除操作。
2.線程與進(jìn)程
2.1什么是線程?
線程是操作系統(tǒng)能夠進(jìn)行運(yùn)算調(diào)度的最小單位(程序執(zhí)行流的最小單元)。它被包含在進(jìn)程之中,是進(jìn)程中的實(shí)際運(yùn)作單位。一條線程指的是進(jìn)程中一個(gè)單一順序的控制流,一個(gè)進(jìn)程中可以并發(fā)多個(gè)線程,每條線程并行執(zhí)行不同的任務(wù)。
一個(gè)標(biāo)準(zhǔn)的線程由線程ID,當(dāng)前指令指針(PC),寄存器集合和堆棧組成。另外,線程是進(jìn)程中的一個(gè)實(shí)體,是被系統(tǒng)獨(dú)立調(diào)度和分派的基本單位,線程自己不擁有系統(tǒng)資源,只擁有一點(diǎn)兒在運(yùn)行中必不可少的資源,但它可與同屬一個(gè)進(jìn)程的其它線程共享進(jìn)程所擁有的全部資源。一個(gè)線程可以創(chuàng)建和撤消另一個(gè)線程,同一進(jìn)程中的多個(gè)線程之間可以并發(fā)執(zhí)行。由于線程之間的相互制約,致使線程在運(yùn)行中呈現(xiàn)出間斷性。線程也有就緒、阻塞和運(yùn)行三種基本狀態(tài)。就緒狀態(tài)是指線程具備運(yùn)行的所有條件,邏輯上可以運(yùn)行,在等待處理機(jī);運(yùn)行狀態(tài)是指線程占有處理機(jī)正在運(yùn)行;阻塞狀態(tài)是指線程在等待一個(gè)事件(如某個(gè)信號量),邏輯上不可執(zhí)行。每一個(gè)程序都至少有一個(gè)線程,若程序只有一個(gè)線程,那就是程序本身。
線程是程序中一個(gè)單一的順序控制流程。進(jìn)程內(nèi)一個(gè)相對獨(dú)立的、可調(diào)度的執(zhí)行單元,是系統(tǒng)獨(dú)立調(diào)度和分派CPU的基本單位指運(yùn)行中的程序的調(diào)度單位。在單個(gè)程序中同時(shí)運(yùn)行多個(gè)線程完成不同的工作,稱為多線程。
2.2什么是進(jìn)程?
進(jìn)程(Process)是計(jì)算機(jī)中的程序關(guān)于某數(shù)據(jù)集合上的一次運(yùn)行活動(dòng),是系統(tǒng)進(jìn)行資源分配和調(diào)度的基本單位,是操作系統(tǒng)結(jié)構(gòu)的基礎(chǔ)。在早期面向進(jìn)程設(shè)計(jì)的計(jì)算機(jī)結(jié)構(gòu)中,進(jìn)程是程序的基本執(zhí)行實(shí)體;在當(dāng)代面向線程設(shè)計(jì)的計(jì)算機(jī)結(jié)構(gòu)中,進(jìn)程是線程的容器。程序是指令、數(shù)據(jù)及其組織形式的描述,進(jìn)程是程序的實(shí)體。里面包含對各種資源的調(diào)用,內(nèi)存的管理,網(wǎng)絡(luò)接口的調(diào)用等。。。對各種資源管理的集合 就可以稱為 進(jìn)程
2.3線程和進(jìn)程的區(qū)別
(1)線程共享內(nèi)存空間;進(jìn)程的內(nèi)存是獨(dú)立的
(2)同一個(gè)進(jìn)程的線程之間可以直接交流;兩個(gè)進(jìn)程想通信,必須通過一個(gè)中間代理來實(shí)現(xiàn)
(3)創(chuàng)建新線程很簡單; 創(chuàng)建新進(jìn)程需要對其父進(jìn)程進(jìn)行一次克隆
(4)一個(gè)線程可以控制和操作同一進(jìn)程里的其他線程;但是進(jìn)程只能操作子進(jìn)程
(5)改變主線程(如優(yōu)先權(quán)),可能會(huì)影響其它線程;改變父進(jìn)程,不影響子進(jìn)程
3.Python GIL(Global Interpreter Lock)
無論你啟多少個(gè)線程,你有多少個(gè)cpu, Python在執(zhí)行的時(shí)候會(huì)淡定的在同一時(shí)刻只允許一個(gè)線程運(yùn)行,這還叫什么多線程呀?
需要明確的一點(diǎn)是GIL并不是Python的特性,它是在實(shí)現(xiàn)Python解析器(CPython)時(shí)所引入的一個(gè)概念。就好比C++是一套語言(語法)標(biāo)準(zhǔn),但是可以用不同的編譯器來編譯成可執(zhí)行代碼。有名的編譯器例如GCC,INTEL C++,Visual C++等。Python也一樣,同樣一段代碼可以通過CPython,PyPy,Psyco等不同的Python執(zhí)行環(huán)境來執(zhí)行。像其中的JPython就沒有GIL。然而因?yàn)镃Python是大部分環(huán)境下默認(rèn)的Python執(zhí)行環(huán)境。所以在很多人的概念里CPython就是Python,也就想當(dāng)然的把GIL歸結(jié)為Python語言的缺陷。所以這里要先明確一點(diǎn):GIL并不是Python的特性,Python完全可以不依賴于GIL