从 linux内核来看进程与线程的异同
?在《linux內(nèi)核設(shè)計(jì)與實(shí)現(xiàn)》中第三章講解了進(jìn)程管理,在關(guān)于進(jìn)程和線程的概念之間的區(qū)別還是由點(diǎn)模糊。書中說道:
??? 進(jìn)程就是處于執(zhí)行期的程序。但進(jìn)程并不僅僅局限于一段可執(zhí)行程序代碼。通常進(jìn)程還要包含其他資源,像打開的文件,掛起的信號(hào),內(nèi)核內(nèi)部數(shù)據(jù),持利器狀態(tài),一個(gè)或多個(gè)具有內(nèi)存映射的內(nèi)存地址空間以及一個(gè)或多個(gè)執(zhí)行線程,當(dāng)然還包括用來存放全局變量的數(shù)據(jù)段等。
??? 然而每一個(gè)線程都擁有一個(gè)獨(dú)立的程序計(jì)數(shù)器、進(jìn)程棧和一組進(jìn)程寄存器。下面一句話:內(nèi)核調(diào)度的對(duì)象是線程,而不是進(jìn)程。其實(shí)這句話的前提是一個(gè)進(jìn)程只包含一個(gè)線程。在當(dāng)前操作系統(tǒng)中,一個(gè)進(jìn)程都是包括多個(gè)線程的。
????任務(wù)(task) 是最抽象的,是一個(gè)一般性的術(shù)語,指由軟件完成的一個(gè)活動(dòng)。一個(gè)任務(wù)既可以是一個(gè)進(jìn)程,也可以是一個(gè)線程。簡而言之,它指的是一系列共同達(dá)到某一目的的操 作。例如,讀取數(shù)據(jù)并將數(shù)據(jù)放入內(nèi)存中。這個(gè)任務(wù)可以作為一個(gè)進(jìn)程來實(shí)現(xiàn),也可以作為一個(gè)線程(或作為一個(gè)中斷任務(wù))來實(shí)現(xiàn)。
進(jìn)程(process)常常被定義為程序的執(zhí)行。可以把一個(gè)進(jìn)程看成是一個(gè)獨(dú)立的程序,在內(nèi)存中有其完備的數(shù)據(jù)空間和代碼空間。一個(gè)進(jìn)程所擁有的數(shù)據(jù)和變量只屬于它自己。
線程(thread)則是某一進(jìn)程中一路單獨(dú)運(yùn)行的程序。也就是說,線程存在于進(jìn)程之中。一個(gè)進(jìn)程由一個(gè)或多個(gè)線程構(gòu)成,各線程共享相同的代碼和全局?jǐn)?shù)據(jù),但各有其自己的堆棧。由于堆棧是每個(gè)線程一個(gè),所以局部變量對(duì)每一線程來說是私有的。由于所有線程共享同樣的代碼和全局?jǐn)?shù)據(jù),它們比進(jìn)程更緊密,比單獨(dú)的進(jìn)程間更趨向于相互作用,線程間的相互作用更容易些,因?yàn)樗鼈儽旧砭陀心承┕┩ㄐ庞玫墓蚕韮?nèi)存:進(jìn)程的全局?jǐn)?shù)據(jù)。
一個(gè)進(jìn)程和一個(gè)線程最顯著的區(qū)別是:線程有自己的全局?jǐn)?shù)據(jù)。線程存在于進(jìn)程中,因此一個(gè)進(jìn)程的全局變量由所有的線程共享。由于線程共享同樣的系統(tǒng)區(qū)域,操作系統(tǒng)分配給一個(gè)進(jìn)程的資源對(duì)該進(jìn)程的所有線程都是可用的,正如全局?jǐn)?shù)據(jù)可供所有線程使用一樣。
簡而言之,一個(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è)線程看做多個(gè)獨(dú)立的應(yīng)用,來實(shí)現(xiàn)進(jìn)程的調(diào)度和管理以及資源分配,這就是進(jìn)程和線程的重要區(qū)別。
一個(gè)線程可以創(chuàng)建和撤銷另一個(gè)線程;同一個(gè)進(jìn)程中的多個(gè)線程之間可以并發(fā)執(zhí)行。
進(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)資源較大,效率要差一些。但對(duì)于一些要求同時(shí)進(jìn)行并且又要共享某些變量的并發(fā)操作,只能用線程,不能用進(jìn)程。
?
進(jìn)程概念?
進(jìn)程是表示資源分配的基本單位,又是調(diào)度運(yùn)行的基本單位。例如,用戶運(yùn)行自己的程序,系統(tǒng)就創(chuàng)建一個(gè)進(jìn)程,并為它分配資源,包括各種表格、內(nèi)存空間、磁盤 空間、I/O設(shè)備等。然后,把該進(jìn)程放人進(jìn)程的就緒隊(duì)列。進(jìn)程調(diào)度程序選中它,為它分配CPU以及其它有關(guān)資源,該進(jìn)程才真正運(yùn)行。所以,進(jìn)程是系統(tǒng)中的 并發(fā)執(zhí)行的單位。?
在Mac、Windows NT等采用微內(nèi)核結(jié)構(gòu)的操作系統(tǒng)中,進(jìn)程的功能發(fā)生了變化:它只是資源分配的單位,而不再是調(diào)度運(yùn)行的單位。在微內(nèi)核系統(tǒng)中,真正調(diào)度運(yùn)行的基本單位是線程。因此,實(shí)現(xiàn)并發(fā)功能的單位是線程。
線程概念?
線程是進(jìn)程中執(zhí)行運(yùn)算的最小單位,亦即執(zhí)行處理機(jī)調(diào)度的基本單位。如果把進(jìn)程理解為在邏輯上操作系統(tǒng)所完成的任務(wù),那么線程表示完成該任務(wù)的許多可能的子任務(wù)之一。例如,假設(shè)用戶啟動(dòng)了一個(gè)窗口中的數(shù)據(jù)庫應(yīng)用程序,操作系統(tǒng)就將對(duì)數(shù)據(jù)庫的調(diào)用表示為一個(gè)進(jìn)程。假設(shè)用戶要從數(shù)據(jù)庫中產(chǎn)生一份工資單報(bào)表,并傳到一個(gè)文件中,這是一個(gè)子任務(wù);在產(chǎn)生工資單報(bào)表的過程中,用戶又可以輸人數(shù)據(jù)庫查詢請(qǐng)求,這又是一個(gè)子任務(wù)。這樣,操作系統(tǒng)則把每一個(gè)請(qǐng)求――工資單報(bào)表和新輸人的數(shù)據(jù)查詢表示為數(shù)據(jù)庫進(jìn)程中的獨(dú)立的線程。
???? 線程可以在處理器上獨(dú)立調(diào)度執(zhí)行,這樣,在多處理器環(huán)境下就允許幾個(gè)線程各自在單獨(dú)處理器上進(jìn)行。操作系統(tǒng)提供線程就是為了方便而有效地實(shí)現(xiàn)這種并發(fā)性。
引入線程的好處
(1)易于調(diào)度。
(2)提高并發(fā)性。通過線程可方便有效地實(shí)現(xiàn)并發(fā)性。進(jìn)程可創(chuàng)建多個(gè)線程來執(zhí)行同一程序的不同部分。
(3)開銷少。創(chuàng)建線程比創(chuàng)建進(jìn)程要快,所需開銷很少。
(4)利于充分發(fā)揮多處理器的功能。通過創(chuàng)建多線程進(jìn)程(即一個(gè)進(jìn)程可具有兩個(gè)或更多個(gè)線程),每個(gè)線程在一個(gè)處理器上運(yùn)行,從而實(shí)現(xiàn)應(yīng)用程序的并發(fā)性,使每個(gè)處理器都得到充分運(yùn)行。?
進(jìn)程和線程的關(guān)系
(1)一個(gè)線程只能屬于一個(gè)進(jìn)程,而一個(gè)進(jìn)程可以有多個(gè)線程,但至少有一個(gè)線程。
(2)資源分配給進(jìn)程,同一進(jìn)程的所有線程共享該進(jìn)程的所有資源。
(3)處理機(jī)分給線程,即真正在處理機(jī)上運(yùn)行的是線程。
(4)線程在執(zhí)行過程中,需要協(xié)作同步。不同進(jìn)程的線程間要利用消息通信的辦法實(shí)現(xiàn)同步。
????但是對(duì)linux操作系統(tǒng)來說,調(diào)度解決的對(duì)象是線程而不是進(jìn)程,很大一部分原因在于linux認(rèn)為線程和進(jìn)程是一樣的。
關(guān)于進(jìn)程和線程的另外一個(gè)很恰當(dāng)?shù)慕忉?#xff1a;http://www.ruanyifeng.com/blog/2013/04/processes_and_threads.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的从 linux内核来看进程与线程的异同的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 复试分数线该怎么划定呢(洛谷P1068题
- 下一篇: linux 创建一个垃圾篓防误删及其误删