1. 程式人生 > >多線程,多進程使用過程中的問題和解決方案

多線程,多進程使用過程中的問題和解決方案

共享 並發 之間 競爭 技術分享 參考 發生 pro 早期

次作,只是摘錄,組合而成,只能參考

多線程:

一個進程中可以有多條執行路徑同時執行,一個線程就是進程中的一條執行路徑。

在早期的操作系統中並沒有線程的概念,進程是能擁有資源和獨立運行的最小單位,也是程序執行的最小單位。它相當於一個進程裏只有一個線程,進程本身就是線程。所以線程有時被稱為輕量級進程(Lightweight Process,LWP)。後來,隨著計算機的發展,對多個任務之間上下文切換的效率要求越來越高,就抽象出一個更小的概念——線程,一般一個進程會有多個線程。

多線程原理:線程是分配CPU資源的最小單位,單CPU多線程是時間輪片的切換,多CPU可以真正的做到多CPU同時工作。

多線程編程為程序開發帶來了很多的方便,但是也帶來了一些問題,這些問題是在程序開發過程中必須進行處理的問題。

這些問題的核心是,如果多個線程同時訪問一個資源,例如變量、文件等,時如何保證訪問安全的問題。在多線程編程中,這種會被多個線程同時訪問的資源叫做臨界資源。

使用互斥解決多線程問題是一種簡單有效的解決辦法,但是由於該方法比較簡單,所以只能解決一些基本的問題,對於復雜的問題就無法解決了。

解 決多線程問題的另外一種思路是同步。同步是另外一種解決問題的思路,結合前面衛生間的示例,互斥方式解決多線程的原理是,當一個人進入到衛生間內部時,別 的人只

能在外部時刻等待,這樣就相當於別的人雖然沒有事情做,但是還是要占用別的人的時間,浪費系統的執行資源。而同步解決問題的原理是,如果一個人進入 到衛生間內部時,則別的人可以去睡覺,不占用系統資源,而當這個人從衛生間出來以後,把這個睡覺的人叫醒,則它就可以使用臨界資源了。所以使用同步的思路 解決多線程問題更加有效,更加節約系統的資源。

多進程:

同一個時間裏,同一個計算機系統中允許兩個或兩個以上的進程處於並行狀態,這是多進程。多進程帶來的好處是你可以邊聽mp3邊上網,與此同時甚至可以將下載的文檔打印出來,而這些任務之間絲毫不會相互幹擾。但並行需要解決的問題是通常並行的進程比CPU數量多得多,而原則上一個CPU只能分配給一個進程,以便運行這個進程。而要讓CPU同時運行多個進程,就必須使用並發技術,實現並發技術最常見的就是時間片輪轉調度算法,即在操作系統的管理下,所有正在運行的進程輪流使用CPU,每個進程允許占用CPU的時間非常短(比如1毫秒),這樣用戶根本感覺不出來 CPU是在輪流為多個進程服務,就好象所有的進程都在不間斷地運行一樣,給用戶的感覺就是並行。但實際上在任何一個時間內有且僅有一個進程占有CPU。

1、因為幹活時的需求要多個進程同時訪問某個文件並進行讀寫操作的需求因為文件並不是被同一個進程訪問,而且極大可能會發生多進程爭搶文件的情況,如果在同一個進程裏不同的線程訪問,或許還能使用線程鎖的方法控制,但是跨進程時就無法解決。網上解決方法基本上都像Linux裏日誌文件服務一樣,建立一個獨立的文件操作服務,由文件操作服務來控制不同進程對同一個文件的訪問。但是這樣改動量就比較大,不同的程序可能用的編寫的語言不同。

為了解決不同開發工具開發和效率帶來的問題。

每次讀寫文件前先改文件的擴展名,在程序訪問文件前,都必須用原文件名改名為包含簽出擴展名的新文件名(現實中會將文件擴展名改為.ck),其他進程只會訪問那些不是.ck為擴展名的文件。

方法:

第一、程序首先得到需要訪問的原文件名(比如Test.xml)

第二、使用原文件名作為基礎,改名為簽出文件名(比如Test.ck)

第三、因為同一時間只可能有一個進程能夠修改文件名,所以當一個進程搶先與另一個進程修改了文件,那另一個進程再次使用原文件名(Test.xml)將無法訪問到這個文件(因為文件名已經被修改為Test.ck)而報錯(可以屏蔽這個錯誤),如果修改成功則表示文件已經被你簽出。你可以繼續使用新的文件名對文件進行修改。其他進程如果使用原文件名將無法訪問這個文件。

第四、處理完數據後將文件擴展名改回原文件名(Test.xml)原理和寫數據庫時搶鎖類似,每次訪問文件前都必須首先改名(搶鎖),只有搶到鎖的進程才能進行後續操作。否則則等待其他進程釋放鎖。

2、操作系統中多進程並行時的死鎖問題,死鎖是多個進程循環等待它占有的資源而無限期的僵持下去的局面。計算機產死鎖的根本原因是資源有限切操作不當。操作系統進程產生的死鎖的原因為兩點:

1、競爭資源。當系統中提供多個進程共享的資源,不足以滿足他們的需求時,引起它們的競爭而產生死鎖。

2、進程推進順序非法。進程在運行的過程中,請求和釋放資源順序不當,導致了進程死鎖。

處理方法:

1、方法一

技術分享

2、方法二

技術分享

多線程,多進程使用過程中的問題和解決方案