專利名稱:一種多進程間的通信方法
技術領域:
本發(fā)明涉及計算機技術領域,特別是涉及一種多進程間的通信方法。
背景技術:
在Window的桌面應用程序開發(fā)中,經常會遇到進程間需要通信的問題。常見的多 進程間通信方法有共享內存方式、匿名管道、命名管道、WM_COPYDATA、SoCketS等。在上訴 方法中共享內存方法對于多個進程間通信支持最好,而且具有比較好的安全性。在以共享內存為基礎實現(xiàn)多進程間通信的方法中,一般使用客戶端/服務器 (Client/Server)架構。具體為在通信系統(tǒng)中有一個Server,由krver來控制共享內存 的生存周期。當有新進程加入到通信系統(tǒng)中來時,也是向義!^吐發(fā)起請求。當需要退出時 也需要告訴krver。當krver無效時,整個通信系統(tǒng)將無法使用??梢姮F(xiàn)有的以共享內存為基礎實現(xiàn)的多進程通信的方法的最大的缺點,就是在通 信中過于依賴krver,所有的應用程序都認為krver是可信的,但是當krver被關閉,或 者異常時通信就會問題。因此這種多進程間的通信系統(tǒng)仍不可靠。
發(fā)明內容
本發(fā)明提供了一種多進程間的通信方法,該方法能夠實現(xiàn)多進程間的可靠通信。為達到上述目的,本發(fā)明的技術方案是這樣實現(xiàn)的本發(fā)明公開了一種多進程間的通信方法,其特征在于,共享內存被劃分為數(shù)據(jù)區(qū) 和控制區(qū),其中控制區(qū)又被劃分為靜態(tài)區(qū)和動態(tài)區(qū),則任一當前進程加入多進程通信系統(tǒng) 的過程包括A、當前進程嘗試打開共享內存,如果能打開則執(zhí)行步驟E至步驟G,如果不能打開 則執(zhí)行步驟B至步驟D ;B、當前進程創(chuàng)建共享內存,在共享內存的靜態(tài)區(qū)寫入共享內存信息;其中共享內 存信息包括數(shù)據(jù)區(qū)的讀寫互斥、動態(tài)區(qū)的讀寫互斥和臨時服務進程權限互斥;C、當前進程根據(jù)臨時服務進程權限互斥獲得臨時服務進程權限; D、當前進程將自身的地址及互斥寫入動態(tài)區(qū),等待其他進程加入該多進程通信系 統(tǒng);E、當前進程訪問共享內存的靜態(tài)區(qū),獲得共享內存信息;F、當前進程根據(jù)動態(tài)區(qū)的讀寫互斥獲得動態(tài)區(qū)的訪問權限,從動態(tài)區(qū)獲取臨時服 務進程的地址以及臨時服務進程的互斥,然后釋放動態(tài)區(qū)的訪問權限;G、當前進程根據(jù)臨時服務進程的地址和互斥實現(xiàn)與服務進程的通信,進而加入該 多進程通信系統(tǒng)。所述步驟D進一步包括當前進程將自身的地址及互斥寫入動態(tài)區(qū)之前,根據(jù)動態(tài)區(qū)的讀寫互斥獲得動態(tài) 區(qū)的訪問權限;
當前進程將自身的地址及互斥寫入動態(tài)區(qū)之后,釋放對動態(tài)區(qū)的訪問權限。所述動態(tài)區(qū)用于保存臨時服務進程的地址和互斥,且只有臨時服務進程能改寫動 態(tài)區(qū)的信息。所述步驟G包括G1、當前進程向臨時服務進程請求加入該多進程通信系統(tǒng),臨時服務進程將當前 進程的地址以及互斥同步給該多進程通信系統(tǒng)中的其他進程;G2、當前進程向臨時服務進程請求該多進程通信系統(tǒng)中的其他進程的地址以及互 斥,臨時服務進程將所述其他進程的地址和互斥同步給當前進程;G3,開始多進程間的通信。當有進程退出所述多進程通信系統(tǒng)時,該方法進一步包括退出的進程釋放本進程的互斥;多進程通信系統(tǒng)中的其他進程檢測到有進程退出后,執(zhí)行以下步驟判斷退出的 進程是否為臨時服務進程,如果是則爭奪臨時服務進程權限;如果爭奪成功,則獲取動態(tài)區(qū) 的訪問權限,將自身的地址及互斥寫入動態(tài)區(qū),然后釋放對動態(tài)區(qū)的訪問權限。多進程通信系統(tǒng)中的其他進程檢測到有進程退出后,所執(zhí)行的步驟還包括當判斷出退出的進程不是臨時服務進程時,無操作;以及在爭奪臨時服務進程權限失敗時,無操作。在所述判斷退出的進程是否為臨時服務進程之前進一步包括刪除退出的進程在 本進程中的記錄。所述判斷退出的進程是否為臨時服務進程包括判斷退出的進程的互斥是否與動 態(tài)區(qū)中的臨時服務進程的互斥相同,如果相同,則退出進程是臨時服務進程。所述爭奪臨時服務進程權限包括獲取靜態(tài)區(qū)中的臨時服務進程權限互斥,如果 能夠根據(jù)所獲取的臨時服務進程權限互斥能夠獲得臨時服務進程權限,則爭奪成功。所述多進程通信系統(tǒng)中的其他進程檢測到有進程退出包括多進程通信系統(tǒng)中的 其他進程通過應用程序編程接口 API等待互斥的方式,檢測出有進程退出。由上述可見,本發(fā)明這種當任一當前進程要加入多進程通信系統(tǒng)時,首先嘗試打 開共享內存;如果不能打開則進程創(chuàng)建共享內存,在共享內存的靜態(tài)區(qū)寫入共享內存信息, 根據(jù)臨時服務進程權限互斥獲得臨時服務進程權限,將自身的地址及互斥寫入動態(tài)區(qū),等 待其他進程加入該多進程通信系統(tǒng);如果能打開則訪問共享內存的靜態(tài)區(qū),獲得共享內存 信息,根據(jù)動態(tài)區(qū)的讀寫互斥獲得動態(tài)區(qū)的訪問權限,從動態(tài)區(qū)獲取臨時服務進程的地址 以及臨時服務進程的互斥,然后釋放動態(tài)區(qū)的訪問權限,根據(jù)臨時服務進程的地址和互斥 實現(xiàn)與服務進程的通信,進而加入該多進程通信系統(tǒng)的技術方案,由于在通信的整個過程 中不是由固定的進程作為服務進程,取而代之的是臨時服務進程,因此整個通信系統(tǒng)不會 依賴某個固定的進程,多個進程之間的通信更加可靠。
圖1是本發(fā)明中的共享內存的劃分示意圖;圖2是本發(fā)明中的新進程加入多進程通信系統(tǒng)時的流程圖;圖3是本發(fā)明中的多進程通信系統(tǒng)中的進程檢測到有進程退出時所執(zhí)行的流程圖。
具體實施例方式本發(fā)明的整體思路為當有新進程加入時,能通過共享內存找到臨時服務進程 (即臨時義!^吐),臨時服務進程的地址寫入到共享內存中的一個區(qū)域,這個區(qū)域將不參加 數(shù)據(jù)通信。并通過臨時服務進程同步地址,使得每個進程都擁有其他進程的互斥,通過應用 程序編程接口(API,AppliCati0n Programming hterface)等待互斥將能檢測出有進程退 出,當有進程退出時其他進程都知道。當臨時服務進程退出,或者異常退出時,其他進程中 的一個馬上開始提供krver服務。為了使本發(fā)明的目的、技術方案和優(yōu)點更加清楚,下面結合附圖和具體實施例對 本發(fā)明進行詳細描述。圖1是本發(fā)明中的共享內存的劃分示意圖。如圖1所示,共享內存被分為兩部分 一部分為數(shù)據(jù)區(qū),一部分為控制區(qū);其中控制區(qū)又分為靜態(tài)區(qū)和動態(tài)區(qū)。靜態(tài)區(qū)用于保存共 享內存信息,包括數(shù)據(jù)區(qū)的讀寫互斥、動態(tài)區(qū)的讀寫互斥和臨時服務進程權限互斥,這些 信息是不能被改變的,共享內存被創(chuàng)建時被寫入,在以后的共享內存生存期里將不會再改 變。動態(tài)區(qū)是專門為解決無主控通信問題而設計的,這個區(qū)用于寫入臨時服務進程的地址 以及互斥信息,供給新加入本多進程通信系統(tǒng)的進程同步地址和互斥使用,這個區(qū)只有臨 時服務進程可以改寫。當有新進程加入到該多進程通信系統(tǒng)時,向臨時服務進程詢問該系 統(tǒng)中的進程的地址和互斥,通過就可以進行通信,通過互斥就可以知道有進程退出。數(shù)據(jù)區(qū) 用于保存通信過程中的數(shù)據(jù)。下面基于上述共享內存給出新進程加入多進程通信系統(tǒng)的流程以及進程退出多 進程通信系統(tǒng)時的執(zhí)行流程。圖2是本發(fā)明中的新進程加入多進程通信系統(tǒng)時的流程圖。如圖2所示,任一當 前進程加入多進程通信系統(tǒng)的過程包括如下步驟步驟201,當前進程嘗試打開共享內存,如果能打開,則表示已經有共享內存存在 并已經有臨時服務進程存在,執(zhí)行步驟207至214 ;如果不能打開,則說明多進程通信系統(tǒng) 還沒有建立,執(zhí)行步驟202至207。步驟202,當前進程創(chuàng)建共享內存,在共享內存的靜態(tài)區(qū)寫入共享內存信息;其中 共享內存信息包括數(shù)據(jù)區(qū)的讀寫互斥、動態(tài)區(qū)的讀寫互斥和臨時服務進程權限互斥。步驟203,當前進程根據(jù)動態(tài)區(qū)的讀寫互斥獲得動態(tài)區(qū)的訪問權限。步驟204,當前進程根據(jù)臨時服務進程權限互斥獲得臨時服務進程權限。步驟205,當前進程將自身的地址及互斥寫入動態(tài)區(qū)。本步驟中,當前進程成為臨時服務進程。步驟206,當前進程釋放對動態(tài)區(qū)的訪問權限。等待其他進程加入本多進程通信系 統(tǒng)。步驟207,當前進程訪問共享內存的靜態(tài)區(qū),獲得共享內存信息。步驟208,當前進程根據(jù)動態(tài)區(qū)的讀寫互斥獲得動態(tài)區(qū)的訪問權限。步驟209,當前進程從動態(tài)區(qū)獲取臨時服務進程的地址以及臨時服務進程的互斥。步驟210,當前進程釋放動態(tài)區(qū)的訪問權限。
6
步驟211,當前進程向臨時服務進程請求加入該多進程通信系統(tǒng)。步驟212,臨時服務進程將當前進程的地址以及互斥同步給該多進程通信系統(tǒng)中 的其他進程。步驟213,當前進程向臨時服務進程請求該多進程通信系統(tǒng)中的其他進程的地址 以及互斥。步驟214,臨時服務進程將所述其他進程的地址和互斥同步給當前進程。開始多進 程間的通信。當進程出動退出多進程通信系統(tǒng)時,需要釋放本進程的互斥。當進程異常退出通 信系統(tǒng)時,因為有之前就同步好的互斥,所以進程退出多進程通信系統(tǒng)時,其他進程可以檢 測到。因此當有進程退出多進程通信系統(tǒng)時,因為互斥關系,在多進程通信系統(tǒng)中的每個進 程都能知道有進程退出。具體地多進程通信系統(tǒng)中的進程通過應用程序編程接口 API等待 互斥的方式,檢測出有進程退出。多進程通信系統(tǒng)中的其他進程檢測到有進程退出后,執(zhí)行圖3所示的流程。圖3是本發(fā)明中的多進程通信系統(tǒng)中的進程檢測到有進程退出時所執(zhí)行的流程 圖。如圖3所示,包括以下步驟步驟301,刪除退出的進程在本進程中的記錄。步驟302,判斷退出的進程是否為臨時服務進程,是則執(zhí)行步驟303,否則無操作。本步驟中,判斷退出的進程的互斥是否與動態(tài)區(qū)中的臨時服務進程的互斥相同, 如果相同,則退出進程是臨時服務進程。步驟303,爭奪動態(tài)區(qū)的訪問權限,如果爭奪成功則作為新的臨時服務進程,執(zhí)行 步驟304至步驟306,如果爭奪失敗則執(zhí)行步驟307至步驟309。步驟304,根據(jù)臨時服務進程權限互斥獲得臨時服務進程權限。步驟305,將自身的地址及互斥寫入動態(tài)區(qū)。本步驟中,該進程用自身的地址及互斥更新動態(tài)區(qū)中的信息,成為新的臨時服務 進程。步驟306,釋放對動態(tài)區(qū)的訪問權限。等待其他進程加入本多進程通信系統(tǒng)。步驟307,等待獲取動態(tài)區(qū)的訪問權限。步驟308,待獲得動態(tài)區(qū)的訪問權限后,從動態(tài)區(qū)獲取新的臨時服務進程的地址以 及該新的臨時服務進程的互斥。步驟309,釋放動態(tài)區(qū)的訪問權限。繼續(xù)多進程間的通信。綜上所述,本發(fā)明給出的這種多進程間的通信方法中,在通信的整個過程中不存 在特定的服務進程,取而代之的是臨時服務進程,在這個系統(tǒng)中,任一參與通訊的進程都不 信任包括臨時服務進程在內的可靠性,一但有進程崩潰,其它進程會根據(jù)出現(xiàn)狀況調節(jié)共 享內存狀態(tài),甚至提升自己為臨時服務進程,因此有效提高了整個通信系統(tǒng)的穩(wěn)定性。以上所述僅為本發(fā)明的較佳實施例而已,并不用以限制本發(fā)明,凡在本發(fā)明的精 神和原則之內,所做的任何修改、等同替換、改進等,均應包含在本發(fā)明保護的范圍之內。
權利要求
1.一種多進程間的通信方法,其特征在于,共享內存被劃分為數(shù)據(jù)區(qū)和控制區(qū),其中控 制區(qū)又被劃分為靜態(tài)區(qū)和動態(tài)區(qū),則任一當前進程加入多進程通信系統(tǒng)的過程包括A、當前進程嘗試打開共享內存,如果能打開則執(zhí)行步驟E至步驟G,如果不能打開則執(zhí) 行步驟B至步驟D ;B、當前進程創(chuàng)建共享內存,在共享內存的靜態(tài)區(qū)寫入共享內存信息;其中共享內存信 息包括數(shù)據(jù)區(qū)的讀寫互斥、動態(tài)區(qū)的讀寫互斥和臨時服務進程權限互斥;C、當前進程根據(jù)臨時服務進程權限互斥獲得臨時服務進程權限;D、當前進程將自身的地址及互斥寫入動態(tài)區(qū),等待其他進程加入該多進程通信系統(tǒng);E、當前進程訪問共享內存的靜態(tài)區(qū),獲得共享內存信息;F、當前進程根據(jù)動態(tài)區(qū)的讀寫互斥獲得動態(tài)區(qū)的訪問權限,從動態(tài)區(qū)獲取臨時服務進 程的地址以及臨時服務進程的互斥,然后釋放動態(tài)區(qū)的訪問權限;G、當前進程根據(jù)臨時服務進程的地址和互斥實現(xiàn)與服務進程的通信,進而加入該多進 程通信系統(tǒng)。
2.根據(jù)權利要求1所述的方法,其特征在于,在步驟C之前該方法進一步包括當前進程根據(jù)動態(tài)區(qū)的讀寫互斥獲得動態(tài)區(qū)的訪問 權限;所述步驟D進一步包括當前進程將自身的地址及互斥寫入動態(tài)區(qū)之后,釋放對動態(tài) 區(qū)的訪問權限。
3.根據(jù)權利要求1所述的方法,其特征在于,所述動態(tài)區(qū)用于保存臨時服務進程的地 址和互斥,且只有臨時服務進程能改寫動態(tài)區(qū)的信息。
4.根據(jù)權利要求1所述的方法,其特征在于,所述步驟G包括G1、當前進程向臨時服務進程請求加入該多進程通信系統(tǒng),臨時服務進程將當前進程 的地址以及互斥同步給該多進程通信系統(tǒng)中的其他進程;G2、當前進程向臨時服務進程請求該多進程通信系統(tǒng)中的其他進程的地址以及互斥, 臨時服務進程將所述其他進程的地址和互斥同步給當前進程;G3,開始多進程間的通信。
5.根據(jù)權利要求1或4所述的方法,其特征在于,當有進程退出所述多進程通信系統(tǒng) 時,該方法進一步包括退出的進程釋放本進程的互斥;多進程通信系統(tǒng)中的其他進程檢測到有進程退出后,執(zhí)行以下步驟判斷退出的進程 是否為臨時服務進程,如果是則爭奪動態(tài)區(qū)的訪問權限;如果爭奪成功,則獲取臨時服務進 程權限,將自身的地址及互斥寫入動態(tài)區(qū),然后釋放對動態(tài)區(qū)的訪問權限。
6.根據(jù)權利要求5所述的方法,其特征在于,多進程通信系統(tǒng)中的其他進程檢測到有 進程退出后,所執(zhí)行的步驟還包括當判斷出退出的進程不是臨時服務進程時,無操作。
7.根據(jù)權利要求5所述的方法,其特征在于,多進程通信系統(tǒng)中的其他進程檢測到有 進程退出后,所執(zhí)行的步驟還包括在爭奪動態(tài)區(qū)的訪問權限失敗后,等待獲取動態(tài)區(qū)的訪問權限,待獲得動態(tài)區(qū)的訪問 權限后,從動態(tài)區(qū)獲取新的臨時服務進程的地址以及該新的臨時服務進程的互斥,然后釋放動態(tài)區(qū)的訪問權限。
8.根據(jù)權利要求5所述的方法,其特征在于,在所述判斷退出的進程是否為臨時服務 進程之前進一步包括刪除退出的進程在本進程中的記錄。
9.根據(jù)權利要求5所述的方法,其特征在于,所述判斷退出的進程是否為臨時服務進 程包括判斷退出的進程的互斥是否與動態(tài)區(qū)中的臨時服務進程的互斥相同,如果相同,則 退出進程是臨時服務進程。
10.根據(jù)權利要求5所述的方法,其特征在于,所述多進程通信系統(tǒng)中的其他進程檢測 到有進程退出包括多進程通信系統(tǒng)中的其他進程通過應用程序編程接口 API等待互斥的方式,檢測出有 進程退出。
全文摘要
本發(fā)明公開了一種多進程間的通信方法。該方法包括首先嘗試打開共享內存,如果不能打開則進程創(chuàng)建共享內存,在共享內存的靜態(tài)區(qū)寫入共享內存信息,根據(jù)臨時服務進程權限互斥獲得臨時服務進程權限,將自身的地址及互斥寫入動態(tài)區(qū),等待其他進程加入該多進程通信系統(tǒng),如果能打開則訪問共享內存的靜態(tài)區(qū),獲得共享內存信息,根據(jù)動態(tài)區(qū)的讀寫互斥獲得動態(tài)區(qū)的訪問權限,從動態(tài)區(qū)獲取臨時服務進程的地址以及臨時服務進程的互斥,然后釋放動態(tài)區(qū)的訪問權限,根據(jù)臨時服務進程的地址和互斥實現(xiàn)與服務進程的通信,進而加入該多進程通信系統(tǒng)。本發(fā)明的技術方案能夠實現(xiàn)多進程間的可靠通信。
文檔編號G06F21/22GK102147751SQ20111010496
公開日2011年8月10日 申請日期2011年4月26日 優(yōu)先權日2011年4月26日
發(fā)明者區(qū)智殷, 王瑞彪, 馬家智 申請人:北京新媒傳信科技有限公司