線程(Thread)和進(jìn)程(process)都是操作系統(tǒng)的基本概念,但是都很抽象凡资,我們不容易想清楚,最近閱讀了一些的文章谬运,下面記錄一下對(duì)其的理解隙赁。
一、基本概念(來自于wikipedia)
- 進(jìn)程(process)
進(jìn)程(英語:process)梆暖,是指計(jì)算機(jī)中已運(yùn)行的程序伞访。進(jìn)程曾經(jīng)是分時(shí)系統(tǒng)的基本運(yùn)作單位。在面
向進(jìn)程設(shè)計(jì)的系統(tǒng)(如早期的UNIX轰驳,Linux 2.4及更早的版本)中厚掷,進(jìn)程是程序的基本執(zhí)行實(shí)體;在
面向線程設(shè)計(jì)的系統(tǒng)(如當(dāng)代多數(shù)操作系統(tǒng)级解、Linux 2.6及更新的版本)中冒黑,進(jìn)程本身不是基本運(yùn)行
單位,而是線程的容器勤哗。程序本身只是指令薛闪、數(shù)據(jù)及其組織形式的描述,進(jìn)程才是程序(那些指令和數(shù)
據(jù))的真正運(yùn)行實(shí)例俺陋。
- 線程
線程(英語:thread)是操作系統(tǒng)能夠進(jìn)行運(yùn)算調(diào)度的最小單位豁延。大部分情況下昙篙,它被包含在進(jìn)程之
中,是進(jìn)程中的實(shí)際運(yùn)作單位诱咏。一條線程指的是進(jìn)程中一個(gè)單一順序的控制流苔可,一個(gè)進(jìn)程中可以并發(fā)多
個(gè)線程,每條線程并行執(zhí)行不同的任務(wù)袋狞。在Unix System V及SunOS中也被稱為輕量進(jìn)程
(lightweight processes)焚辅,但輕量進(jìn)程更多指內(nèi)核線程(kernel thread),而把用戶線程
(user thread)稱為線程,且線程是獨(dú)立調(diào)度和分配的基本單位苟鸯。
從上述的描寫中我們可以得到一個(gè)這樣的結(jié)論同蜻,一個(gè)操作系統(tǒng)可以有多個(gè)進(jìn)程,一個(gè)進(jìn)程中可以有多個(gè)線程早处,也就是說進(jìn)程其實(shí)是線程的容器湾蔓。
- 線程和進(jìn)程的一個(gè)比較表格:
S.no | Process | Thread |
---|---|---|
1、 | 進(jìn)程是計(jì)算機(jī)正在運(yùn)行的程序; | 線程是進(jìn)程的一部分砌梆,是調(diào)度的基本單位; |
2默责、 | 需要更多的成本去創(chuàng)建,銷毀咸包,切換上下文桃序,通信; | 需要更少的成本; |
3、 | 消耗更多的計(jì)算機(jī)資源烂瘫; | 消耗更少的計(jì)算機(jī)資源 |
4媒熊、 | 進(jìn)程間獨(dú)立; | 線程間之間可以共享內(nèi)存 |
5坟比、 | 進(jìn)程有自己獨(dú)立的棧和地址空間泛释; | 線程間有自己所屬的進(jìn)程管理塊,從中獲取棧和地址空間 |
但是還是很抽象温算,最近看了一篇文章,一個(gè)歪果人的博客用了一個(gè)比較生動(dòng)的例子闡述了線程和進(jìn)程之間的關(guān)系间影,覺得很有意思注竿,這里借用他的例子和自己的一些理解解釋一下。
原文??
二魂贬、比喻的修辭手法
-
進(jìn)程比喻為一個(gè)房子巩割,獨(dú)幢小別墅,大體是下面的樣子付燥。
- 進(jìn)程:
多進(jìn)程就是我們所說的別墅區(qū)宣谈,房間占一塊地基,那么進(jìn)程就占一塊計(jì)算機(jī)資源键科,就是一個(gè)container闻丑,房子里有很多的房間漩怎,包含了很多的功能,廚房嗦嗡,廁所勋锤,臥室等等,這個(gè)就是計(jì)算機(jī)分配給進(jìn)程的資源侥祭,進(jìn)程和進(jìn)程之間了叁执,就是一個(gè)別墅區(qū)的兩棟小別墅,互相隔離矮冬,強(qiáng)行闖入是違法的谈宛,但是房子是一個(gè)被動(dòng)的對(duì)象,他在那里什么也干不了胎署,他只能被住吆录,被使用;
- 線程:
既然進(jìn)程是線程的容器硝拧,那房子里面的人就是線程径筏,如果你單身就是單線程,如果你結(jié)婚生子就是多線程障陶,這個(gè)房子的住戶對(duì)于房子來說是從屬關(guān)系滋恬,我買了這棟房子,我就有權(quán)利使用這個(gè)房子的功能抱究,而且對(duì)于房子里的人是共享的恢氯,我們可以使用衛(wèi)生間,臥室鼓寺,陽臺(tái)等勋拟,這些區(qū)域我們叫共享內(nèi)存。
三妈候、名詞解釋
1敢靡、上下文
我們經(jīng)常聽見上下文和上下文切換這一類的詞語,我們?cè)趺蠢斫馍舷挛倪@個(gè)概念呢苦银?
我的理解上下文就是需要的環(huán)境啸胧,我們應(yīng)該玩過此類的游戲,一個(gè)賬號(hào)有很多個(gè)角色幔虏,一個(gè)法師是46級(jí)纺念,一個(gè)戰(zhàn)士是100級(jí),如果你選擇了法師想括,對(duì)應(yīng)法師的裝備坐騎和一些通關(guān)的信息就是這個(gè)角色的上下文陷谱,如果你玩了一會(huì)法師,突然想玩戰(zhàn)士瑟蜈,你就需要切換到戰(zhàn)士視角烟逊,這種切換就可以理解為上下文的切換吧渣窜,不知道這個(gè)比喻是否合適。
進(jìn)程=運(yùn)行中的程序=程序代碼+代碼所出的上下文焙格,對(duì)應(yīng)上面的比喻图毕,這個(gè)角色就是程序代碼,代碼可以運(yùn)行眷唉,你也可以操作這個(gè)游戲人物走動(dòng)或者放出招式予颤,而這個(gè)游戲角色的裝備等級(jí)就是這個(gè)人物的上下文。
?那進(jìn)程和線程的上下文切換有什么區(qū)別冬阳?
進(jìn)程:通過上面的比喻蛤虐,我們?nèi)绻枰袚Q角色,是整個(gè)游戲場(chǎng)景都要切換的肝陪,裝備坐騎等級(jí)驳庭,這些都會(huì)發(fā)生一個(gè)本質(zhì)的變化,虛擬空間也會(huì)變化氯窍,對(duì)比房子的比喻饲常,我們換了一個(gè)房子,對(duì)于cpu的緩存機(jī)制也會(huì)干擾狼讨,角色都換了贝淤,那以后保存的那些信息是不是一瞬間就作廢了。
線程:線程切換上下文就可以理解為同一個(gè)游戲角色政供,只是切換了一個(gè)游戲模式播聪,比如刀戰(zhàn),我只需要帶上刀具布隔,魔法戰(zhàn)我只需要帶上魔杖离陶,空間還是一樣,房子還是同一個(gè)衅檀,這樣的消耗會(huì)少的多招刨。
四、線程和進(jìn)程的詳解
?為什么會(huì)出現(xiàn)并發(fā)哀军?
其實(shí)這就是我們壓榨CPU的一種手段沉眶,那么我們就需要了解一下CPU是如何工作的,帶著這個(gè)問題我查閱了一些資料排苍,知道了一個(gè)叫PC(program Counter)的東西,這里粘貼一下wikipedia的介紹:
程序計(jì)數(shù)器(英語:Program Counter学密,PC)是一個(gè)中央處理器中的寄存器淘衙,用于指示計(jì)算機(jī)在其
程序序列中的位置。在大部分的處理器中腻暮,指令指針都是在提取程序指令后就被立即增加彤守;也就是說
跳躍指令的目的地址毯侦,是由跳躍指令的操作數(shù)加上跳躍指令之后下一個(gè)指令的地址(單位為比特或字
節(jié),視電腦形態(tài)而定)來獲得目的地具垫。
- CPU運(yùn)行程序的步驟我就可以簡(jiǎn)單的理解為3步
1侈离、pc指針指向一句代碼,然后開始算筝蚕;
2卦碾、算完以后,pc指針=當(dāng)前指針+1(假設(shè)沒有跳躍的方式)
3起宽、執(zhí)行下一段代碼洲胖,pc指針在移動(dòng);
但是CPU可以一直不休息坯沪,一直算算算嗎绿映?答案是不行,因?yàn)橛衖o操作腐晾,比如遇到一個(gè)打印語句叉弦,IO操作相比于cpu的計(jì)算操作是很慢慢的,就是一個(gè)是飛機(jī)一個(gè)是步行的對(duì)比吧藻糖,那cpu就需要等啊淹冰,等io操作完成以后,在進(jìn)行下面的操作颖御,但是我們要壓榨cpu啊榄棵,那可以不可以讓cpu在等待的期間,干其他的事呢潘拱,那就讓cpu干其他程序的計(jì)算工作疹鳄,讓他沒有休息的時(shí)間,交替的運(yùn)行不同的程序芦岂,這就是并發(fā)瘪弓。