一、概述:
進(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ī)器遷移。