線程和進(jìn)程

一、概述:

進(jìn)程就是一個(gè)程序運(yùn)行的時(shí)候被CPU抽象出來的糟港,一個(gè)程序運(yùn)行后被抽象為一個(gè)進(jìn)程攀操,但是線程是從一個(gè)進(jìn)程里面分割出來的,由于CPU處理進(jìn)程的時(shí)候是采用時(shí)間片輪轉(zhuǎn)的方式秸抚,所以要把一個(gè)大個(gè)進(jìn)程給分割成多個(gè)線程速和,例如:網(wǎng)際快車中文件分成100部分 10個(gè)線程 文件就被分成了10份來同時(shí)下載 1-10 占一個(gè)線程 11-20占一個(gè)線程,依次類推,線程越多,文件就被分的越多,同時(shí)下載 當(dāng)然速度也就越快。
進(jìn)程:程序的一次執(zhí)行剥汤,是具有一定獨(dú)立功能的程序關(guān)于某個(gè)數(shù)據(jù)集合上的一次運(yùn)行活動(dòng)颠放,進(jìn)程是系統(tǒng)進(jìn)行資源分配和調(diào)度的一個(gè)獨(dú)立單位。進(jìn)程是程序在計(jì)算機(jī)上的一次執(zhí)行活動(dòng)吭敢。當(dāng)你運(yùn)行一個(gè)程序碰凶,你就啟動(dòng)了一個(gè)進(jìn)程。顯然鹿驼,程序只是一組指令的有序集合痒留,它本身沒有任何運(yùn)行的含義,只是一個(gè)靜態(tài)實(shí)體蠢沿。而進(jìn)程則不同伸头,它是程序在某個(gè)數(shù)據(jù)集上的執(zhí)行,是一個(gè)動(dòng)態(tài)實(shí)體舷蟀。它因創(chuàng)建而產(chǎn)生恤磷,因調(diào)度而運(yùn)行,因等待資源或事件而被處于等待狀態(tài)野宜,因完成任務(wù)而被撤消扫步,反映了一個(gè)程序在一定的數(shù)據(jù)集上運(yùn)行的全部動(dòng)態(tài)過程。進(jìn)程是操作系統(tǒng)分配資源的單位匈子。在Windows下河胎,進(jìn)程又被細(xì)化為線程,也就是一個(gè)進(jìn)程下有多個(gè)能獨(dú)立運(yùn)行的更小的單位虎敦。線程(Thread)是進(jìn)程的一個(gè)實(shí)體游岳,是CPU調(diào)度和分派的基本單位。線程不能夠獨(dú)立執(zhí)行其徙,必須依存在應(yīng)用程序中胚迫,由應(yīng)用程序提供多個(gè)線程執(zhí)行控制。
線程: CPU的基本調(diào)度單位唾那,是一個(gè)實(shí)體访锻,是CPU調(diào)度和分派的基本單位,它是比進(jìn)程更小的能獨(dú)立運(yùn)行的基本單位。線程自己基本上不擁有系統(tǒng)資源期犬,只擁有一點(diǎn)在運(yùn)行中必不可少的資源(如程序計(jì)數(shù)器河哑,一組寄存器和棧),但是它可與同進(jìn)程中的其它線程共享數(shù)據(jù)龟虎,但擁有自己的椩致空間,擁有獨(dú)立的執(zhí)行序列遣总。
在串行程序基礎(chǔ)上引入了線程和進(jìn)程是為了提高程序的并發(fā)度,從而提高程序運(yùn)行效率和相應(yīng)時(shí)間轨功。

