一、線程的概念
線程是進(jìn)程內(nèi)部的一條執(zhí)行序列或執(zhí)行路徑,一個(gè)進(jìn)程可以包含多條線程。
一個(gè)進(jìn)程中有兩條或多條執(zhí)行路徑的時(shí)候,它們是可以同時(shí)執(zhí)行的,也就是說(shuō),一個(gè)進(jìn)程中的多個(gè)線程是可以同時(shí)執(zhí)行的。當(dāng)我們需要一個(gè)程序同時(shí)執(zhí)行兩個(gè)不同操作的時(shí)候就引入了多線程。如果是一個(gè)單線程,只有一條路徑時(shí),不可能同時(shí)執(zhí)行兩個(gè)不同操作,因?yàn)槠渲幸粋€(gè)操作正在執(zhí)行的時(shí)候,另一個(gè)操作是阻塞狀態(tài)。
當(dāng)一個(gè)進(jìn)程有一個(gè)主線程和一個(gè)子線程的時(shí)候,主線程和子線程可以同時(shí)執(zhí)行;也可以有多個(gè)相同的子線程,這樣就是一個(gè)主線程和多個(gè)子線程同時(shí)執(zhí)行,多個(gè)子線程做的事情是一樣的;也可以有多個(gè)不同的子線程,這樣就是一個(gè)主線程和多個(gè)不同的子線程同時(shí)執(zhí)行,多個(gè)子線程做的事情不一樣。
二、線程的實(shí)現(xiàn)方式
在操作系統(tǒng)中,線程的實(shí)現(xiàn)有以下三種方式:
1.用戶級(jí)線程
在用戶空間模擬出了多條執(zhí)行路徑,但在內(nèi)核的眼里只有一條執(zhí)行路徑,這種線程的創(chuàng)建不需要操作系統(tǒng)參與并且可以創(chuàng)建很多,這種線程的缺點(diǎn)是無(wú)法進(jìn)入多個(gè)處理器,因?yàn)閮?nèi)核無(wú)法感知到每一個(gè)線程的存在,所以無(wú)法把每一個(gè)不同的線程放到不同的處理器上讓它執(zhí)行。用戶級(jí)線程的優(yōu)點(diǎn)是在用戶空間創(chuàng)建,開(kāi)銷比較小,可以創(chuàng)建很多,缺點(diǎn)是無(wú)法使用多個(gè)處理器。
2.內(nèi)核級(jí)線程
利用內(nèi)核提供的接口去創(chuàng)建線程,創(chuàng)建內(nèi)核級(jí)線程是需要操作系統(tǒng)參與的,這種線程是由操作系統(tǒng)來(lái)直接管理,內(nèi)核也可以感知到每一個(gè)線程的存在,所以內(nèi)核級(jí)線程的創(chuàng)建離不開(kāi)操作系統(tǒng)的支持,可以將其中一個(gè)線程分配到某一個(gè)處理器上將另一個(gè)線程分配到另一個(gè)處理器上,它就可以實(shí)現(xiàn)真正意義上的并行。內(nèi)核級(jí)線程的優(yōu)點(diǎn)是可以使用多個(gè)處理器,缺點(diǎn)是開(kāi)銷大。
3.組合級(jí)線程
會(huì)在內(nèi)核中創(chuàng)建多條內(nèi)核級(jí)線程,目的是為了能夠使用多個(gè)處理器,也會(huì)在用戶空間創(chuàng)建多個(gè)用戶級(jí)線程。所以,組合級(jí)線程可以利用多處理器的資源,同時(shí)可以在用戶空間創(chuàng)建多個(gè)用戶級(jí)的線程,是我們后期創(chuàng)建線程的開(kāi)銷可以變小,因?yàn)楫?dāng)線程數(shù)目超出處理器數(shù)目的情況下,最后還是只能時(shí)間片輪轉(zhuǎn)。
Linux 中線程的實(shí)現(xiàn):
Linux 實(shí)現(xiàn)線程的機(jī)制非常獨(dú)特。從內(nèi)核的角度來(lái)說(shuō),它并沒(méi)有線程這個(gè)概念。Linux把所有的線程都當(dāng)做進(jìn)程來(lái)實(shí)現(xiàn)。內(nèi)核并沒(méi)有準(zhǔn)備特別的調(diào)度算法或是定義特別的數(shù)據(jù)結(jié)構(gòu)來(lái)表征線程。相反,線程僅僅被視為一個(gè)與其他進(jìn)程共享某些資源的進(jìn)程。每個(gè)線程都擁有唯一隸屬于自己的task_struct(PCB),所以在內(nèi)核中,它看起來(lái)就像是一個(gè)普通的進(jìn)程(只是線程和其他一些進(jìn)程共享某些資源,如地址空間)。實(shí)際上,如果創(chuàng)建2個(gè)線程,它會(huì)消耗2個(gè)pid,對(duì)外呈現(xiàn)的是主進(jìn)程的pid,就是主線程的pid作為整個(gè)進(jìn)程的pid。
三、進(jìn)程與線程的區(qū)別
1.進(jìn)程:一個(gè)正在運(yùn)行的程序
進(jìn)程是資源分配的最小單位;
進(jìn)程有自己的獨(dú)立地址空間;
進(jìn)程的創(chuàng)建消耗資源大;
進(jìn)程的切換開(kāi)銷大。
2.線程:是進(jìn)程內(nèi)部的一條執(zhí)行序列或執(zhí)行路徑文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-668973.html
線程是CPU調(diào)度的最小單位;
線程共享進(jìn)程中的地址空間;
線程的創(chuàng)建相對(duì)較小;
線程的切換開(kāi)銷相對(duì)較小。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-668973.html
到了這里,關(guān)于Linux 線程的概念與實(shí)現(xiàn)方式的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!