版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、<p> 淺談(windows)線程</p><p><b> 1,前言</b></p><p> 隨著微型計(jì)算機(jī)的越來越興盛,對進(jìn)程的資源掌控,已經(jīng)不再適用于微型計(jì)算機(jī)的資源分配模式,線程的出現(xiàn)也就成為了必然。所以說線程是為了提高操作系統(tǒng)的執(zhí)行效率而引入的,它是進(jìn)程的一段程序的基本調(diào)度單位。進(jìn)程具有動態(tài)性、并發(fā)性等特點(diǎn)。線程可以合理的分配進(jìn)程從CPU
2、占用的資源,并與其他線程共享。每個程序最少有一個進(jìn)程,每個進(jìn)程最少有一個線程。</p><p> 為了對線程進(jìn)行深一步的了解。我在這個實(shí)驗(yàn)報(bào)告中對線程做了一個淺顯的分析。除了對線程的一些基本概念,特點(diǎn),,線程同步,已經(jīng)多線程等等做了一個詳細(xì)的解釋。在研究線程的過程中肯定少不了進(jìn)程的存在。所以在最后對線程和進(jìn)行做了一個比對。更深層的了解一些有關(guān)的信息。</p><p><b>
3、 2,什么是線程?</b></p><p> 線程是進(jìn)程的一個實(shí)體,是CPU調(diào)度和分派的基本單位,它是比進(jìn)程更小的能獨(dú)立運(yùn)行的基本單位。線程自己基本上不擁有系統(tǒng)資源,只擁有一點(diǎn)在運(yùn)行中必不可少的資源(如程序計(jì)數(shù)器,一組寄存器和棧),但是它可與同屬一個進(jìn)程的其他的線程共享進(jìn)程所擁有的全部資源. 線程也可以稱為輕型進(jìn)程 (Light Weight Process,LWP)。</p><
4、;p> 它是一種非常"節(jié)儉"的多任務(wù)操作方式。在Linux系統(tǒng)下,啟動一個新的進(jìn)程必須分配給它獨(dú)立的地址空間,建立眾多的數(shù)據(jù)表來維護(hù)它的代碼段、堆棧段和數(shù)據(jù)段,這是一種"昂貴"的多任務(wù)工作方式。而運(yùn)行于一個進(jìn)程中的多個線程,它們彼此之間使用相同的地址空間,共享大部分?jǐn)?shù)據(jù),啟動一個線程所花費(fèi)的空間遠(yuǎn)遠(yuǎn)小于啟動一個進(jìn)程所花費(fèi)的空間,而且,線程間彼此切換所需的時(shí)間也遠(yuǎn)遠(yuǎn)小于進(jìn)程間切換所需要的時(shí)間
5、。當(dāng)然,在具體的系統(tǒng)上,這個數(shù)據(jù)可能會有較大的區(qū)別;</p><p> 每個正在系統(tǒng)上運(yùn)行的程序都是一個進(jìn)程。每個進(jìn)程包含一到多個線程。進(jìn)程也可能是整個程序或者是部分程序的動態(tài)執(zhí)行。線程是一組指令的集合,或者是程序的特殊段,它可以在程序里獨(dú)立執(zhí)行。也可以把它理解為代碼運(yùn)行的上下文。所以線程基本上是輕量級的進(jìn)程,它負(fù)責(zé)在單個程序里執(zhí)行多任務(wù)。通常由操作系統(tǒng)負(fù)責(zé)多個線程的調(diào)度和執(zhí)行。</p><
6、p> 2.1,什么是多線程?</p><p> 多線程是為了使得多個線程并行的工作以完成多項(xiàng)任務(wù),以提高系統(tǒng)的效率。線程是在同一時(shí)間需要完成多項(xiàng)任務(wù)的時(shí)候被實(shí)現(xiàn)的。</p><p><b> 3,線程的特點(diǎn)</b></p><p><b> 1)輕型實(shí)體</b></p><p> 線
7、程中的實(shí)體基本上不擁有系統(tǒng)資源,只是有一點(diǎn)必不可少的、能保證獨(dú)立運(yùn)行的資源,比如,在每個線程中都應(yīng)具有一個用于控制線程運(yùn)行的線程控制塊,用于指示被執(zhí)行指令序列的程序計(jì)數(shù)器、保留程序變量、少數(shù)狀態(tài)參數(shù)和返回地址等的一組寄存器和堆棧。</p><p> 2)獨(dú)立調(diào)度和分派的基本單位</p><p> 在多線程OS中,線程是能獨(dú)立運(yùn)行的基本單位,因而也是獨(dú)立調(diào)度和分派的基本單位。由于線程很“
8、輕”,故線程的切換非常迅速且開銷小(在同一進(jìn)程中的)。</p><p><b> 3)可并發(fā)執(zhí)行</b></p><p> 在一個進(jìn)程中的多個線程之間,可以并發(fā)執(zhí)行,甚至允許在一個進(jìn)程中所有線程都能并發(fā)執(zhí)行;同樣,不同進(jìn)程中的線程也能并發(fā)執(zhí)行,充分利用和發(fā)揮了處理機(jī)與外圍設(shè)備并行工作的能力。</p><p><b> 4)共享進(jìn)
9、程資源</b></p><p> 在同一進(jìn)程中的各個線程,都可以共享該進(jìn)程所擁有的資源,這首先表現(xiàn)在:所有線程都具有相同的地址空間(進(jìn)程的地址空間),這意味著,線程可以訪問該地址空間的每一個虛地址;此外,還可以訪問進(jìn)程所擁有的已打開文件、定時(shí)器、信號量機(jī)構(gòu)等。由于同一個進(jìn)程內(nèi)的線程共享內(nèi)存和文件,所以線程之間互相通信不必調(diào)用內(nèi)核。</p><p> 4,什么是線程同步?&l
10、t;/p><p> 同步就是協(xié)同步調(diào),按預(yù)定的先后次序進(jìn)行運(yùn)行。如:你說完,我再說“同”字從字面上容易理解為一起動作,其實(shí)不是,“同”字應(yīng)是指協(xié)同、協(xié)助、互相配合。如進(jìn)程、線程同步,可理解為進(jìn)程或線程A和B一塊配合,A執(zhí)行到一定程度時(shí)要依靠B的某個結(jié)果,于是停下來,示意B運(yùn)行;B依言執(zhí)行,再將結(jié)果給A;A再繼續(xù)操作。所謂同步,就是在發(fā)出一個功能調(diào)用時(shí),在沒有得到結(jié)果之前,該調(diào)用就不返回,同時(shí)其它線程也不能調(diào)用這個方
11、法。按照這個定義,其實(shí)絕大多數(shù)函數(shù)都是同步調(diào)用(例如sin, isdigit等)。但是一般而言,我們在說同步、異步的時(shí)候,特指那些需要其他部件協(xié)作或者需要一定時(shí)間完成的任務(wù)。例如Window API函數(shù)SendMessage。該函數(shù)發(fā)送一個消息給某個窗口,在對方處理完消息之前,這個函數(shù)不返回。當(dāng)對方處理完畢以后,該函數(shù)才把消息處理函數(shù)所返回的LRESULT值返回給調(diào)用者。在多線程編程里面,一些敏感數(shù)據(jù)不允許被多個線程同時(shí)訪問,此時(shí)就使用
12、同步訪問技術(shù),保證數(shù)據(jù)在任何時(shí)刻,最多有一個線程訪問,以保證數(shù)據(jù)的完整性。</p><p><b> 5,多線程同步方法</b></p><p> 現(xiàn)在流行的進(jìn)程線程同步互斥的控制機(jī)制,其實(shí)是由最原始最基本的4種方法實(shí)現(xiàn)的:</p><p> 1. 臨界區(qū):通過對多線程的串行化來訪問公共資源或一段代碼,速度快,適合控制數(shù)據(jù)訪問。</
13、p><p> 2. 互斥量:為協(xié)調(diào)一起對一個共享資源的單獨(dú)訪問而設(shè)計(jì)的</p><p> 3. 信號量:為控制一個具備有限數(shù)量用戶資源而設(shè)計(jì)。 . </p><p> 4. 事 件:用來通知線程有一些事件已發(fā)生,從而啟動后繼任務(wù)的開始。</p><p> 5,1 臨界區(qū)(Critical Section) </p><
14、p> 保證在某一時(shí)刻只有一個線程能訪問數(shù)據(jù)的簡便辦法。在任意時(shí)刻只允許一個線程對共享資源進(jìn)行訪問。如果有多個線程試圖同時(shí)訪問臨界區(qū),那么在有一個線程進(jìn)入后其他所有試圖訪問此臨界區(qū)的線程將被掛起,并一直持續(xù)到進(jìn)入臨界區(qū)的線程離開。臨界區(qū)在被釋放后,其他線程可以繼續(xù)搶占,并以此達(dá)到用原子方式操作共享資源的目的。</p><p> 臨界區(qū)包含兩個操作原語: EnterCriticalSection()進(jìn)入臨界
15、區(qū) LeaveCriticalSection()離開臨界區(qū) </p><p> 5,2 互斥量(Mutex) </p><p> 互斥量跟臨界區(qū)很相似,只有擁有互斥對象的線程才具有訪問資源的權(quán)限,由于互斥對象只有一個,因此就決定了任何情況下此共享資源都不會同時(shí)被多個線程所訪問。當(dāng)前占據(jù)資源的線程在任務(wù)處理完后應(yīng)將擁有的互斥對象交出,以便其他線程在獲得后得以訪問資源?;コ饬勘扰R界區(qū)
16、復(fù)雜。因?yàn)槭褂没コ獠粌H僅能夠在同一應(yīng)用程序不同線程中實(shí)現(xiàn)資源的安全共享,而且可以在不同應(yīng)用程序的線程之間實(shí)現(xiàn)對資源的安全共享。 </p><p> 互斥量包含的幾個操作原語:</p><p> CreateMutex()創(chuàng)建一個互斥量</p><p> OpenMutex()打開一個互斥量</p><p> ReleaseMutex
17、()釋放互斥量</p><p> WaitForMultipleObjects()等待互斥量對象 </p><p> 5.3 信號量(Semaphores) </p><p> 信號量對象對線程的同步方式與前面幾種方法不同,信號允許多個線程同時(shí)使用共享資源,這與操作系統(tǒng)中的PV操作相同。它指出了同時(shí)訪問共享資源的線程最大數(shù)目。它允許多個線程在同一時(shí)刻訪問同一
18、資源,但是需要限制在同一時(shí)刻訪問此資源的最大線程數(shù)目。在用CreateSemaphore()創(chuàng)建信號量時(shí)即要同時(shí)指出允許的最大資源計(jì)數(shù)和當(dāng)前可用資源計(jì)數(shù)。一般是將當(dāng)前可用資源計(jì)數(shù)設(shè)置為最大資源計(jì)數(shù),每增加一個線程對共享資源的訪問,當(dāng)前可用資源計(jì)數(shù)就會減1,只要當(dāng)前可用資源計(jì)數(shù)是大于0的,就可以發(fā)出信號量信號。但是當(dāng)前可用計(jì)數(shù)減小到0時(shí)則說明當(dāng)前占用資源的線程數(shù)已經(jīng)達(dá)到了所允許的最大數(shù)目,不能在允許其他線程的進(jìn)入,此時(shí)的信號量信號將無法發(fā)
19、出。線程在處理完共享資源后,應(yīng)在離開的同時(shí)通過ReleaseSemaphore()函數(shù)將當(dāng)前可用資源計(jì)數(shù)加1。在任何時(shí)候當(dāng)前可用資源計(jì)數(shù)決不可能大于最大資源計(jì)數(shù)。 </p><p> PV操作及信號量的概念都是由荷蘭科學(xué)家E.W.Dijkstra提出的。信號量S是一個整數(shù),S大于等于零時(shí)代表可供并發(fā)進(jìn)程使用的資源實(shí)體數(shù),但S小于零時(shí)則表示正在等待使用共享資源的進(jìn)程數(shù)。 </p><p>
20、<b> P操作申請資源:</b></p><p><b> ?。?)S減1;</b></p><p> (2)若S減1后仍大于等于零,則進(jìn)程繼續(xù)執(zhí)行;</p><p> ?。?)若S減1后小于零,則該進(jìn)程被阻塞后進(jìn)入與該信號相對應(yīng)的隊(duì)列中,然后轉(zhuǎn)入進(jìn)程調(diào)度。 </p><p><b&
21、gt; V操作 釋放資源:</b></p><p><b> ?。?)S加1;</b></p><p> ?。?)若相加結(jié)果大于零,則進(jìn)程繼續(xù)執(zhí)行;</p><p> ?。?)若相加結(jié)果小于等于零,則從該信號的等待隊(duì)列中喚醒一個等待進(jìn)程,然后再返回原進(jìn)程繼續(xù)執(zhí)行或轉(zhuǎn)入進(jìn)程調(diào)度。 </p><p> 信號
22、量包含的幾個操作原語:</p><p> CreateSemaphore()創(chuàng)建一個信號量</p><p> OpenSemaphore()打開一個信號量</p><p> ReleaseSemaphore()釋放信號量</p><p> WaitForSingleObject()等待信號量 </p><p>
23、 5.4 事件(Event) </p><p> 事件對象也可以通過通知操作的方式來保持線程的同步。并且可以實(shí)現(xiàn)不同進(jìn)程中的線程同步操作。 </p><p><b> 總結(jié): </b></p><p> 1. 互斥量與臨界區(qū)的作用非常相似,但互斥量是可以命名的,也就是說它可以跨越進(jìn)程使用。所以創(chuàng)建互斥量需要的資源更多,所以如果只為
24、了在進(jìn)程內(nèi)部是用的話使用臨界區(qū)會帶來速度上的優(yōu)勢并能夠減少資源占用量。因?yàn)榛コ饬渴强邕M(jìn)程的互斥量一旦被創(chuàng)建,就可以通過名字打開它。 </p><p> 2. 互斥量(Mutex),信號燈(Semaphore),事件(Event)都可以被跨越進(jìn)程使用來進(jìn)行同步數(shù)據(jù)操作,而其他的對象與數(shù)據(jù)同步操作無關(guān),但對于進(jìn)程和線程來講,如果進(jìn)程和線程在運(yùn)行狀態(tài)則為無信號狀態(tài),在退出后為有信號狀態(tài)。所以可以使用WaitForSi
25、ngleObject來等待進(jìn)程和線程退出。 </p><p> 3. 通過互斥量可以指定資源被獨(dú)占的方式使用,但如果有下面一種情況通過互斥量就無法處理,比如現(xiàn)在一位用戶購買了一份三個并發(fā)訪問許可的數(shù)據(jù)庫系統(tǒng),可以根據(jù)用戶購買的訪問許可數(shù)量來決定有多少個線程/進(jìn)程能同時(shí)進(jìn)行數(shù)據(jù)庫操作,這時(shí)候如果利用互斥量就沒有辦法完成這個要求,信號燈對象可以說是一種資源計(jì)數(shù)器。</p><p><b
26、> 6,線程的創(chuàng)建</b></p><p><b> 6.1 創(chuàng)建線程</b></p><p> 通過pthread_create()函數(shù)創(chuàng)建線程,API定義如下:</p><p> 與fork()調(diào)用創(chuàng)建一個進(jìn)程的方法不同,pthread_create()創(chuàng)建的線程并不具備與主線程(即調(diào)用pthread_create
27、()的線程)同樣的執(zhí)行序列,而是使其運(yùn)行start_routine(arg)函數(shù)。thread返回創(chuàng)建的線程ID,而attr是創(chuàng)建線程時(shí)設(shè)置的線程屬性(見下)。pthread_create()的返回值表示線程創(chuàng)建是否成功。盡管arg是void *類型的變量,但它同樣可以作為任意類型的參數(shù)傳給start_routine()函數(shù);同時(shí),start_routine()可以返回一個void *類型的返回值,而這個返回值也可以是其他類型,并由pt
28、hread_join()獲取。 </p><p> 6.2 線程創(chuàng)建屬性</p><p> pthread_create()中的attr參數(shù)是一個結(jié)構(gòu)指針,結(jié)構(gòu)中的元素分別對應(yīng)著新線程的運(yùn)行屬性,主要包括以下幾項(xiàng):</p><p> __detachstate,表示新線程是否與進(jìn)程中其他線程脫離同步,如果置位則新線程不能用pthread_join()來同步,且
29、在退出時(shí)自行釋放所占用的資源。缺省為PTHREAD_CREATE_JOINABLE狀態(tài)。這個屬性也可以在線程創(chuàng)建并運(yùn)行以后用pthread_detach()來設(shè)置,而一旦設(shè)置為PTHREAD_CREATE_DETACH狀態(tài)(不論是創(chuàng)建時(shí)設(shè)置還是運(yùn)行時(shí)設(shè)置)則不能再恢復(fù)到PTHREAD_CREATE_JOINABLE狀態(tài)。</p><p> __schedpolicy,表示新線程的調(diào)度策略,主要包括SCHED_O
30、THER(正常、非實(shí)時(shí))、SCHED_RR(實(shí)時(shí)、輪轉(zhuǎn)法)和SCHED_FIFO(實(shí)時(shí)、先入先出)三種,缺省為SCHED_OTHER,后兩種調(diào)度策略僅對超級用戶有效。運(yùn)行時(shí)可以用過pthread_setschedparam()來改變。</p><p> __schedparam,一個struct sched_param結(jié)構(gòu),目前僅有一個sched_priority整型變量表示線程的運(yùn)行優(yōu)先級。這個參數(shù)僅當(dāng)調(diào)度策
31、略為實(shí)時(shí)(即SCHED_RR或SCHED_FIFO)時(shí)才有效,并可以在運(yùn)行時(shí)通過pthread_setschedparam()函數(shù)來改變,缺省為0。</p><p> __inheritsched,有兩種值可供選擇:PTHREAD_EXPLICIT_SCHED和PTHREAD_INHERIT_SCHED,前者表示新線程使用顯式指定調(diào)度策略和調(diào)度參數(shù)(即attr中的值),而后者表示繼承調(diào)用者線程的值。缺省為PTH
32、READ_EXPLICIT_SCHED。</p><p> __scope,表示線程間競爭CPU的范圍,也就是說線程優(yōu)先級的有效范圍。POSIX的標(biāo)準(zhǔn)中定義了兩值:PTHREAD_SCOPE_SYSTEM和PTHREAD_SCOPE_PROCESS,前者表示與系統(tǒng)中所有線程一起競爭CPU時(shí)間,后者表示僅與同進(jìn)程中的線程競爭CPU。目前LinuxThreads僅實(shí)現(xiàn)了PTHREAD_SCOPE_SYSTEM一值。
33、</p><p> pthread_attr_t結(jié)構(gòu)中還有一些值,但不使用pthread_create()來設(shè)置。</p><p> 為了設(shè)置這些屬性,POSIX定義了一系列屬性設(shè)置函數(shù),包括pthread_attr_init()、pthread_attr_destroy()各個屬性相關(guān)的pthread_attr_get---/pthread_attr_set---函數(shù)。</p&
34、gt;<p><b> 7,線程取消</b></p><p> 7.1 線程取消的定義</p><p> 一般情況下,線程在其主體函數(shù)退出的時(shí)候會自動終止,但同時(shí)也可以因?yàn)榻邮盏搅硪粋€線程發(fā)來的終止(取消)請求而強(qiáng)制終止。</p><p> 7.2 線程取消的語義</p><p> 線程取消的方法
35、是向目標(biāo)線程發(fā)Cancel信號,但如何處理Cancel信號則由目標(biāo)線程自己決定,或者忽略、或者立即終止、或者繼續(xù)運(yùn)行至Cancelation-point(取消點(diǎn)),由不同的Cancelation狀態(tài)決定。</p><p> 線程接收到CANCEL信號的缺省處理(即pthread_create()創(chuàng)建線程的缺省狀態(tài))是繼續(xù)運(yùn)行至取消點(diǎn),也就是說設(shè)置一個CANCELED狀態(tài),線程繼續(xù)運(yùn)行,只有運(yùn)行至Cancelat
36、ion-point的時(shí)候才會退出。</p><p><b> 7.3 取消點(diǎn)</b></p><p> 根據(jù)POSIX標(biāo)準(zhǔn),pthread_join()、pthread_testcancel()、pthread_cond_wait()、pthread_cond_timedwait()、sem_wait()、sigwait()等函數(shù)以及read()、write()等
37、會引起阻塞的系統(tǒng)調(diào)用都是Cancelation-point,而其他pthread函數(shù)都不會引起Cancelation動作。但是pthread_cancel的手冊頁聲稱,由于LinuxThread庫與C庫結(jié)合得不好,因而目前C庫函數(shù)都不是Cancelation-point;但CANCEL信號會使線程從阻塞的系統(tǒng)調(diào)用中退出,并置EINTR錯誤碼,因此可以在需要作為Cancelation-point的系統(tǒng)調(diào)用前后調(diào)用pthread_testc
38、ancel(),從而達(dá)到POSIX標(biāo)準(zhǔn)所要求的目標(biāo),即如下代碼段:</p><p> pthread_testcancel();</p><p> retcode = read(fd, buffer, length);</p><p> pthread_testcancel();</p><p> 7.4 程序設(shè)計(jì)方面的考慮</
39、p><p> 如果線程處于無限循環(huán)中,且循環(huán)體內(nèi)沒有執(zhí)行至取消點(diǎn)的必然路徑,則線程無法由外部其他線程的取消請求而終止。因此在這樣的循環(huán)體的必經(jīng)路徑上應(yīng)該加入pthread_testcancel()調(diào)用。</p><p> 7.5與線程取消相關(guān)的pthread函數(shù)</p><p> int pthread_cancel(pthread_t thread) </
40、p><p> 發(fā)送終止信號給thread線程,如果成功則返回0,否則為非0值。發(fā)送成功并不意味著thread會終止。 </p><p> int pthread_setcancelstate(int state, int *oldstate) </p><p> 設(shè)置本線程對Cancel信號的反應(yīng),state有兩種值:PTHREAD_CANCEL_ENABLE(缺
41、?。┖蚉THREAD_CANCEL_DISABLE,分別表示收到信號后設(shè)為CANCLED狀態(tài)和忽略CANCEL信號繼續(xù)運(yùn)行;old_state如果不為NULL則存入原來的Cancel狀態(tài)以便恢復(fù)。 </p><p> int pthread_setcanceltype(int type, int *oldtype) </p><p> 設(shè)置本線程取消動作的執(zhí)行時(shí)機(jī),type由兩種取值:
42、PTHREAD_CANCEL_DEFFERED和PTHREAD_CANCEL_ASYCHRONOUS,僅當(dāng)Cancel狀態(tài)為Enable時(shí)有效,分別表示收到信號后繼續(xù)運(yùn)行至下一個取消點(diǎn)再退出和立即執(zhí)行取消動作(退出);oldtype如果不為NULL則存入運(yùn)來的取消動作類型值。 </p><p> void pthread_testcancel(void) </p><p> 檢查本線程
43、是否處于Canceld狀態(tài),如果是,則進(jìn)行取消動作,否則直接返回。</p><p><b> 8,線程的調(diào)度</b></p><p> 當(dāng)若干進(jìn)程都有多個線程時(shí),就存在兩個層次的并行:進(jìn)程和線程,在這樣的系統(tǒng)中調(diào)度處理有本質(zhì)差別,這取決于系統(tǒng)所支持的是用戶級線程還是內(nèi)核級線程</p><p><b> 用戶級線程</b&g
44、t;</p><p> 由于內(nèi)核并不知道線程的存在,所以內(nèi)核還是和以前一樣地操作,選取一個進(jìn)程A,并給與A以時(shí)間片控制,A中的線程調(diào)度程序決定線程的調(diào)度,由于多道線程并不存在時(shí)鐘中斷,所以這個線程可以運(yùn)行任意長時(shí)間,如果進(jìn)程運(yùn)行完了他的時(shí)間片,系統(tǒng)就會選擇另一個進(jìn)程執(zhí)行,當(dāng)內(nèi)核再次輪轉(zhuǎn)到該進(jìn)程執(zhí)行,原來的線程又會繼續(xù)執(zhí)行,而不會自動交由另一個線程運(yùn)行,除非該線程主動放棄CPU</p><p&
45、gt;<b> 內(nèi)核級線程</b></p><p> 內(nèi)核按照線程進(jìn)行調(diào)度,而不需要考慮這個線程屬于哪個進(jìn)程,對被選擇的線程賦予一定的時(shí)間片</p><p> 用戶線程和內(nèi)核線程的差別在于:</p><p> 性能,用戶級線程的切換需要少量的機(jī)器指令,而內(nèi)核線程的切換則需要完整的上下文切換,修改內(nèi)存映像,使告訴緩存失效,這導(dǎo)致了若干數(shù)量
46、級的延遲,但對于內(nèi)核線程,同進(jìn)程內(nèi)的線程切換要比不同進(jìn)程間的線程切換要高效</p><p> 對于用戶線程,如果一個線程阻塞在IO上,整個進(jìn)程都會進(jìn)入阻塞狀態(tài),而內(nèi)核級線程則不會這樣,用戶級線程可以使用專門為應(yīng)用程序定制的線程調(diào)度程序,運(yùn)行系統(tǒng)可以了解所有線程的作用,從而定制最合理的調(diào)度順序,而內(nèi)核對于內(nèi)核線程則缺乏這樣的了解,因此,應(yīng)用程序定制的用戶線程比內(nèi)核線程更好的滿足應(yīng)用的需要。</p>
47、<p> 9, 進(jìn)程與線程的區(qū)別</p><p> 9.1 區(qū)別的總體論述</p><p> 線程和進(jìn)程的區(qū)別在于,子進(jìn)程和父進(jìn)程有不同的代碼和數(shù)據(jù)空間,而多個線程則共享數(shù)據(jù)空間,每個線程有自己的執(zhí)行堆棧和程序計(jì)數(shù)器為其執(zhí)行上下文。多線程主要是為了節(jié)約CPU時(shí)間,發(fā)揮利用,根據(jù)具體情況而定。線程的運(yùn)行中需要使用計(jì)算機(jī)的內(nèi)存資源和CPU。</p><p&
48、gt; 通常在一個進(jìn)程中可以包含若干個線程,它們可以利用進(jìn)程所擁有的資源。在引入線程的操作系統(tǒng)中,通常都是把進(jìn)程作為分配資源的基本單位,而把線程作為獨(dú)立運(yùn)行和獨(dú)立調(diào)度的基本單位。由于線程比進(jìn)程更小,基本上不擁有系統(tǒng)資源,故對它的調(diào)度所付出的開銷就會小得多,能更高效的提高系統(tǒng)內(nèi)多個程序間并發(fā)執(zhí)行的程度,從而顯著提高系統(tǒng)資源的利用率和吞吐量。</p><p> 9.2 進(jìn)程與線程的區(qū)別和聯(lián)系</p>
49、<p> (1)劃分尺度:線程更小,所以多線程程序并發(fā)性更高;</p><p> (2)資源分配:進(jìn)程是資源分配的基本單位,同一進(jìn)程內(nèi)多個線程共享其資源;</p><p> (3)地址空間:進(jìn)程擁有獨(dú)立的地址空間,同一進(jìn)程內(nèi)多個線程共享其資源;</p><p> (4)處理器調(diào)度:線程是處理器調(diào)度的基本單位;</p><p&
50、gt; (5)執(zhí)行:每個線程都有一個程序運(yùn)行的入口,順序執(zhí)行序列和程序的出口,但線程不能單獨(dú)執(zhí)行,必須組成進(jìn)程,一個進(jìn)程至少有一個主線程。簡而言之,一個程序至少有一個進(jìn)程,一個進(jìn)程至少有一個線程。</p><p> 9.3 進(jìn)程與程序的區(qū)別和聯(lián)系</p><p> (1)程序只是一組指令的有序集合,它本身沒有任何運(yùn)行的含義,它只是一個靜態(tài)的實(shí)體。而進(jìn)程則不同,它是程序在某個數(shù)據(jù)集上的
51、執(zhí)行。進(jìn)程是一個動態(tài)的實(shí)體,它有自己的生命周期。反映了一個程序在一定的數(shù)據(jù)集上運(yùn)行的全部動態(tài)過程。</p><p> (2)進(jìn)程和程序并不是一一對應(yīng)的,一個程序執(zhí)行在不同的數(shù)據(jù)集上就成為不同的進(jìn)程,可以用進(jìn)程控制塊來唯一地標(biāo)識每個進(jìn)程。而這一點(diǎn)正是程序無法做到的,由于程序沒有和數(shù)據(jù)產(chǎn)生直接的聯(lián)系,既使是執(zhí)行不同的數(shù)據(jù)的程序,他們的指令的集合依然是一樣的,所以無法唯一地標(biāo)識出這些運(yùn)行于不同數(shù)據(jù)集上的程序。一般來說
52、,一個進(jìn)程肯定有一個與之對應(yīng)的程序,而且只有一個。而一個程序有可能沒有與之對應(yīng)的進(jìn)程(因?yàn)樗鼪]有執(zhí)行),也有可能有多個進(jìn)程與之對應(yīng)(運(yùn)行在幾個不同的數(shù)據(jù)集上)。</p><p> (3)進(jìn)程還具有并發(fā)性和交往性,這也與程序的封閉性不同。</p><p> 9.4 進(jìn)程與程序區(qū)別和聯(lián)系的表現(xiàn)</p><p> 1)程序只是一組指令的有序集合,它本身沒有任何運(yùn)行
53、的含義,它只是一個靜態(tài)的實(shí)體。而進(jìn)程則不同,它是程序在某個數(shù)據(jù)集上的執(zhí)行。</p><p> 進(jìn)程是一個動態(tài)的實(shí)體,它有自己的生命周期。它因創(chuàng)建而產(chǎn)生,因調(diào)度而運(yùn)行,因等待資源或事件而被處于等待狀態(tài),因完成任務(wù)而被撤消。反映了一個程序在一定的數(shù)據(jù)集上運(yùn)行的全部動態(tài)過程。</p><p> 2)進(jìn)程和程序并不是一一對應(yīng)的,一個程序執(zhí)行在不同的數(shù)據(jù)集上就成為不同的進(jìn)程,可以用進(jìn)程控制塊來唯
54、一地標(biāo)識每個進(jìn)程。而這一點(diǎn)正是程序無法做到的,由于程序沒有和數(shù)據(jù)產(chǎn)生直接的聯(lián)系,既使是執(zhí)行不同的數(shù)據(jù)的程序,他們的指令的集合依然是一樣的,所以無法唯一地標(biāo)識出這些運(yùn)行于不同數(shù)據(jù)集上的程序。一般來說,一個進(jìn)程肯定有一個與之對應(yīng)的程序,而且只有一個。而一個程序有可能沒有與之對應(yīng)的進(jìn)程(因?yàn)樗鼪]有執(zhí)行),也有可能有多個進(jìn)程與之對應(yīng)(運(yùn)行在幾個不同的數(shù)據(jù)集上)。</p><p> 3)進(jìn)程還具有并發(fā)性和交往性,這也與程
55、序的封閉性不同。進(jìn)程和線程都是由操作系統(tǒng)所體會的程序運(yùn)行的基本單元,系統(tǒng)利用該基本單元實(shí)現(xiàn)系統(tǒng)對應(yīng)用的并發(fā)性。進(jìn)程和線程的區(qū)別在于:</p><p> 簡而言之,一個程序至少有一個進(jìn)程,一個進(jìn)程至少有一個線程.</p><p> 線程的劃分尺度小于進(jìn)程,使得多線程程序的并發(fā)性高。</p><p> 另外,進(jìn)程在執(zhí)行過程中擁有獨(dú)立的內(nèi)存單元,而多個線程共享內(nèi)存,
56、從而極大地提高了程序的運(yùn)行效率。</p><p> 線程在執(zhí)行過程中與進(jìn)程還是有區(qū)別的。每個獨(dú)立的線程有一個程序運(yùn)行的入口、順序執(zhí)行序列和程序的出口。但是線程不能夠獨(dú)立執(zhí)行,必須依存在應(yīng)用程序中,由應(yīng)用程序提供多個線程執(zhí)行控制。</p><p> 從邏輯角度來看,多線程的意義在于一個應(yīng)用程序中,有多個執(zhí)行部分可以同時(shí)執(zhí)行。但操作系統(tǒng)并沒有將多個線程看做多個獨(dú)立的應(yīng)用,來實(shí)現(xiàn)進(jìn)程的調(diào)度和
57、管理以及資源分配。這就是進(jìn)程和線程的重要區(qū)別。</p><p> 進(jìn)程是具有一定獨(dú)立功能的程序關(guān)于某個數(shù)據(jù)集合上的一次運(yùn)行活動,進(jìn)程是系統(tǒng)進(jìn)行資源分配和調(diào)度的一個獨(dú)立單位.</p><p> 線程是進(jìn)程的一個實(shí)體,是CPU調(diào)度和分派的基本單位,它是比進(jìn)程更小的能獨(dú)立運(yùn)行的基本單位.線程自己基本上不擁有系統(tǒng)資源,只擁有一點(diǎn)在運(yùn)行中必不可少的資源(如程序計(jì)數(shù)器,一組寄存器和棧),但是它可與
58、同屬一個進(jìn)程的其他的線程共享進(jìn)程所擁有的全部資源.</p><p> 一個線程可以創(chuàng)建和撤銷另一個線程;同一個進(jìn)程中的多個線程之間可以并發(fā)執(zhí)行.</p><p> 線程與進(jìn)程的區(qū)別可以歸納為以下幾點(diǎn):</p><p> 1)地址空間和其它資源(如打開文件):進(jìn)程間相互獨(dú)立,同一進(jìn)程的各線程間共享。某進(jìn)程內(nèi)的線程在其它進(jìn)程不可見。</p><
59、p> 2)通信:進(jìn)程間通信IPC,線程間可以直接讀寫進(jìn)程數(shù)據(jù)段(如全局變量)來進(jìn)行通信——需要進(jìn)程同步和互斥手段的輔助,以保證數(shù)據(jù)的一致性。</p><p> 3)調(diào)度和切換:線程上下文切換比進(jìn)程上下文切換要快得多。</p><p> 4)在多線程OS中,進(jìn)程不是一個可執(zhí)行的實(shí)體。</p><p><b> 課程設(shè)計(jì)總結(jié):</b>
60、</p><p> 在做整個課程設(shè)計(jì)的過程中,讓我更加深層次的了解了線程。課程設(shè)計(jì)的研究中,我從自己的理解還有從各方面查詢到的資料,最后綜合的做出了這個課程設(shè)計(jì)。</p><p> 這次的課程設(shè)計(jì)讓我從全方位的了解了線程的存在,以及它在操作系統(tǒng)中扮演的重要角色。這次課程設(shè)計(jì)在總體上我還是比較滿意。雖然有些知識點(diǎn)沒有能綜合進(jìn)來,還有一些重要的知識點(diǎn)可能會出現(xiàn)的遺漏。但是我相信這會給我以后
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 操作系統(tǒng)課程設(shè)計(jì)--- 多線程管理與線程通信
- 操作系統(tǒng)課程設(shè)計(jì)——操作系統(tǒng)課程設(shè)計(jì)模擬操作系統(tǒng)
- 操作系統(tǒng)課程設(shè)計(jì)論文
- nachos線程通信和調(diào)度分析操作系統(tǒng)課程設(shè)計(jì)
- 操作系統(tǒng)課程設(shè)計(jì)-- 操作系統(tǒng)
- 操作系統(tǒng)課程設(shè)計(jì)
- 操作系統(tǒng)課程設(shè)計(jì)
- 操作系統(tǒng)課程設(shè)計(jì)
- 操作系統(tǒng)課程設(shè)計(jì)
- 操作系統(tǒng)課程設(shè)計(jì)
- 操作系統(tǒng)課程設(shè)計(jì)
- 操作系統(tǒng)課程設(shè)計(jì)報(bào)告-線程安全型雙向鏈表的實(shí)現(xiàn)
- 內(nèi)存管理(操作系統(tǒng))操作系統(tǒng)課程設(shè)計(jì)
- 操作系統(tǒng)課程設(shè)計(jì)題目
- 操作系統(tǒng)課程設(shè)計(jì)報(bào)告
- 操作系統(tǒng)課程設(shè)計(jì) (4)
- 操作系統(tǒng)課程設(shè)計(jì)1
- 課程設(shè)計(jì)報(bào)告--操作系統(tǒng)
- linux操作系統(tǒng)課程設(shè)計(jì)
- 操作系統(tǒng)課程設(shè)計(jì)報(bào)告
評論
0/150
提交評論