二旭斥、探究

  • 1、在單核計(jì)算機(jī)里古涧,有一個(gè)資源是無法被多個(gè)程序并行使用的:cpu垂券。
    沒有操作系統(tǒng)的情況下,一個(gè)程序一直獨(dú)占著全都cpu羡滑。
    如果要有兩個(gè)任務(wù)來共享同一個(gè)CPU菇爪,程序員就需要仔細(xì)地為程序安排好運(yùn)行計(jì)劃--某時(shí)刻cpu和由程序A來獨(dú)享,下一時(shí)刻cpu由程序B來獨(dú)享
    而這種安排計(jì)劃后來成為OS的核心組件柒昏,被單獨(dú)名命為“scheduler”凳宙,即“調(diào)度器”,它關(guān)心的只是怎樣把單個(gè)cpu的運(yùn)行拆分成一段一段的“運(yùn)行片”职祷,輪流分給不同的程序去使用氏涩,而在宏觀上,因?yàn)榉峙淝袚Q的速度極快有梆,就制造出多程序并行在一個(gè)cpu上的假象是尖。
  • 2、在單核計(jì)算機(jī)里泥耀,有一個(gè)資源可以被多個(gè)程序共用饺汹,然而會(huì)引出麻煩:內(nèi)存。
    在一個(gè)只有調(diào)度器痰催,沒有內(nèi)存管理組件的操作系統(tǒng)上兜辞,程序員需要手工為每個(gè)程序安排運(yùn)行的空間 -- 程序A使用物理地址0x00-0xff,程序B使用物理地址0x100-0x1ff,等等夸溶。
    然而這樣做有個(gè)很大的問題:每個(gè)程序都要協(xié)調(diào)商量好怎樣使用同一個(gè)內(nèi)存上的不同空間弦疮,軟件系統(tǒng)和硬件系統(tǒng)千差萬別,使這種定制的方案沒有可行性蜘醋。
    為了解決這個(gè)麻煩胁塞,計(jì)算機(jī)系統(tǒng)引入了“虛擬地址”的概念,從三方面入手來做:
  • 2.1、硬件上啸罢,CPU增加了一個(gè)專門的模塊叫MMU编检,負(fù)責(zé)轉(zhuǎn)換虛擬地址和物理地址。
  • 2.2扰才、操作系統(tǒng)上允懂,操作系統(tǒng)增加了另一個(gè)核心組件:memory management,即內(nèi)存管理模塊衩匣,它管理物理內(nèi)存蕾总、虛擬內(nèi)存相關(guān)的一系列事務(wù)。
  • 2.3琅捏、應(yīng)用程序上生百,發(fā)明了一個(gè)叫做【進(jìn)程】的模型,(注意)每個(gè)進(jìn)程都用【完全一樣的】虛擬地址空間柄延,然而經(jīng)由操作系統(tǒng)和硬件MMU協(xié)作蚀浆,映射到不同的物理地址空間上。不同的【進(jìn)程】搜吧,都有各自獨(dú)立的物理內(nèi)存空間市俊,不用一些特殊手段,是無法訪問別的進(jìn)程的物理內(nèi)存的滤奈。
  • 3摆昧、現(xiàn)在,不同的應(yīng)用程序蜒程,可以不關(guān)心底層的物理內(nèi)存分配据忘,也不關(guān)心CPU的協(xié)調(diào)共享了。然而還有一個(gè)問題存在:有一些程序搞糕,想要共享CPU勇吊,【并且還要共享同樣的物理內(nèi)存】,這時(shí)候窍仰,一個(gè)叫【線程】的模型就出現(xiàn)了汉规,它們被包裹在進(jìn)程里面,在調(diào)度器的管理下共享CPu驹吮,擁有同樣的虛擬地址空間碟狞,同時(shí)也共享同一個(gè)物理地址空間泌参,然而,它們無法越過包裹自己的進(jìn)程铣缠,去訪問別一個(gè)進(jìn)程的物理地址空間。
  • 4捡硅、進(jìn)程之間怎樣共享同一個(gè)物理地址空間呢牍蜂?不同的系統(tǒng)方法各異辐怕,符合posix規(guī)范的操作系統(tǒng)都提供了一個(gè)接口,叫mmap,可以把一個(gè)物理地址空間映射到不同的進(jìn)程中,由不同的進(jìn)程來共享。
  • 5暮的、PS:在有的操作系統(tǒng)里,進(jìn)程不是調(diào)度單位(即不能被調(diào)度器使用),線程是最基本的調(diào)度單位侠仇,調(diào)度器只調(diào)度線程犁享,不調(diào)度進(jìn)程桨吊,比如VxWorks敢茁。

