進(jìn)程對(duì)于有一點(diǎn)會(huì)玩電腦的朋友都知道,我們打開(kāi)任務(wù)管理器就可以看到很多進(jìn)程,這些進(jìn)程有些是系統(tǒng)的,有些是第三方軟件的,那么還有一個(gè)線程大家又知道是什么嗎?進(jìn)程和線程的區(qū)別,兩者又有什么關(guān)系呢?下面KK小編就帶大家一起來(lái)學(xué)習(xí)一下關(guān)于進(jìn)程,線程的相關(guān)知識(shí)。
進(jìn)程是什么?
1、進(jìn)程中可以包括有多個(gè)線程,也可以只有一個(gè)線程,進(jìn)程與進(jìn)程之間是相對(duì)比較獨(dú)立的。
2、進(jìn)程中有一個(gè)邏輯內(nèi)存,每個(gè)進(jìn)程都會(huì)有分配到一個(gè)獨(dú)立的內(nèi)存空間,還分配了一個(gè)文件/網(wǎng)絡(luò)句柄,句柄類似一個(gè)標(biāo)識(shí)符,所有的進(jìn)程所或多或少都有一定的句柄數(shù)的引用,句柄實(shí)際上是一個(gè)指針,指向一塊包含具體信息數(shù)據(jù)的內(nèi)存,所以句柄是當(dāng)你要訪問(wèn)該進(jìn)程時(shí)取得的,使用完必須釋放。(打個(gè)比方,我要使用redis需要打開(kāi)6379端口,這個(gè)時(shí)候需要訪問(wèn)句柄,獲取到內(nèi)存地址去訪問(wèn)獲取對(duì)應(yīng)的資源來(lái)執(zhí)行該進(jìn)程)
3、一個(gè)進(jìn)程可以擁有多個(gè)句柄數(shù)目,但是只有一個(gè)進(jìn)程ID
4、進(jìn)程不同時(shí)刻所引用的句柄數(shù)目是不一定的
線程是什么?
1、線程中有一個(gè)棧內(nèi)存(很多人把它稱為堆棧),主要用來(lái)存儲(chǔ)局部變量資源或者內(nèi)存地址
2、還有一個(gè)PC塊,主要是存儲(chǔ)下一條執(zhí)行指令的地址,PC是指向一塊共同的內(nèi)存(進(jìn)程里面的被系統(tǒng)分配到的邏輯內(nèi)存)。
3、TCS :ThreadLocalStorage 主要存儲(chǔ)線程自己定義的變量,不想和其他線程進(jìn)行共享,理解為線程的私有變量。
4、線程共享進(jìn)程的資源主要有:進(jìn)程代碼塊、進(jìn)程的全局和靜態(tài)變量、進(jìn)程打開(kāi)的文件描述符、信號(hào)的處理器、進(jìn)程當(dāng)前的目錄、進(jìn)程ID、進(jìn)程組ID。
進(jìn)程和線程的區(qū)別
根本區(qū)別:進(jìn)程是操作系統(tǒng)資源分配的基本單位,而線程是任務(wù)調(diào)度和執(zhí)行的基本單位
在開(kāi)銷方面:每個(gè)進(jìn)程都有獨(dú)立的代碼和數(shù)據(jù)空間(程序上下文),程序之間的切換會(huì)有較大的開(kāi)銷;線程可以看做輕量級(jí)的進(jìn)程,同一類線程共享代碼和數(shù)據(jù)空間,每個(gè)線程都有自己獨(dú)立的運(yùn)行棧和程序計(jì)數(shù)器(PC),線程之間切換的開(kāi)銷小。
所處環(huán)境:在操作系統(tǒng)中能同時(shí)運(yùn)行多個(gè)進(jìn)程(程序);而在同一個(gè)進(jìn)程(程序)中有多個(gè)線程同時(shí)執(zhí)行(通過(guò)CPU調(diào)度,在每個(gè)時(shí)間片中只有一個(gè)線程執(zhí)行)
內(nèi)存分配方面:系統(tǒng)在運(yùn)行的時(shí)候會(huì)為每個(gè)進(jìn)程分配不同的內(nèi)存空間;而對(duì)線程而言,除了CPU外,系統(tǒng)不會(huì)為線程分配內(nèi)存(線程所使用的資源來(lái)自其所屬進(jìn)程的資源),線程組之間只能共享資源。
包含關(guān)系:凡是進(jìn)程必須有并且至少有一個(gè)線程,只有一個(gè)線程的話我們可以看做是單線程,如果一個(gè)進(jìn)程內(nèi)有多個(gè)線程,則執(zhí)行過(guò)程不是一條線的,而是多條線(線程)共同完成的;線程是進(jìn)程的一部分,所以線程也被稱為輕權(quán)進(jìn)程或者輕量級(jí)進(jìn)程。