我們用一個(gè)例子來(lái)闡述線程、核心和函數(shù)之間的關(guān)系,假設(shè)有遛狗、掃地兩類工作要做:
遛狗就是為狗系上繩子然后牽著它在小區(qū)里溜達(dá)一圈,這句話就描述了遛狗的邏輯,即對(duì)應(yīng)到函數(shù)定義,它是一個(gè)對(duì)應(yīng)到設(shè)計(jì)的靜態(tài)的概念
每項(xiàng)工作,最終需要人去做,人就對(duì)應(yīng)到硬件:CPU/Core/VCore,是任務(wù)被完成的物質(zhì)基礎(chǔ)
那什么對(duì)應(yīng)軟件線程? 任務(wù)拆分。
一個(gè)例子
假設(shè)現(xiàn)在有2條狗需要遛、3個(gè)房間需要打掃。可以把遛狗拆成2個(gè)任務(wù),一個(gè)任務(wù)是遛小狗,另一個(gè)任務(wù)是遛大狗;打掃房間拆分為3個(gè)任務(wù),3個(gè)房間對(duì)應(yīng)3個(gè)任務(wù),執(zhí)行這樣的拆分策略后,將會(huì)產(chǎn)生2+3=5個(gè)任務(wù)。但如果只有2個(gè)人,2個(gè)人無(wú)法同時(shí)做5件事,讓某人在某時(shí)干某事由調(diào)度系統(tǒng)負(fù)責(zé)。
如果張三在遛小狗,那就對(duì)應(yīng)一個(gè)線程被執(zhí)行,李四在掃房間A,則表示另一個(gè)線程在執(zhí)行中,可見(jiàn)線程是一個(gè)動(dòng)態(tài)的概念。
軟件線程不會(huì)一直處于執(zhí)行中,原因是多方面的。上述例子是因?yàn)槿耸植粔?,所以遛大狗的任?wù)還處于等待被執(zhí)行的狀態(tài),其他的原因包括中斷、搶占、條件依賴等。比如李四掃地過(guò)程中接到一個(gè)電話,他需要去處理更緊急的事情(接電話),則掃地這個(gè)事情被掛起,李四打完電話后繼續(xù)掃地,則這個(gè)線程會(huì)被繼續(xù)執(zhí)行。
如果只有1個(gè)人,則上述5個(gè)任務(wù)依然可以被依次或交錯(cuò)完成,所以多線程是一個(gè)編程模型,多線程并不一定需要多CPU多Core,單CPU單Core系統(tǒng)依然可以運(yùn)行多線程程序(雖然最大化利用多CPU多Core的處理能力是多線程程序設(shè)計(jì)的一個(gè)重要目標(biāo))。1個(gè)人無(wú)法同時(shí)做多件事,單CPU/單Core也不可以,操作系統(tǒng)通過(guò)時(shí)間分片技術(shù)應(yīng)對(duì)遠(yuǎn)多于CPU/Core數(shù)的多任務(wù)執(zhí)行的挑戰(zhàn)。也可以把有些任務(wù)只分配給某些人去完成,這對(duì)應(yīng)到CPU親和性和綁核。