三伸刃、線程和進(jìn)程的區(qū)別

線程和進(jìn)程的主要差別在于它們是不同的操作系統(tǒng)資源管理方式较雕。進(jìn)程擁有獨(dú)立的地址空間,一個(gè)進(jìn)程崩潰后,在保護(hù)模式下不會(huì)對(duì)其他進(jìn)程產(chǎn)生影響闰蛔,而線程只是一個(gè)進(jìn)程中的不同執(zhí)行路徑例诀。線程擁有自己的堆棧和局部變量裁着,但線程之間沒有單獨(dú)的地址空間繁涂,一個(gè)線程死掉就等于整個(gè)進(jìn)程死掉,所以多進(jìn)程的程序要比多線程的程序健壯二驰,但在進(jìn)程切換時(shí)扔罪,耗費(fèi)資源較大,效率要差一些桶雀。但在進(jìn)程切換時(shí)矿酵,耗費(fèi)資源比較大,效率要差一些矗积。但對(duì)于一些要求同時(shí)進(jìn)行并且又要共享某些變量的并發(fā)操作全肮,只能用線程,不能用進(jìn)程漠魏。

  • 簡(jiǎn)而言之倔矾,一個(gè)程序至少有一個(gè)進(jìn)程妄均,一個(gè)進(jìn)程至少有一個(gè)線程柱锹。
  • 線程的劃分尺度小于進(jìn)程,使得多線程程序的并發(fā)性高丰包。
  • 另外禁熏,進(jìn)程在執(zhí)行過程中擁有獨(dú)立的內(nèi)存單元,而多個(gè)線程共享內(nèi)存邑彪,從而極大地提高了程序的運(yùn)行效率瞧毙。
  • 線程在執(zhí)行過程中與進(jìn)程還是有區(qū)別的。每個(gè)獨(dú)立的線程有一個(gè)程序運(yùn)行的入口寄症、順序執(zhí)行序列和程序的出口宙彪。但是線程不能夠獨(dú)立執(zhí)行,必須依存在應(yīng)用程序中有巧,由應(yīng)用程序提供多個(gè)線程執(zhí)行控制释漆。
  • 從邏輯角度來看,多線程的意義在于一個(gè)應(yīng)用程序中篮迎,有多個(gè)執(zhí)行部分可以同時(shí)執(zhí)行男图。但操作系統(tǒng)并沒有將多個(gè)線程看做獨(dú)立的應(yīng)用示姿,來實(shí)現(xiàn)進(jìn)程的調(diào)度和管理以及資源分配。

四逊笆、線程和進(jìn)程的關(guān)系

