本文是在看了阮一峰先生的《進(jìn)程與線程的一個(gè)簡單解釋》之后按照個(gè)人理解寫的一篇關(guān)于闡述程序邦马、進(jìn)程和線程關(guān)系的故事Demo,在內(nèi)容上不是很嚴(yán)謹(jǐn)宴卖,請(qǐng)多包涵滋将。
在某個(gè)不知名郊區(qū),一個(gè)叫程序員的大富翁買下了一大片土地症昏,建造了一座很大很大的游樂園随闽,給它起了個(gè)名字:Program。
游樂園(Program)很大很大肝谭,有很多很多個(gè)游樂項(xiàng)目橱脸,每個(gè)游樂項(xiàng)目都有很多個(gè)工作人員在參與工作
程先生自己負(fù)責(zé)統(tǒng)計(jì)游樂園(Program)的營收。他在想分苇,有一些游樂項(xiàng)目并不常年使用添诉,比如清涼游泳池,是只在夏天開放的医寿,比如某些節(jié)日專屬的游樂項(xiàng)目栏赴,如果在計(jì)算成本的時(shí)候要總是把這些不運(yùn)營的項(xiàng)目也統(tǒng)計(jì)起來就太麻煩了,于是聰明的程先生想到了一個(gè)萬全的解決方案靖秩。他拍手道:“對(duì)靶刖臁!我可以把當(dāng)天運(yùn)營的項(xiàng)目和當(dāng)天不運(yùn)營的項(xiàng)目分開來肮低弧花颗!這樣我只要統(tǒng)計(jì)當(dāng)天運(yùn)營的項(xiàng)目的成本就行啦!”他覺得自己這個(gè)想法巧妙極了惠拭,于是乎決定給當(dāng)天投入運(yùn)營的項(xiàng)目起一個(gè)轟轟烈烈的名字扩劝,他反復(fù)翻閱了維科英漢漢英詞典庸论,最后發(fā)現(xiàn)Process這個(gè)單詞看起來了不起極了,從此游樂園(Program)里的運(yùn)營項(xiàng)目就有了一個(gè)新名字:Process棒呛。
于是乎Process和Program的概念就清晰了聂示,Program就是游樂園本身,它包含了游樂園所有的游樂項(xiàng)目簇秒,它是一個(gè)靜態(tài)的概念鱼喉。而Process是被投入運(yùn)營的游樂項(xiàng)目,是動(dòng)態(tài)的趋观。游樂園里某一個(gè)游樂項(xiàng)目從早上8點(diǎn)開始投入運(yùn)營扛禽,到晚上9點(diǎn)結(jié)束運(yùn)營,為一個(gè)Process皱坛。9點(diǎn)過后游樂項(xiàng)目停止運(yùn)營了便不能算一個(gè)Process了编曼。也就是說Process是Program的一次執(zhí)行,寫進(jìn)硬盤里的程序自然是靜態(tài)的麸恍,通過啟動(dòng)程序調(diào)動(dòng)里面的進(jìn)程,此時(shí)的進(jìn)程是動(dòng)態(tài)的搀矫,可以被Start抹沪,也可以被Destroy。**
每個(gè)運(yùn)營項(xiàng)目(Process)都是獨(dú)立的瓤球,各自占有一片地方融欧,每個(gè)運(yùn)營項(xiàng)目(Process)也有好多好多工人(Thread),有負(fù)責(zé)維護(hù)運(yùn)營這個(gè)游樂設(shè)施的卦羡,有負(fù)責(zé)每天接待客人的噪馏。可是為什么程先生要請(qǐng)那么多的工人呢绿饵?像維護(hù)游樂設(shè)施的欠肾,請(qǐng)一個(gè)維護(hù)全部的游樂設(shè)施不就行了嗎?當(dāng)然每個(gè)人都會(huì)這么想拟赊,程先生也不是傻子刺桃,他請(qǐng)這么多員工的原因是:X國是個(gè)極度貧困落后的國家,在這里勞動(dòng)力是極為廉價(jià)的吸祟,并且十分人性化瑟慈,只有當(dāng)勞動(dòng)的時(shí)候才會(huì)向老板要求一點(diǎn)面包和金錢。也就是說屋匕,線程是進(jìn)程的子單位葛碧,也是程序執(zhí)行流的基本單位。線程有輕量級(jí)的優(yōu)點(diǎn)过吻,每次start僅僅向系統(tǒng)請(qǐng)求支持運(yùn)行的一點(diǎn)點(diǎn)必不可少的資源进泼。**
在這種貧窮落后的國家里當(dāng)然不可能建立起高科技的游樂設(shè)施啦。因此這里的游樂設(shè)施可是遠(yuǎn)近聞名的純?nèi)斯さ呐丁O衲μ燧嗊@種小型的游樂項(xiàng)目比較簡單缘琅,只要一個(gè)工人(Thread)在下面不停地推動(dòng)它轉(zhuǎn)圈粘都;像旋轉(zhuǎn)魔盤也比較簡單,只要一個(gè)壯一點(diǎn)的工人(Thread)在魔盤下拉著繩子轉(zhuǎn)圈跑刷袍;像海盜船這樣的大項(xiàng)目就麻煩了习勤,需要兩個(gè)工人(Thread)配合著從兩邊來回交替地拖拽海盜船。游樂園(Program)每天都沉浸在這樣的汗水和歡聲笑語中应结。
游樂園(Program)實(shí)在是太大了匣沼,為了方便管理,程先生開始把每個(gè)游樂項(xiàng)目當(dāng)作一個(gè)獨(dú)立的單位雷酪,在每個(gè)游樂項(xiàng)目里有這個(gè)項(xiàng)目的工人們用的廁所淑仆,休息用的房間等等。富翁規(guī)定哥力,每個(gè)工人(Thread)只能在自己的工作區(qū)域內(nèi)活動(dòng)蔗怠,并享有這片區(qū)域的資源。即同一個(gè)進(jìn)程里的線程共享著這個(gè)進(jìn)程的資源吩跋。線程之間通信是不需要通過調(diào)用內(nèi)核的寞射。**
剛開始工人們住得并不舒服,因?yàn)楫?dāng)工人A進(jìn)去廁所大便的時(shí)候工人B也跑了進(jìn)來锌钮,拉了一坨屎在工人A的褲子上桥温;當(dāng)休息室睡滿了之后,工人B還大搖大擺地走進(jìn)來梁丘,壓在工人A的身上睡了過去侵浸。后來工人A被工人B壓死了,程先生意識(shí)到問題的重要性氛谜,于是善良的程先生決定買一些鎖來供工人們使用掏觉。由于線程共用同一片內(nèi)存空間,就會(huì)出現(xiàn)多個(gè)線程讀寫同一片內(nèi)存空間這種問題值漫。為了解決這個(gè)問題提出了鎖的概念履腋。**
他給廁所加了一把鎖,然后跟工人們說道:”這把鎖是我花重金買來的惭嚣,叫做Mutex(互斥鎖)遵湖,以后你們要養(yǎng)成上廁所關(guān)門的好習(xí)慣,其他人如果看到廁所被鎖起來就說明里面有人晚吞,這時(shí)候千萬不要強(qiáng)行拆門延旧,乖乖在門口等〔鄣兀“
然后程先生指著掛在休息室門上的幾把鑰匙迁沫,說道:”這個(gè)可不一樣芦瘾,這個(gè)叫Semaphore(信號(hào)量),以后你們誰進(jìn)去休息了集畅,就取一把鑰匙近弟,當(dāng)你看到門上的鑰匙被取光了,說明里面已經(jīng)沒有位置啦挺智。那你們就乖乖在門口等就好啦“
在程先生的整治下祷愉,游樂園(Program)越來越井然有序,也不再發(fā)生有人被大便活埋赦颇,或者睡覺的時(shí)候被莫名的壓死的事故了二鳄。
每天游樂項(xiàng)目運(yùn)營起來的時(shí)候就有工人(Thread)加入工作,這些工人們都被人們所熟知媒怯,但其實(shí)在游樂園(Program)中订讼,有一類人是不被人們知道的,他們被稱作Daemon扇苞。他們就像守護(hù)神一樣守護(hù)著這個(gè)游樂項(xiàng)目里的所有人欺殿,為他們提供便利。比如說鳖敷,偷偷摸摸地?fù)煲幌吕〔彼眨低得剡f一些資料啊什么的。這里闡述的是守護(hù)線程的概念哄陶。守護(hù)線程是特殊的線程帆阳,在后臺(tái)為其他線程提供資源等哺壶,如Java的垃圾回收機(jī)制屋吨。**
就這樣,程先生的游樂園(Program)每天都在欣欣向榮山宾,在這片貧困落后的國度儼然是一處靚麗的風(fēng)景線至扰。