1.線程與進(jìn)程的定義
進(jìn)程:是執(zhí)行中一段程序,即一旦程序被載入到內(nèi)存中并準(zhǔn)備執(zhí)行弧圆,它就是一個(gè)進(jìn)程赋兵。進(jìn)程是表示資源分配的的基本概念,又是調(diào)度運(yùn)行的基本單位搔预,是系統(tǒng)中的并發(fā)執(zhí)行的單位霹期。
線程:線程是進(jìn)程的一個(gè)實(shí)體,也是CPU調(diào)度和分派的基本單位,它是比進(jìn)程更小的能獨(dú)立運(yùn)行的基本單位,有時(shí)又被稱為輕權(quán)進(jìn)程或輕量級(jí)進(jìn)程拯田。
拋開(kāi)各種技術(shù)細(xì)節(jié)历造,從應(yīng)用程序角度講:
1、在單核計(jì)算機(jī)里,有一個(gè)資源是無(wú)法被多個(gè)程序并行使用的:cpu吭产。
沒(méi)有操作系統(tǒng)的情況下侣监,一個(gè)程序一直獨(dú)占著全都cpu。如果要有兩個(gè)任務(wù)來(lái)共享同一個(gè)CPU臣淤,程序員就需要仔細(xì)地為程序安排好運(yùn)行計(jì)劃--某時(shí)刻cpu和由程序A來(lái)獨(dú)享橄霉,下一時(shí)刻cpu由程序B來(lái)獨(dú)享。
而這種安排計(jì)劃后來(lái)成為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)度器陶珠,沒(méi)有內(nèi)存管理組件的操作系統(tǒng)上挟裂,程序員需要手工為每個(gè)程序安排運(yùn)行的空間 -- 程序A使用物理地址0x00-0xff,程序B使用物理地址0x100-0x1ff,等等揍诽。
然而這樣做有個(gè)很大的問(wèn)題:每個(gè)程序都要協(xié)調(diào)商量好怎樣使用同一個(gè)內(nèi)存上的不同空間诀蓉,軟件系統(tǒng)和硬件系統(tǒng)千差萬(wàn)別,使這種定制的方案沒(méi)有可行性暑脆。
為了解決這個(gè)麻煩渠啤,計(jì)算機(jī)系統(tǒng)引入了“虛擬地址”的概念,從三方面入手來(lái)做:
1添吗、硬件上沥曹,CPU增加了一個(gè)專門的模塊叫MMU,負(fù)責(zé)轉(zhuǎn)換虛擬地址和物理地址碟联。
2妓美、操作系統(tǒng)上,操作系統(tǒng)增加了另一個(gè)核心組件:memory management鲤孵,即內(nèi)存管理模塊壶栋,它管理物理內(nèi)存、虛擬內(nèi)存相關(guān)的一系列事務(wù)普监。
3贵试、應(yīng)用程序上丧没,發(fā)明了一個(gè)叫做【進(jìn)程】的模型,(注意)每個(gè)進(jìn)程都用【完全一樣的】虛擬地址空間锡移,然而經(jīng)由操作系統(tǒng)和硬件MMU協(xié)作,映射到不同的物理地址空間上漆际。不同的【進(jìn)程】淆珊,都有各自獨(dú)立的物理內(nèi)存空間,不用一些特殊手段奸汇,是無(wú)法訪問(wèn)別的進(jìn)程的物理內(nèi)存的施符。
3、現(xiàn)在擂找,不同的應(yīng)用程序戳吝,可以不關(guān)心底層的物理內(nèi)存分配,也不關(guān)心CPU的協(xié)調(diào)共享了贯涎。然而還有一個(gè)問(wèn)題存在:有一些程序听哭,想要共享CPU,【并且還要共享同樣的物理內(nèi)存】塘雳,這時(shí)候陆盘,一個(gè)叫【線程】的模型就出現(xiàn)了,它們被包裹在進(jìn)程里面败明,在調(diào)度器的管理下共享CPu隘马,擁有同樣的虛擬地址空間,同時(shí)也共享同一個(gè)物理地址空間妻顶,然而酸员,它們無(wú)法越過(guò)包裹自己的進(jìn)程,去訪問(wèn)別一個(gè)進(jìn)程的物理地址空間讳嘱。
4幔嗦、進(jìn)程之間怎樣共享同一個(gè)物理地址空間呢?不同的系統(tǒng)方法各異沥潭,符合posix規(guī)范的操作系統(tǒng)都提供了一個(gè)接口崭添,叫mmap,可以把一個(gè)物理地址空間映射到不同的進(jìn)程中叛氨,由不同的進(jìn)程來(lái)共享呼渣。
2 進(jìn)程和線程的關(guān)系:
- 一個(gè)線程只能屬于一個(gè)進(jìn)程,而一個(gè)進(jìn)程可以有多個(gè)線程寞埠,但至少有一個(gè)線程屁置。
- 資源分配給進(jìn)程,同一進(jìn)程的所有線程共享該進(jìn)程的所有資源仁连。
- 處理機(jī)分給線程蓝角,即真正在處理機(jī)上運(yùn)行的是線程阱穗。
- 線程在執(zhí)行過(guò)程中,需要協(xié)作同步使鹅。不同進(jìn)程的線程間要利用消息通信的辦法實(shí)現(xiàn)同步揪阶。
3.線程與進(jìn)程的區(qū)別
- 進(jìn)程是資源的分配和調(diào)度的一個(gè)獨(dú)立單元,而線程是CPU調(diào)度的基本單元患朱。
- 同一個(gè)進(jìn)程中可以包括多個(gè)線程鲁僚,并且線程共享整個(gè)進(jìn)程的資源(寄存器、堆棧裁厅、上下文),一個(gè)進(jìn)行至少包括一個(gè)線程冰沙。
- 進(jìn)程的創(chuàng)建調(diào)用fork或者vfork,而線程的創(chuàng)建調(diào)用pthread_create执虹,進(jìn)程結(jié)束后它擁有的所有線程都將銷毀拓挥,而線程的結(jié)束不會(huì)影響同個(gè)進(jìn)程中的其他線程的結(jié)束
- 線程是輕量級(jí)的進(jìn)程,它的創(chuàng)建和銷毀所需要的時(shí)間比進(jìn)程小很多袋励,所有操作系統(tǒng)中的執(zhí)行功能都是創(chuàng)建線程去完成的侥啤。
- 線程中執(zhí)行時(shí)一般都要進(jìn)行同步和互斥,因?yàn)樗麄児蚕硗贿M(jìn)程的所有資源茬故。
- 線程有自己的私有屬性TCB愿棋,線程id,寄存器均牢、硬件上下文糠雨,而進(jìn)程也有自己的私有屬性進(jìn)程控制塊PCB,這些私有屬性是不被共享的徘跪,用來(lái)標(biāo)示一個(gè)進(jìn)程或一個(gè)線程的標(biāo)志甘邀。