線程是屬于進(jìn)程的栈戳,線程運(yùn)行在進(jìn)程空間內(nèi),同一進(jìn)程所產(chǎn)生的線程共享同一內(nèi)存空間难裆,當(dāng)進(jìn)程退出時(shí)該進(jìn)程所產(chǎn)生的線程都會(huì)被強(qiáng)制退出并清除子檀。線程可與屬于同一進(jìn)程的其它線程共享進(jìn)程所擁有的全部資源,但是其本身基本上不擁有系統(tǒng)資源差牛,只擁有一點(diǎn)在運(yùn)行中必不可少的信息(如程序計(jì)數(shù)器命锄、一組寄存器和棧)。
在同一個(gè)時(shí)間里偏化,同一個(gè)計(jì)算機(jī)系統(tǒng)中如果允許兩個(gè)或兩個(gè)以上的進(jìn)程處于運(yùn)行狀態(tài)脐恩,這便是多任務(wù)。現(xiàn)代的操作系統(tǒng)幾乎都是多任務(wù)操作系統(tǒng)侦讨,能夠同時(shí)管理多個(gè)進(jìn)程的運(yùn)行驶冒。 多任務(wù)帶來的好處是明顯的,比如你可以邊聽mp3邊上網(wǎng)韵卤,與此同時(shí)甚至可以將下載的文檔打印出來骗污,而這些任務(wù)之間絲毫不會(huì)相互干擾。那么這里就涉及到并行的問題沈条,俗話說需忿,一心不能二用,這對(duì)計(jì)算機(jī)也一樣蜡歹,原則上一個(gè)CPU只能分配給一個(gè)進(jìn)程屋厘,以便運(yùn)行這個(gè)進(jìn)程。我們通常使用的計(jì)算機(jī)中只有一個(gè)CPU月而,也就是說只有一顆心汗洒,要讓它一心多用,同時(shí)運(yùn)行多個(gè)進(jìn)程父款,就必須使用并發(fā)技術(shù)溢谤。實(shí)現(xiàn)并發(fā)技術(shù)相當(dāng)復(fù)雜,最容易理解的是“時(shí)間片輪轉(zhuǎn)進(jìn)程調(diào)度算法”憨攒,它的思想簡(jiǎn)單介紹如下:在操作系統(tǒng)的管理下世杀,所有正在運(yùn)行的進(jìn)程輪流使用CPU,每個(gè)進(jìn)程允許占用CPU的時(shí)間非常短(比如10毫秒)肝集,這樣用戶根本感覺不出來CPU是在輪流為多個(gè)進(jìn)程服務(wù)瞻坝,就好象所有的進(jìn)程都在不間斷地運(yùn)行一樣。但實(shí)際上在任何一個(gè)時(shí)間內(nèi)有且僅有一個(gè)進(jìn)程占有CPU包晰。
如果一臺(tái)計(jì)算機(jī)有多個(gè)CPU湿镀,情況就不同了炕吸,如果進(jìn)程數(shù)小于CPU數(shù),則不同的進(jìn)程可以分配給不同的CPU來運(yùn)行勉痴,這樣赫模,多個(gè)進(jìn)程就是真正同時(shí)運(yùn)行的,這便是并行蒸矛。但如果進(jìn)程數(shù)大于CPU數(shù)瀑罗,則仍然需要使用并發(fā)技術(shù)。
在Windows中雏掠,進(jìn)行CPU分配是以線程為單位的斩祭,一個(gè)進(jìn)程可能由多個(gè)線程組成,這時(shí)情況更加復(fù)雜乡话,但簡(jiǎn)單地說摧玫,有如下關(guān)系:
總線程數(shù)<= CPU數(shù)量:并行運(yùn)行
總線程數(shù)> CPU數(shù)量:并發(fā)運(yùn)行
并行運(yùn)行的效率顯然高于并發(fā)運(yùn)行,所以在多CPU的計(jì)算機(jī)中绑青,多任務(wù)的效率比較高诬像。但是,如果在多CPU計(jì)算機(jī)中只運(yùn)行一個(gè)進(jìn)程(線程)闸婴,就不能發(fā)揮多CPU的優(yōu)勢(shì)坏挠。
多任務(wù)操作系統(tǒng)(如Windows)的基本原理是:操作系統(tǒng)將CPU的時(shí)間片分配給多個(gè)線程,每個(gè)線程在操作系統(tǒng)指定的時(shí)間片內(nèi)完成(注意,這里的多個(gè)線程是分屬于不同進(jìn)程的).操作系統(tǒng)不斷的從一個(gè)線程的執(zhí)行切換到另一個(gè)線程的執(zhí)行,如此往復(fù),宏觀上看來,就好像是多個(gè)線程在一起執(zhí)行.由于這多個(gè)線程分屬于不同的進(jìn)程,因此在我們看來,就好像是多個(gè)進(jìn)程在同時(shí)執(zhí)行,這樣就實(shí)現(xiàn)了多任務(wù).

四、優(yōu)缺點(diǎn)

