進程是表示資源分配的基本單位,又是調(diào)度運行的基本單位。例如,用戶運行自己的程序,系統(tǒng)就創(chuàng)建一個進程,并為它分配資源,包括各種表格、內(nèi)存空間、磁盤空間、I/O設備等。然后,把該進程放人進程的就緒隊列。進程調(diào)度程序選中它,為它分配CPU以及其它有關資源,該進程才真正運行。所以,進程是系統(tǒng)中的并發(fā)執(zhí)行的單位。
在Mac、Windows NT等采用微內(nèi)核結(jié)構(gòu)的操作系統(tǒng)中,進程的功能發(fā)生了變化:它只是資源分配的單位,而不再是調(diào)度運行的單位。在微內(nèi)核系統(tǒng)中,真正調(diào)度運行的基本單位是線程。因此,實現(xiàn)并發(fā)功能的單位是線程。
線程概念
線程是進程中執(zhí)行運算的最小單位,亦即執(zhí)行處理機調(diào)度的基本單位。如果把進程理解為在邏輯上操作系統(tǒng)所完成的任務,那么線程表示完成該任務的許多可能的子任務之一。例如,假設用戶啟動了一個窗口中的數(shù)據(jù)庫應用程序,操作系統(tǒng)就將對數(shù)據(jù)庫的調(diào)用表示為一個進程。假設用戶要從數(shù)據(jù)庫中產(chǎn)生一份工資單報表,并傳到一個文件中,這是一個子任務;在產(chǎn)生工資單報表的過程中,用戶又可以輸人數(shù)據(jù)庫查詢請求,這又是一個子任務。這樣,操作系統(tǒng)則把每一個請求――工資單報表和新輸人的數(shù)據(jù)查詢表示為數(shù)據(jù)庫進程中的獨立的線程。線程可以在處理器上獨立調(diào)度執(zhí)行,這樣,在多處理器環(huán)境下就允許幾個線程各自在單獨處理器上進行。操作系統(tǒng)提供線程就是為了方便而有效地實現(xiàn)這種并發(fā)性。
舉個例子來說多線程就像是火車上的每節(jié)車廂,而進程就是火車。
2.多進程和多線程的區(qū)別?我們從各個方面來看待這個問題,由下面的圖片說明:
1)管道
管道分為有名管道和無名管道
無名管道是一種半雙工的通信方式,數(shù)據(jù)只能單向流動,而且只能在具有親緣關系的進程間使用.進程的親緣關系一般指的是父子關系。無明管道一般用于兩個不同進程之間的通信。當一個進程創(chuàng)建了一個管道,并調(diào)用fork創(chuàng)建自己的一個子進程后,父進程關閉讀管道端,子進程關閉寫管道端,這樣提供了兩個進程之間數(shù)據(jù)流動的一種方式。
有名管道也是一種半雙工的通信方式,但是它允許無親緣關系進程間的通信。
無名管道:優(yōu)點:簡單方便;缺點:1)局限于單向通信2)只能創(chuàng)建在它的進程以及其有親緣關系的進程之間;3)緩沖區(qū)有限;
有名管道:優(yōu)點:可以實現(xiàn)任意關系的進程間的通信;缺點:1)長期存于系統(tǒng)中,使用不當容易出錯;2)緩沖區(qū)有限
2)信號量
信號量是一個計數(shù)器,可以用來控制多個線程對共享資源的訪問.,它不是用于交換大批數(shù)據(jù),而用于多線程之間的同步.它常作為一種鎖機制,防止某進程在訪問資源時其它進程也訪問該資源.因此,主要作為進程間以及同一個進程內(nèi)不同線程之間的同步手段.
優(yōu)點:可以同步進程;缺點:信號量有限
3)信號
信號是一種比較復雜的通信方式,用于通知接收進程某個事件已經(jīng)發(fā)生.
4)消息隊列
消息隊列是消息的鏈表,存放在內(nèi)核中并由消息隊列標識符標識.消息隊列克服了信號傳遞信息少,管道只能承載無格式字節(jié)流以及緩沖區(qū)大小受限等特點.消息隊列是UNIX下不同進程之間可實現(xiàn)共享資源的一種機制,UNIX允許不同進程將格式化的數(shù)據(jù)流以消息隊列形式發(fā)送給任意進程.對消息隊列具有操作權(quán)限的進程都可以使用msget完成對消息隊列的操作控制.通過使用消息類型,進程可以按任何順序讀信息,或為消息安排優(yōu)先級順序.
優(yōu)點:可以實現(xiàn)任意進程間的通信,并通過系統(tǒng)調(diào)用函數(shù)來實現(xiàn)消息發(fā)送和接收之間的同步,無需考慮同步問題,方便;缺點:信息的復制需要額外消耗CPU的時間,不適宜于信息量大或操作頻繁的場合
5)共享內(nèi)存
共享內(nèi)存就是映射一段能被其他進程所訪問的內(nèi)存,這段共享內(nèi)存由一個進程創(chuàng)建,但多個進程都可以訪問.共享內(nèi)存是最快的IPC(進程間通信)方式,它是針對其它進程間通信方式運行效率低而專門設計的.它往往與其他通信機制,如信號量,配合使用,來實現(xiàn)進程間的同步與通信.
優(yōu)點:無須復制,快捷,信息量大;
缺點:1)通信是通過將共無法實現(xiàn)享空間緩沖區(qū)直接附加到進程的虛擬地址空間中來實現(xiàn)的,因此進程間的讀寫操作的同步問題;2)利用內(nèi)存緩沖區(qū)直接交換信息,內(nèi)存的實體存在于計算機中,只能同一個計算機系統(tǒng)中的諸多進程共享,不方便網(wǎng)絡通信
6)套接字:可用于不同及其間的進程通信
優(yōu)點:1)傳輸數(shù)據(jù)為字節(jié)級,傳輸數(shù)據(jù)可自定義,數(shù)據(jù)量小效率高;2)傳輸數(shù)據(jù)時間短,性能高;3) 適合于客戶端和服務器端之間信息實時交互;4) 可以加密,數(shù)據(jù)安全性強
缺點:1) 需對傳輸?shù)臄?shù)據(jù)進行解析,轉(zhuǎn)化成應用級的數(shù)據(jù)。
# 鎖機制:包括互斥鎖、條件變量、讀寫鎖
*互斥鎖提供了以排他方式防止數(shù)據(jù)結(jié)構(gòu)被并發(fā)修改的方法。
*讀寫鎖允許多個線程同時讀共享數(shù)據(jù),而對寫操作是互斥的。
*條件變量可以以原子的方式阻塞進程,直到某個特定條件為真為止。對條件的測試是在互斥鎖的保護下進行的。條件變量始終與互斥鎖一起使用。
# 信號量機制(Semaphore):包括無名線程信號量和命名線程信號量
#信號機制(Signal):類似進程間的信號處理
線程間的通信目的主要是用于線程同步,所以線程沒有像進程通信中的用于數(shù)據(jù)交換的通信機制。
5.什么時候用多線程?什么時候用多進程?1)需要頻繁創(chuàng)建銷毀的優(yōu)先用線程
原因請看上面的對比。
這種原則最常見的應用就是Web服務器了,來一個連接建立一個線程,斷了就銷毀線程,要是用進程,創(chuàng)建和銷毀的代價是很難承受的
2)需要進行大量計算的優(yōu)先使用線程
所謂大量計算,當然就是要耗費很多CPU,切換頻繁了,這種情況下線程是最合適的。
這種原則最常見的是圖像處理、算法處理。
3)強相關的處理用線程,弱相關的處理用進程
什么叫強相關、弱相關?理論上很難定義,給個簡單的例子就明白了。
一般的Server需要完成如下任務:消息收發(fā)、消息處理?!跋⑹瞻l(fā)”和“消息處理”就是弱相關的任務,而“消息處理”里面可能又分為“消息解碼”、“業(yè)務處理”,這兩個任務相對來說相關性就要強多了。因此“消息收發(fā)”和“消息處理”可以分進程設計,“消息解碼”、“業(yè)務處理”可以分線程設計。
當然這種劃分方式不是一成不變的,也可以根據(jù)實際情況進行調(diào)整。
4)可能要擴展到多機分布的用進程,多核分布的用線程
原因請看上面對比。
5)都滿足需求的情況下,用你最熟悉、最拿手的方式
至于“數(shù)據(jù)共享、同步”、“編程、調(diào)試”、“可靠性”這幾個維度的所謂的“復雜、簡單”應該怎么取舍,我只能說:沒有明確的選擇方法。但我可以告訴你一個選擇原則:如果多進程和多線程都能夠滿足要求,那么選擇你最熟悉、最拿手的那個。
堅持學習,還要會高效的學習,單位時間內(nèi)你學到的東西越多越好。
現(xiàn)在那么多優(yōu)質(zhì)的視頻課程,學起來比看書快多了,找一些大牛出的課程,適當花點錢。再說了,花了錢會給自己點壓力,不學的話錢就浪費了,讓你更容易堅持下去。
不要在學習方面舍不得花錢,投資自己比投資其他東西更靠譜,再說普通人能接觸到的好的投資機會也不多,房子太貴,股市、P2P、加密數(shù)字貨幣,不送人頭當韭菜就不錯了。
以上不是說只有花錢才是高效學習的唯一途徑,你能找到其他高效的途徑,沒問題。
感興趣的朋友可以點擊下面的鏈接獲取高效學習的途徑!