在操作系統(tǒng)(os)級(jí)別补胚,有進(jìn)程(process)和線程(thread)兩個(gè)我們看不到但又實(shí)際存在的“東西”,這兩個(gè)東西都是用來模擬“并行”的追迟,寫操作系統(tǒng)的程序員通過用一定的策略給不同的進(jìn)程和線程分配CPU計(jì)算資源溶其,來讓用戶“以為”幾個(gè)不同的事情在“同時(shí)”進(jìn)行“。在單CPU上怔匣,是os代碼強(qiáng)制把一個(gè)進(jìn)程或者線程掛起握联,換成另外一個(gè)來計(jì)算,所以每瞒,實(shí)際上是串行的金闽,只是“概念上的并行”。在現(xiàn)在的多核的cpu上剿骨,線程可能是“真正并行的”代芜。
線程、進(jìn)程浓利、協(xié)程的區(qū)別
進(jìn)程擁有自己獨(dú)立的堆和棧挤庇,既不共享堆,亦不共享?xiàng)4矗M(jìn)程由操作系統(tǒng)調(diào)度嫡秕。
線程擁有自己獨(dú)立的棧和共享的堆,共享堆苹威,不共享?xiàng)@パ剩€程亦由操作系統(tǒng)調(diào)度(標(biāo)準(zhǔn)線程是這樣的)。
協(xié)程和線程一樣共享堆牙甫,不共享?xiàng)V佬铮瑓f(xié)程由程序員在協(xié)程的代碼里顯示調(diào)度。
一個(gè)應(yīng)用程序一般對(duì)應(yīng)一個(gè)進(jìn)程窟哺,一個(gè)進(jìn)程一般有一個(gè)主線程泻轰,還有若干個(gè)輔助線程,線程之間是平行運(yùn)行的且轨,在線程里面可以開啟協(xié)程浮声,讓程序在特定的時(shí)間內(nèi)運(yùn)行。
協(xié)程和線程的區(qū)別是:協(xié)程避免了無意義的調(diào)度旋奢,由此可以提高性能阿蝶,但也因此,程序員必須自己承擔(dān)調(diào)度的責(zé)任黄绩,同時(shí)羡洁,協(xié)程也失去了標(biāo)準(zhǔn)線程使用多CPU的能力。
打個(gè)比方吧爽丹,假設(shè)有一個(gè)操作系統(tǒng)筑煮,是單核的,系統(tǒng)上沒有其他的程序需要運(yùn)行粤蝎,有兩個(gè)線程 A 和 B 真仲,A 和 B 在單獨(dú)運(yùn)行時(shí)都需要 10 秒來完成自己的任務(wù),而且任務(wù)都是運(yùn)算操作初澎,A B 之間也沒有競(jìng)爭(zhēng)和共享數(shù)據(jù)的問題〗沼Γ現(xiàn)在 A B 兩個(gè)線程并行虑凛,操作系統(tǒng)會(huì)不停的在 A B 兩個(gè)線程之間切換,達(dá)到一種偽并行的效果软啼,假設(shè)切換的頻率是每秒一次桑谍,切換的成本是 0.1 秒(主要是棧切換),總共需要 20 + 19 * 0.1 = 21.9 秒祸挪。如果使用協(xié)程的方式锣披,可以先運(yùn)行協(xié)程 A ,A 結(jié)束的時(shí)候讓位給協(xié)程 B 贿条,只發(fā)生一次切換雹仿,總時(shí)間是 20 + 1 * 0.1 = 20.1 秒。如果系統(tǒng)是雙核的整以,而且線程是標(biāo)準(zhǔn)線程胧辽,那么 A B 兩個(gè)線程就可以真并行,總時(shí)間只需要 10 秒公黑,而協(xié)程的方案仍然需要 20.1 秒票顾。