? ? ? ? 為自己學(xué)習(xí)方便箫柳,復(fù)制大神的學(xué)習(xí)性文章放在自己簡(jiǎn)書里手形,僅作為自己學(xué)習(xí)方便使用,如果作者疑此行為侵權(quán)悯恍,請(qǐng)隨時(shí)聯(lián)系本人刪除库糠,如有共同學(xué)習(xí)者復(fù)制此文章,請(qǐng)注明原出處(文章來源:http://blog.chinaunix.net/uid-27411029-id-4131123.html)
進(jìn)程與線程的區(qū)別進(jìn)程的通信方式線程的通信方式2011-03-15 01:04
進(jìn)程與線程的區(qū)別:
通俗的解釋
一個(gè)系統(tǒng)運(yùn)行著很多進(jìn)程坪稽,可以比喻為一條馬路上有很多馬車
不同的進(jìn)程可以理解為不同的馬車
而同一輛馬車可以有很多匹馬來拉--這些馬就是線程
假設(shè)道路的寬度恰好可以通過一輛馬車
道路可以認(rèn)為是臨界資源
那么馬車成為分配資源的最小單位(進(jìn)程)
而同一個(gè)馬車被很多匹馬驅(qū)動(dòng)(線程)--即最小的運(yùn)行單位
每輛馬車馬匹數(shù)=1
所以馬匹數(shù)=1的時(shí)候進(jìn)程和線程沒有嚴(yán)格界限曼玩,只存在一個(gè)概念上的區(qū)分度
馬匹數(shù)1的時(shí)候才可以嚴(yán)格區(qū)分進(jìn)程和線程
專業(yè)的解釋:
簡(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è)線程看做多個(gè)獨(dú)立的應(yīng)用唠粥,來實(shí)現(xiàn)進(jìn)程的調(diào)度和管理以及資源分配。這就是進(jìn)程和線程的重要區(qū)別停做。
進(jìn)程是具有一定獨(dú)立功能的程序關(guān)于某個(gè)數(shù)據(jù)集合上的一次運(yùn)行活動(dòng),進(jìn)程是系統(tǒng)進(jìn)行資源分配和調(diào)度的一個(gè)獨(dú)立單位.
線程是進(jìn)程的一個(gè)實(shí)體,是CPU調(diào)度和分派的基本單位,它是比進(jìn)程更小的能獨(dú)立運(yùn)行的基本單位.線程自己基本上不擁有系統(tǒng)資源,只擁有一點(diǎn)在運(yùn)行中必不可少的資源(如程序計(jì)數(shù)器,一組寄存器和棧),但是它可與同屬一個(gè)進(jìn)程的其他的線程共享進(jìn)程所擁有的全部資源.
一個(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)程情屹。如果有興趣深入的話,我建議你們看看《現(xiàn)代操作系統(tǒng)》或者《操作系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)》杂腰。對(duì)就個(gè)問題說得比較清楚垃你。
+++
進(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)同步。
線程是指進(jìn)程內(nèi)的一個(gè)執(zhí)行單元,也是進(jìn)程內(nèi)的可調(diào)度實(shí)體.
與進(jìn)程的區(qū)別:
(1)調(diào)度:線程作為調(diào)度和分配的基本單位锭部,進(jìn)程作為擁有資源的基本單位
(2)并發(fā)性:不僅進(jìn)程之間可以并發(fā)執(zhí)行暂论,同一個(gè)進(jìn)程的多個(gè)線程之間也可并發(fā)執(zhí)行
(3)擁有資源:進(jìn)程是擁有資源的一個(gè)獨(dú)立單位,線程不擁有系統(tǒng)資源拌禾,但可以訪問隸屬于進(jìn)程的資源.
(4)系統(tǒng)開銷:在創(chuàng)建或撤消進(jìn)程時(shí)取胎,由于系統(tǒng)都要為之分配和回收資源,導(dǎo)致系統(tǒng)的開銷明顯大于創(chuàng)建或撤消線程時(shí)的開銷湃窍。+++
進(jìn)程間的通信方式:
1.管道(pipe)及有名管道(named pipe):
管道可用于具有親緣關(guān)系的父子進(jìn)程間的通信闻蛀,有名管道除了具有管道所具有的功能外,它還允許無親緣關(guān)系進(jìn)程間的通信坝咐。
2.信號(hào)(signal):
信號(hào)是在軟件層次上對(duì)中斷機(jī)制的一種模擬循榆,它是比較復(fù)雜的通信方式,用于通知進(jìn)程有某事件發(fā)生墨坚,一個(gè)進(jìn)程收到一個(gè)信號(hào)與處理器收到一個(gè)中斷請(qǐng)求效果上可以說是一致的秧饮。
3.消息隊(duì)列(message queue):
消息隊(duì)列是消息的鏈接表,它克服了上兩種通信方式中信號(hào)量有限的缺點(diǎn)泽篮,具有寫權(quán)限得進(jìn)程可以按照一定得規(guī)則向消息隊(duì)列中添加新信息盗尸;對(duì)消息隊(duì)列有讀權(quán)限得進(jìn)程則可以從消息隊(duì)列中讀取信息。
4.共享內(nèi)存(shared memory):
可以說這是最有用的進(jìn)程間通信方式帽撑。它使得多個(gè)進(jìn)程可以訪問同一塊內(nèi)存空間泼各,不同進(jìn)程可以及時(shí)看到對(duì)方進(jìn)程中對(duì)共享內(nèi)存中數(shù)據(jù)得更新。這種方式需要依靠某種同步操作亏拉,如互斥鎖和信號(hào)量等扣蜻。
5.信號(hào)量(semaphore):
主要作為進(jìn)程之間及同一種進(jìn)程的不同線程之間得同步和互斥手段逆巍。
6.套接字(socket);
這是一種更為一般得進(jìn)程間通信機(jī)制莽使,它可用于網(wǎng)絡(luò)中不同機(jī)器之間的進(jìn)程間通信锐极,應(yīng)用非常廣泛。
++
線程之間的同步通信:
1.信號(hào)量二進(jìn)制信號(hào)量互斥信號(hào)量整數(shù)型信號(hào)量記錄型信號(hào)量
2.消息消息隊(duì)列消息郵箱
3.事件event
互斥型信號(hào)量:必須是同一個(gè)任務(wù)申請(qǐng)芳肌,同一個(gè)任務(wù)釋放灵再,其他任務(wù)釋放無效。同一個(gè)任務(wù)可以遞歸申請(qǐng)亿笤。(互斥信號(hào)量是二進(jìn)制信號(hào)量的一個(gè)子集)
二進(jìn)制信號(hào)量:一個(gè)任務(wù)申請(qǐng)成功后翎迁,可以由另一個(gè)任務(wù)釋放。(與互斥信號(hào)量的區(qū)別)
整數(shù)型信號(hào)量:取值不局限于0和1,可以一個(gè)任務(wù)申請(qǐng)净薛,另一個(gè)任務(wù)釋放汪榔。(包含二進(jìn)制信號(hào)量,二進(jìn)制信號(hào)量是整數(shù)型信號(hào)量的子集)
二進(jìn)制信號(hào)量實(shí)現(xiàn)任務(wù)互斥:
打印機(jī)資源只有一個(gè)肃拜,a bc三個(gè)任務(wù)共享揍异,當(dāng)a取得使用權(quán)后,為了防止其他任務(wù)錯(cuò)誤地釋放了信號(hào)量(二進(jìn)制信號(hào)量允許其他任務(wù)釋放)爆班,必須將打印機(jī)房的門關(guān)起來(進(jìn)入臨界段),用完后辱姨,釋放信號(hào)量柿菩,再把門打開(出臨界段),其他任務(wù)再進(jìn)去打印雨涛。(而互斥型信號(hào)量由于必須由取得信號(hào)量的那個(gè)任務(wù)釋放枢舶,故不會(huì)出現(xiàn)其他任務(wù)錯(cuò)誤地釋放了信號(hào)量的情況出現(xiàn),故不需要有臨界段替久×剐梗互斥型信號(hào)量是二進(jìn)制信號(hào)量的子集。)
二進(jìn)制信號(hào)量實(shí)現(xiàn)任務(wù)同步:
a任務(wù)一直等待信號(hào)量蚯根,b任務(wù)定時(shí)釋放信號(hào)量后众,完成同步功能
記錄型信號(hào)量(record semaphore):
每個(gè)信號(hào)量s除一個(gè)整數(shù)值value(計(jì)數(shù))外,還有一個(gè)等待隊(duì)列List颅拦,其中是阻塞在該信號(hào)量的各個(gè)線程的標(biāo)識(shí)蒂誉。當(dāng)信號(hào)量被釋放一個(gè),值被加一后距帅,系統(tǒng)自動(dòng)從等待隊(duì)列中喚醒一個(gè)等待中的線程右锨,讓其獲得信號(hào)量,同時(shí)信號(hào)量再減一碌秸。
+++
同步和互斥的區(qū)別:
當(dāng)有多個(gè)線程的時(shí)候绍移,經(jīng)常需要去同步這些線程以訪問同一個(gè)數(shù)據(jù)或資源悄窃。例如,假設(shè)有一個(gè)程序蹂窖,其中一個(gè)線程用于把文件讀到內(nèi)存轧抗,而另一個(gè)線程用于統(tǒng)計(jì)文件中的字符數(shù)。當(dāng)然恼策,在把整個(gè)文件調(diào)入內(nèi)存之前,統(tǒng)計(jì)它的計(jì)數(shù)是沒有意義的涣楷。但是分唾,由于每個(gè)操作都有自己的線程,操作系統(tǒng)會(huì)把兩個(gè)線程當(dāng)作是互不相干的任務(wù)分別執(zhí)行狮斗,這樣就可能在沒有把整個(gè)文件裝入內(nèi)存時(shí)統(tǒng)計(jì)字?jǐn)?shù)绽乔。為解決此問題,你必須使兩個(gè)線程同步工作碳褒。
所謂互斥折砸,是指散布在不同進(jìn)程之間的若干程序片斷,當(dāng)某個(gè)進(jìn)程運(yùn)行其中一個(gè)程序片段時(shí)沙峻,其它進(jìn)程就不能運(yùn)行它們之中的任一程序片段睦授,只能等到該進(jìn)程運(yùn)行完這個(gè)程序片段后才可以運(yùn)行。如果用對(duì)資源的訪問來定義的話摔寨,互斥某一資源同時(shí)只允許一個(gè)訪問者對(duì)其進(jìn)行訪問去枷,具有唯一性和排它性。但互斥無法限制訪問者對(duì)資源的訪問順序是复,即訪問是無序的
所謂同步删顶,是指散步在不同進(jìn)程之間的若干程序片斷,它們的運(yùn)行必須嚴(yán)格按照規(guī)定的某種先后次序來運(yùn)行淑廊,這種先后次序依賴于要完成的特定的任務(wù)逗余。如果用對(duì)資源的訪問來定義的話,同步是指在互斥的基礎(chǔ)上(大多數(shù)情況)季惩,通過其它機(jī)制實(shí)現(xiàn)訪問者對(duì)資源的有序訪問录粱。在大多數(shù)情況下,同步已經(jīng)實(shí)現(xiàn)了互斥画拾,特別是所有寫入資源的情況必定是互斥的关摇。少數(shù)情況是指可以允許多個(gè)訪問者同時(shí)訪問資源