線程和進(jìn)程在使用上各有優(yōu)缺點(diǎn):線程執(zhí)行開銷小邪乍,但不利于資源的管理和保護(hù)降狠;而進(jìn)程正相反。同時(shí)庇楞,線程適合于在SMP機(jī)器上運(yùn)行榜配,而進(jìn)程則可以跨機(jī)器遷移。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末姐刁,一起剝皮案震驚了整個(gè)濱河市芥牌,隨后出現(xiàn)的幾起案子烦味,更是在濱河造成了極大的恐慌聂使,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,470評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件谬俄,死亡現(xiàn)場(chǎng)離奇詭異柏靶,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)溃论,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門屎蜓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人钥勋,你說我怎么就攤上這事炬转×咎Γ” “怎么了?”我有些...
    開封第一講書人閱讀 162,577評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵扼劈,是天一觀的道長(zhǎng)驻啤。 經(jīng)常有香客問我,道長(zhǎng)荐吵,這世上最難降的妖魔是什么骑冗? 我笑而不...
    開封第一講書人閱讀 58,176評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮先煎,結(jié)果婚禮上贼涩,老公的妹妹穿的比我還像新娘。我一直安慰自己薯蝎,他們只是感情好遥倦,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,189評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著占锯,像睡著了一般谊迄。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上烟央,一...
    開封第一講書人閱讀 51,155評(píng)論 1 299
  • 那天统诺,我揣著相機(jī)與錄音,去河邊找鬼疑俭。 笑死粮呢,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的钞艇。 我是一名探鬼主播啄寡,決...
    沈念sama閱讀 40,041評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼哩照!你這毒婦竟也來了挺物?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,903評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤飘弧,失蹤者是張志新(化名)和其女友劉穎识藤,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體次伶,經(jīng)...
    沈念sama閱讀 45,319評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡痴昧,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,539評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了冠王。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片赶撰。...
    茶點(diǎn)故事閱讀 39,703評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出豪娜,到底是詐尸還是另有隱情餐胀,我是刑警寧澤,帶...
    沈念sama閱讀 35,417評(píng)論 5 343
  • 正文 年R本政府宣布瘤载,位于F島的核電站骂澄,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏惕虑。R本人自食惡果不足惜坟冲,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,013評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望溃蔫。 院中可真熱鬧健提,春花似錦、人聲如沸伟叛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)统刮。三九已至紊遵,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間侥蒙,已是汗流浹背暗膜。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留鞭衩,地道東北人学搜。 一個(gè)月前我還...
    沈念sama閱讀 47,711評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像论衍,于是被迫代替她去往敵國(guó)和親瑞佩。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,601評(píng)論 2 353

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

  • 一坯台、進(jìn)程和線程 進(jìn)程 進(jìn)程就是一個(gè)執(zhí)行中的程序?qū)嵗嫱瑁總€(gè)進(jìn)程都有自己獨(dú)立的一塊內(nèi)存空間,一個(gè)進(jìn)程中可以有多個(gè)線程蜒蕾。...
    阿敏其人閱讀 2,612評(píng)論 0 13
  • 又來到了一個(gè)老生常談的問題稠炬,應(yīng)用層軟件開發(fā)的程序員要不要了解和深入學(xué)習(xí)操作系統(tǒng)呢? 今天就這個(gè)問題開始滥搭,來談?wù)劜?..
    tangsl閱讀 4,122評(píng)論 0 23
  • 前言 拖了好久酸纲,不過還是得堅(jiān)持捣鲸。喜歡本文的話可以加下公眾號(hào)【于你供讀】瑟匆。 目錄 線程與進(jìn)程 線程與進(jìn)程是操作系統(tǒng)里...
    GitHubClub閱讀 831評(píng)論 0 4
  • 簡(jiǎn)而言之,一個(gè)程序至少有一個(gè)進(jìn)程,一個(gè)進(jìn)程至少有一個(gè)線程.線程的劃分尺度小于進(jìn)程,使得多線程程序的并發(fā)性高。另外愁溜,...
    Stago閱讀 343評(píng)論 0 2
  • 一次美麗的相遇 曹煜 晨露曉風(fēng)疾嗅,拂醒夢(mèng)中的我。一如既往地冕象,去南山湖公園晨跑代承。只是無意間在草叢...
    簡(jiǎn)約語文閱讀 464評(píng)論 1 7