背景介紹
一直以來,自己對進(jìn)程和線程的理解都是皮毛曲秉,前一段時(shí)間出去面試,面試官讓說一下進(jìn)程與線程的區(qū)別榆鼠,當(dāng)時(shí)的回答讓面試官說:你真是清奇矢洲。大概他也是覺得我在一本正經(jīng)地胡說吧。
回來后查閱了一下,大概都如下描述袁滥,記錄一下,以防以后自己再天馬行空的杜撰揩徊。
程序:
程序是指令和數(shù)據(jù)的有序集合嵌赠。其本身沒有任何運(yùn)行的含義,是一個(gè)靜態(tài)的概念齿税。為了一個(gè)程序運(yùn)行,計(jì)算機(jī)加載程序代碼炊豪,可能還要加載數(shù)據(jù),從而初始化成一個(gè)開始狀態(tài)牵舱,然后調(diào)用某種啟動(dòng)機(jī)制。在最低層上礁凡,這些是由一個(gè)加載器開始的慧妄。
在大多數(shù)計(jì)算機(jī)中,操作系統(tǒng)例如Windows等韧掩,加載并且執(zhí)行很多程序窖铡。在這種情況下,一個(gè)計(jì)算機(jī)程序是指一個(gè)單獨(dú)的可執(zhí)行的映射费彼,而不是當(dāng)前在這個(gè)計(jì)算機(jī)上運(yùn)行的全部程序箍铲。
進(jìn)程:
英語process,是計(jì)算機(jī)中已運(yùn)行程序的實(shí)體颠猴。即程序在運(yùn)行時(shí)翘瓮,會產(chǎn)生一個(gè)或者多個(gè)進(jìn)程。 進(jìn)程本身不是基本運(yùn)行單位资盅,而是線程的容器。程序本身只是指令每庆、數(shù)據(jù)及其組織形式的描述今穿,進(jìn)程才是程序(那些指令和數(shù)據(jù))的真正運(yùn)行實(shí)例。若干進(jìn)程有可能與同一個(gè)程序相關(guān)系凤价,且每個(gè)進(jìn)程皆可以同步(循序)或異步(平行)的方式獨(dú)立運(yùn)行。
線程:
線程是進(jìn)程的一個(gè)實(shí)體富蓄,是CPU調(diào)度和分派的基本單位,它是比進(jìn)程更小的能獨(dú)立運(yùn)行的基本單位慢逾。線程自己基本上不擁有系統(tǒng)資源,只擁有一點(diǎn)在運(yùn)行中必不可少的資源(如程序計(jì)數(shù)器,一組寄存器和棧)口注,一個(gè)線程可以創(chuàng)建和撤銷另一個(gè)線程君珠。同一進(jìn)程的多線程之間資源共享,數(shù)據(jù)(堆棧和局部變量外)共享策添。
需要注意到的是唯竹,一顆CPU同一時(shí)刻只能執(zhí)行一個(gè)線程。
程序浸颓、進(jìn)程、線程三者之間的關(guān)系
假設(shè)這樣一個(gè)場景棵磷,我們擁有一套程序蒂秘,其執(zhí)行過程是以單進(jìn)程的方式執(zhí)行的,進(jìn)程在運(yùn)行時(shí)又以多個(gè)線程的形式執(zhí)行。三者的關(guān)系可以使用下圖簡單的描述:
程序并不能單獨(dú)執(zhí)行撇贺,只有將程序加載到內(nèi)存中冰抢,系統(tǒng)為他分配資源后才能夠執(zhí)行,這種執(zhí)行的程序稱之為進(jìn)程翠订,也就是說進(jìn)程是系統(tǒng)進(jìn)行資源分配和調(diào)度的一個(gè)獨(dú)立單位,每個(gè)進(jìn)程都有自己單獨(dú)的地址空間官撼。所以說程序與進(jìn)程的區(qū)別在于似谁,程序是指令的集合,是進(jìn)程運(yùn)行的靜態(tài)描述文本巩踏,而進(jìn)程則是程序在系統(tǒng)上順序執(zhí)行時(shí)的動(dòng)態(tài)活動(dòng)菠净。
但是進(jìn)程存在著很多缺陷彪杉,主要集中在兩點(diǎn):
1) 進(jìn)程只能在同一時(shí)間干一件事情,如果想同時(shí)干兩件事或多件事情煞抬,進(jìn)程就無能為力了构哺。
2)進(jìn)程在執(zhí)行的過程中如果由于某種原因阻塞了,例如等待輸入残拐,整個(gè)進(jìn)程就會掛起碟嘴,其他與輸入無關(guān)的工作也必須等待輸入結(jié)束后才能順序執(zhí)行。
為了解決上述兩點(diǎn)缺陷错沃,引入了線程這個(gè)概念雀瓢。
進(jìn)程和線程的主要差別在于它們是不同的操作系統(tǒng)資源管理方式。進(jìn)程有獨(dú)立的地址空間醒叁,一個(gè)進(jìn)程崩潰后,在保護(hù)模式下不會對其它進(jìn)程產(chǎn)生影響把沼,而線程只是一個(gè)進(jìn)程中的不同執(zhí)行路徑饮睬。線程有自己的堆棧和局部變量,但線程之間沒有單獨(dú)的地址空間续捂,一個(gè)線程死掉就等于整個(gè)進(jìn)程死掉,所以多進(jìn)程的程序要比多線程的程序健壯劫拗,但在進(jìn)程切換時(shí)矾克,耗費(fèi)資源較大,效率要差一些酒繁。但對于一些要求同時(shí)進(jìn)行并且又要共享某些變量的并發(fā)操作控妻,只能用線程,不能用進(jìn)程郎哭。
1) 簡而言之,一個(gè)程序至少有一個(gè)進(jìn)程,一個(gè)進(jìn)程至少有一個(gè)線程.
2) 線程的劃分尺度小于進(jìn)程菇存,使得多線程程序的并發(fā)性高。
3) 另外亥至,進(jìn)程在執(zhí)行過程中擁有獨(dú)立的內(nèi)存單元贱迟,而多個(gè)線程共享內(nèi)存,從而極大地提高了程序的運(yùn)行效率溶握。
4) 線程在執(zhí)行過程中與進(jìn)程還是有區(qū)別的蒸播。每個(gè)獨(dú)立的線程有一個(gè)程序運(yùn)行的入口、順序執(zhí)行序列和程序的出口胀屿。但是線程不能夠獨(dú)立執(zhí)行包雀,必須依存在應(yīng)用程序中,由應(yīng)用程序提供多個(gè)線程執(zhí)行控制葡兑。
5) 從邏輯角度來看赞草,多線程的意義在于一個(gè)應(yīng)用程序中,有多個(gè)執(zhí)行部分可以同時(shí)執(zhí)行洲守。但操作系統(tǒng)并沒有將多個(gè)線程看做多個(gè)獨(dú)立的應(yīng)用沾凄,來實(shí)現(xiàn)進(jìn)程的調(diào)度和管理以及資源分配。這就是進(jìn)程和線程的重要區(qū)別叙谨。
知乎上的一篇?jiǎng)e開生面的解釋
作者:zhonyong
鏈接:https://www.zhihu.com/question/25532384/answer/81152571
來源:知乎
著作權(quán)歸作者所有保屯。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán)配椭,非商業(yè)轉(zhuǎn)載請注明出處。
不請自來股缸《匾觯看見上面幾位的回答我真的是醉了。說幾句我的理解迷守。首先來一句概括的總論:進(jìn)程和線程都是一個(gè)時(shí)間段的描述旺入,是CPU工作時(shí)間段的描述凯力。下面細(xì)說背景:CPU+RAM+各種資源(比如顯卡礼华,光驅(qū),鍵盤祈惶,GPS, 等等外設(shè))構(gòu)成我們的電腦扮匠,但是電腦的運(yùn)行,實(shí)際就是CPU和相關(guān)寄存器以及RAM之間的事情疹蛉。一個(gè)最最基礎(chǔ)的事實(shí):CPU太快帮非,太快,太快了筑舅,寄存器僅僅能夠追的上他的腳步陨舱,RAM和別的掛在各總線上的設(shè)備完全是望其項(xiàng)背。那當(dāng)多個(gè)任務(wù)要執(zhí)行的時(shí)候怎么辦呢误墓?輪流著來?或者誰優(yōu)先級高誰來益缎?不管怎么樣的策略莺奔,一句話就是在CPU看來就是輪流著來。一個(gè)必須知道的事實(shí):執(zhí)行一段程序代碼令哟,實(shí)現(xiàn)一個(gè)功能的過程介紹 屏富,當(dāng)?shù)玫紺PU的時(shí)候,相關(guān)的資源必須也已經(jīng)就位狠半,就是顯卡啊,GPS啊什么的必須就位甜滨,然后CPU開始執(zhí)行衣摩。這里除了CPU以外所有的就構(gòu)成了這個(gè)程序的執(zhí)行環(huán)境捂敌,也就是我們所定義的程序上下文。當(dāng)這個(gè)程序執(zhí)行完了泡嘴,或者分配給他的CPU執(zhí)行時(shí)間用完了逆济,那它就要被切換出去,等待下一次CPU的臨幸抛虫。在被切換出去的最后一步工作就是保存程序上下文简僧,因?yàn)檫@個(gè)是下次他被CPU臨幸的運(yùn)行環(huán)境,必須保存棉姐。串聯(lián)起來的事實(shí):前面講過在CPU看來所有的任務(wù)都是一個(gè)一個(gè)的輪流執(zhí)行的啦逆,具體的輪流方法就是:先加載程序A的上下文夏志,然后開始執(zhí)行A,保存程序A的上下文盲镶,調(diào)入下一個(gè)要執(zhí)行的程序B的程序上下文溉贿,然后開始執(zhí)行B,保存程序B的上下文。九杂。。甥捺。========= 重要的東西出現(xiàn)了========進(jìn)程和線程就是這樣的背景出來的镀层,兩個(gè)名詞不過是對應(yīng)的CPU時(shí)間段的描述,名詞就是這樣的功能吴侦。進(jìn)程就是包換上下文切換的程序執(zhí)行時(shí)間總和 = CPU加載上下文+CPU執(zhí)行+CPU保存上下文線程是什么呢坞古?進(jìn)程的顆粒度太大,每次都要有上下的調(diào)入织堂,保存奶陈,調(diào)出尿瞭。如果我們把進(jìn)程比喻為一個(gè)運(yùn)行在電腦上的軟件,那么一個(gè)軟件的執(zhí)行不可能是一條邏輯執(zhí)行的声搁,必定有多個(gè)分支和多個(gè)程序段疏旨,就好比要實(shí)現(xiàn)程序A,實(shí)際分成 a遏匆,b别厘,c等多個(gè)塊組合而成溯香。那么這里具體的執(zhí)行就可能變成:程序A得到CPU =》CPU加載上下文,開始執(zhí)行程序A的a小段啤呼,然后執(zhí)行A的b小段巷怜,然后再執(zhí)行A的c小段,最后CPU保存A的上下文绣张。這里a侥涵,b,c的執(zhí)行是共享了A的上下文独令,CPU在執(zhí)行的時(shí)候沒有進(jìn)行上下文切換的燃箭。這里的a舍败,b,c就是線程裙戏,也就是說線程是共享了進(jìn)程的上下文環(huán)境的更為細(xì)小的CPU時(shí)間段厕诡。到此全文結(jié)束灵嫌,再一個(gè)總結(jié):進(jìn)程和線程都是一個(gè)時(shí)間段的描述,是CPU工作時(shí)間段的描述寿羞,不過是顆粒大小不同。
擴(kuò)展閱讀:
一個(gè)形象直白的類比: 進(jìn)程與線程的一個(gè)簡單解釋 http://www.ruanyifeng.com/blog/2013/04/processes_and_threads.html#
外文引用:http://www.qnx.com/developers/docs/6.4.1/neutrino/getting_started/s1_procs.html