進(jìn)程與線程

背景介紹

一直以來,自己對進(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)系可以使用下圖簡單的描述:

進(jìn)程與線程.png

程序并不能單獨(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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末辨泳,一起剝皮案震驚了整個(gè)濱河市菠红,隨后出現(xiàn)的幾起案子难菌,更是在濱河造成了極大的恐慌,老刑警劉巖耍共,帶你破解...
    沈念sama閱讀 211,639評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件试读,死亡現(xiàn)場離奇詭異,居然都是意外死亡比藻,警方通過查閱死者的電腦和手機(jī)倘屹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評論 3 385
  • 文/潘曉璐 我一進(jìn)店門纽匙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人馏段,你說我怎么就攤上這事践瓷≡未洌” “怎么了?”我有些...
    開封第一講書人閱讀 157,221評論 0 348
  • 文/不壞的土叔 我叫張陵硫麻,是天一觀的道長巫员。 經(jīng)常有香客問我,道長赶掖,這世上最難降的妖魔是什么七扰? 我笑而不...
    開封第一講書人閱讀 56,474評論 1 283
  • 正文 為了忘掉前任颈走,我火速辦了婚禮,結(jié)果婚禮上轧钓,老公的妹妹穿的比我還像新娘毕箍。我一直安慰自己,他們只是感情好文捶,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,570評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著媒咳,像睡著了一般粹排。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上涩澡,一...
    開封第一講書人閱讀 49,816評論 1 290
  • 那天顽耳,我揣著相機(jī)與錄音,去河邊找鬼妙同。 笑死斧抱,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的渐溶。 我是一名探鬼主播,決...
    沈念sama閱讀 38,957評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼弄抬,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了掂恕?” 一聲冷哼從身側(cè)響起拖陆,我...
    開封第一講書人閱讀 37,718評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎懊亡,沒想到半個(gè)月后依啰,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,176評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡店枣,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,511評論 2 327
  • 正文 我和宋清朗相戀三年速警,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鸯两。...
    茶點(diǎn)故事閱讀 38,646評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡闷旧,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出钧唐,到底是詐尸還是另有隱情忙灼,我是刑警寧澤,帶...
    沈念sama閱讀 34,322評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站该园,受9級特大地震影響酸舍,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜里初,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,934評論 3 313
  • 文/蒙蒙 一啃勉、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧青瀑,春花似錦璧亮、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至哑诊,卻和暖如春群扶,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背镀裤。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評論 1 266
  • 我被黑心中介騙來泰國打工竞阐, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人暑劝。 一個(gè)月前我還...
    沈念sama閱讀 46,358評論 2 360
  • 正文 我出身青樓骆莹,卻偏偏與公主長得像,于是被迫代替她去往敵國和親担猛。 傳聞我的和親對象是個(gè)殘疾皇子幕垦,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,514評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 11.1進(jìn)程的概念 進(jìn)程的定義 進(jìn)程是指一個(gè)具有一定獨(dú)立功能的程序在一個(gè)數(shù)據(jù)集合上的一次動(dòng)態(tài)執(zhí)行過程 精髓:正在執(zhí)...
    龜龜51閱讀 471評論 0 1
  • 并發(fā)與并行 一組在邏輯上互相獨(dú)立的程序或程序段在執(zhí)行過程中執(zhí)行時(shí)間在客觀時(shí)間上的重疊。并行執(zhí)行是指一組程序按獨(dú)立的...
    sHuXnHs閱讀 834評論 0 1
  • 處理器架構(gòu) 主要有兩種選擇:單個(gè)多核處理器和多個(gè)單核處理器傅联。 核心 處理器核心是CPU重要組成部分先改。處理器所有的計(jì)...
    獅_子歌歌閱讀 691評論 0 2
  • 復(fù)盤的好處? 復(fù)盤是為了把失敗轉(zhuǎn)換為財(cái)富蒸走,把成功轉(zhuǎn)化為能力仇奶。 為了知其然與知其所以然; 為了同樣的錯(cuò)誤不要再犯比驻; ...
    c清水閱讀 310評論 0 0
  • 姑娘A是一個(gè)天天喊著工資這么低怎么過日子的人该溯,從上班到現(xiàn)在,每逢搭班嫁艇,我都能聽見她在念叨朗伶,這么窮怎么辦啊步咪?工資這么...
    真愛521閱讀 248評論 0 0