" />
所屬欄目:軟件開發論文 發布日期:2010-09-15 09:23 熱度:
摘要:分布式計算系統的應用越來越廣泛,它是由一組分布在網絡中不同節點上的進程彼此協作來完成任務的。這些進程通過通信中間件來完成同步、互斥以及數據傳送等操作,通信中間件是分布式系統實現的基礎。本文就通信中間件的實現所用到的各種技術進行了比較詳細的介紹,從而給讀者一些有用的參考和啟發。
關鍵字:守護進程;Posix線程;互斥鎖;讀寫鎖
1、守護進程
1.1什么是守護進程
守護進程(Daemon)是運行在后臺的特殊進程,它獨立于控制終端并且周期性地執行某種任務或等待處理某些發生的事件。守護進程是一種很有用的進程。[1]UNIX中的大多數服務器就是用守護進程實現的。比如,超級服務器inetd,Web服務器httpd等。同時,守護進程完成許多系統任務。比如,作業規劃進程crond,打印進程lpd等。守護進程的編程本身并不復雜,復雜的是各種版本的UNIX的實現機制不盡相同,造成不同UNIX環境下守護進程的編程規則并不一致。
1.2守護進程的特性
守護進程最重要的特性是后臺運行。在這一點上DOS下的常駐內存程序TSR與之相似。其次,守護進程必須與其運行前的環境隔離開來。這些環境包括未關閉的文件描述符,控制終端,會話和進程組,工作目錄以及文件創建掩模等。這些環境通常是守護進程從執行它的父進程中繼承下來的。最后,守護進程的啟動方式有其特殊之處。它可以在Linux系統啟動時從啟動腳本/etc/rcd中啟動,也可以由作業規劃進程crond啟動,還可以由用戶終端(通常是shell)執行。
2、POSIX線程
2.1POSIX線程的創建
1線程與進程
相對進程而言,線程是一個更加接近于執行體的概念,它可以與同進程中的其他線程共享數據,但擁有自己的�?臻g,擁有獨立的執行序列。在串行程序基礎上引入線程是為了提高程序的并發度,從而提高程序運行效率和響應時間。線程和進程在使用上各有優缺點:線程執行開銷小,但不利于資源的管理和保護;而進程正相反。同時,線程適合于在SMP機器上運行,而進程則可以跨機器遷移。[2]
2創建線程
POSIX通過pthread_create()函數創建線程,pthread_create()創建的線程并不具備與主線程(即調用pthread_create()的線程)同樣的執行序列,而是使其運行start_routine()函數。thread返回創建的線程ID,而attr是創建線程時設置的線程屬性。pthread_create()的返回值表示線程創建是否成功。盡管arg是void*類型的變量,但它同樣可以作為任意類型的參數傳給start_routine()函數;同時,start_routine()可以返回一個void*類型的返回值,而這個返回值也可以是其他類型,并由pthread_join()獲取。[3]
2.2線程的取消
1線程取消的定義
一般情況下,線程在其主體函數退出的時候會自動終止,但同時也可以因為接收到另一個線程發來的終止(取消)請求而被強制取消。線程的取消類似于線程的終止,但還是有概念上的不同,雖然取消的目的和結果是終止,但是取消往往是被動的。
2取消點
根據POSIX標準,pthread_join()、pthread_testcancel()、pthread_cond_wait()、pthread_cond_timedwait()、sem_wait()、sigwait()等函數以及read()、write()等會引起執行阻塞的系統調用都是Cancelation-point,而其他pthread函數都不會引起Cancelation動作。但是pthread_cancel的手冊頁聲稱,由于LinuxThread庫與C庫結合得不好,因而目前C庫函數都不是Cancelation-point;但CANCEL信號會使線程從阻塞的系統調用中退出,并置EINTR錯誤碼,因此可以在需要作為Cancelation-point的系統調用前后調用pthread_testcancel(),從而達到POSIX標準所要求的目標,即如下例子代碼段所示[4]
pthread_testcancel();
retcode=read(fd,buffer,length);
pthread_testcancel();
3程序設計方面的考慮
如果線程處于無限循環中,且循環體內沒有執行至取消點的必然路徑,則線程無法由外部其他線程的取消請求而終止。因此在這樣的循環體的必經路徑上應該加入pthread_testcancel()調用。
2.3線程的中止
一般來說,Posix的線程終止有兩種情況:正常終止和非正常終止。線程主動調用pthread_exit()或者從線程函數中return都將使線程正常退出,這是可預見的退出方式;非正常終止是線程在其他線程的干預下,或者由于自身運行出錯(比如訪問非法地址)而退出,這種退出方式是不可預見的。
3、互斥鎖
盡管在Posix線程中同樣可以使用IPC的信號量機制來實現互斥鎖mutex功能,但顯然semphore的功能過于強大了,在Posix線程中定義了另外一套專門用于線程同步的mutex函數。
1.創建和銷毀
有兩種方法創建互斥鎖,靜態方式和動態方式。而銷毀一個互斥鎖即意味著釋放它所占用的資源,且要求此鎖當前處于開放狀態。由于在Linux中,互斥鎖并不占用任何資源,因此LinuxThreads中的pthread_mutex_destroy()除了檢查鎖狀態以外沒有其他動作。
2.互斥鎖的屬性
互斥鎖的屬性在創建鎖的時候指定,在LinuxThreads實現中僅有一個鎖類型屬性,不同的鎖類型在試圖對一個已經被鎖定的互斥鎖加鎖時表現不同。當前有四個值可供選擇:
PTHREAD_MUTEX_TIMED_NP,這是缺省值,也就是普通鎖。當一個線程加鎖以后,其余請求鎖的線程將形成一個等待隊列,并在解鎖后按優先級獲得鎖。這種鎖策略保證了資源分配的公平性。
PTHREAD_MUTEX_RECURSIVE_NP,嵌套鎖,允許同一個線程對同一個鎖成功獲得多次,并通過多次unlock解鎖。如果是不同線程請求,則在加鎖線程解鎖時重新競爭。
PTHREAD_MUTEX_ERRORCHECK_NP,檢錯鎖,如果同一個線程請求同一個鎖,則返回EDEADLK,否則與PTHREAD_MUTEX_TIMED_NP類型動作相同。這樣就保證當不允許多次加鎖時不會出現最簡單情況下的死鎖。
PTHREAD_MUTEX_ADAPTIVE_NP,適應鎖,動作最簡單的鎖類型,僅等待解鎖后重新競爭。
3.互斥鎖的操作
互斥鎖操作主要包括加鎖pthread_mutex_lock()、解鎖pthread_mutex_unlock()和測試加鎖pthread_mutex_trylock()三個,不論哪種類型的鎖,都不可能被兩個不同的線程同時得到,而必須等待解鎖。對于普通鎖和適應鎖類型,解鎖者可以是同進程內任何線程;而檢錯鎖則必須由加鎖者解鎖才有效,否則返回EPERM;對于嵌套鎖,文檔和實現要求必須由加鎖者解鎖,但實驗結果表明并沒有這種限制,這個不同目前還沒有得到解釋。
4、條件變量
條件變量是利用線程間共享的全局變量進行同步的一種機制,主要包括兩個動作:一個線程等待“條件變量的條件成立”而掛起;另一個線程使“條件成立”(給出條件成立信號)。為了防止競爭,條件變量的使用總是和一個互斥鎖結合在一起。
1.創建和注銷
條件變有靜態動態兩種創建方式,靜態方式使PTHREAD_COND_INITIALIZER常量初始化;動態方式則調用pthread_cond_init()函數。注銷一個條件變量需要調用pthread_cond_destroy(),只有在沒有線程在該條件變量上等待的時候才能注銷這個條件變量,否則將返回EBUSY。因為Linux實現的條件變量沒有分配什么資源,所以注銷動作只包括檢查是否有等待線程。
2.等待和激發
等待條件有兩種方式:無時間設定等待pthread_cond_wait()和計時等待pthread_cond_timedwait(),其中計時等待方式如果在給定時刻前條件沒有滿足,則返回ETIMEOUT,結束等待。無論哪種等待方式,都必須和一個互斥鎖配合,以防止多個線程同時請求pthread_cond_wait()的競爭條件(RaceCondition)。
激發條件有兩種形式:pthread_cond_signal()激活一個等待該條件的線程,存在多個等待線程時按入隊順序激活其中一個;而pthread_cond_broadcast()則激活所有等待線程。
5、讀寫鎖
通過讀寫鎖,可以對受保護的共享資源進行并發讀取和獨占寫入。讀寫鎖是可以在讀取或寫入模式下鎖定的單一實體。要修改資源,線程必須首先獲取互斥寫鎖。必須釋放所有讀鎖之后,才允許使用互斥寫鎖。
5.1讀寫鎖的屬性
初始化讀寫鎖屬性
pthread_rwlockattr_init使用實現中定義的所有屬性的缺省值來初始化讀寫鎖屬性對象attr。讀寫鎖屬性對象初始化一個或多個讀寫鎖之后,影響該對象的任何函數(包括銷毀)不會影響先前已初始化的讀寫鎖。
銷毀讀寫鎖屬性
pthread_rwlockattr_destroy可用來銷毀讀寫鎖屬性對象。
實現可以導致pthread_rwlockattr_destroy()將attr所引用的對象設置為無效值。
設置讀寫鎖屬性
pthread_rwlockattr_setpshared可用來設置由進程共享的讀寫鎖屬性。
5.2讀寫鎖的使用
1.初始化讀寫鎖
pthread_rwlock_init可以通過attr所引用的屬性初始化rwlock所引用的讀寫鎖。初始化讀寫鎖之后,該鎖可以使用任意次數,而無需重新初始化。成功初始化之后,讀寫鎖的狀態會變為已初始化和未鎖定。
2.獲取讀鎖
pthread_rwlock_rdlock可用來向rwlock所引用的讀寫鎖應用讀鎖。如果寫入器未持有讀鎖,并且沒有任何寫入器基于該鎖阻塞,則調用線程會獲取讀鎖。如果寫入器未持有讀鎖,但有多個寫入器正在等待該鎖時,調用線程是否能獲取該鎖是不確定的。如果某個寫入器持有讀鎖,則調用線程無法獲取該鎖。如果調用線程未獲取讀鎖,則它將阻塞。
3.獲取寫鎖
pthread_rwlock_wrlock可用來向rwlock所引用的讀寫鎖應用寫鎖。如果沒有其他讀取器線程或寫入器線程持有讀寫鎖rwlock,則調用線程將獲取寫鎖。否則,調用線程將阻塞。如果在進行調用時,調用線程持有讀寫鎖(讀鎖或寫鎖),則結果是不確定的。為避免寫入器資源匱乏,允許在多個實現中使寫入器的優先級高于讀取器。如果針對未初始化的讀寫鎖調用pthread_rwlock_wrlock(),則結果是不確定的。
4.釋放讀寫鎖
pthread_rwlock_unlock可用來釋放在rwlock引用的讀寫鎖對象中持有的鎖。如果通過調用pthread_rwlock_unlock()來釋放讀寫鎖對象中的讀鎖,并且其他讀鎖當前由該鎖對象持有,則該對象會保持讀取鎖定狀態。如果多個線程基于rwlock中的讀鎖和寫鎖阻塞,則無法確定讀取器和寫入器誰先獲得該鎖。如果針對未初始化的讀寫鎖調用pthread_rwlock_unlock(),則結果是不確定的。
5.銷毀讀寫鎖
pthread_rwlock_destroy可用來銷毀rwlock引用的讀寫鎖對象并釋放該鎖使用的任何資源。再次調用pthread_rwlock_init()重新初始化該鎖之前,使用該鎖所產生的影響是不確定的。實現可能會導致pthread_rwlock_destroy()將rwlock所引用的對象設置為無效值。
6、結束語
由于文章篇幅有限,只能從大體上對通信中間件實現的關鍵技術進行簡單的介紹,具體的一些細節可能不夠深入,在這只能給讀者作為參考,請讀者見諒。
參考文獻:
[1]李勇.《進程間通信的分布式實現》.吉林大學,2004.
[2]JohnShapleyGray著,張寧等譯.《UNIX進程間通信(第二版)》.電子工業出版社,2001.
[3](英)GeorgeCoulouris,JeanDollimore,TimKindberg著,金蓓弘等譯.《分布式系統概念與設計》第三版.機械工業出版社,中信出版社,2004.
[4]DouglasE.Comer,DavidL.Stevens著.趙剛,林瑤,蔣慧譯.《用TCP/IP進行網際互聯第三卷:客戶-服務器編程與應用(Linux/POSIX套接字版)》.電子工業出版社,2001.
搜論文知識網致力于為需要刊登論文的人士提供相關服務,提供迅速快捷的論文發表、寫作指導等服務。具體發表流程為:客戶咨詢→確定合作,客戶支付定金→文章發送并發表→客戶接收錄用通知,支付余款→雜志出版并寄送客戶→客戶確認收到。鳴網系學術網站,對所投稿件無稿酬支付,謝絕非學術類稿件的投遞!
文章標題:通信中間件實現的關鍵技術探討
轉載請注明來自:http://www.anghan.cn/fblw/dianxin/ruanjiankaifa/4161.html
攝影藝術領域AHCI期刊推薦《Phot...關注:106
Nature旗下多學科子刊Nature Com...關注:152
中小學教師值得了解,這些教育學...關注:47
2025年寫管理學論文可以用的19個...關注:192
測繪領域科技核心期刊選擇 輕松拿...關注:64
及時開論文檢索證明很重要關注:52
中國水產科學期刊是核心期刊嗎關注:54
國際出書需要了解的問題解答關注:58
合著出書能否評職稱?關注:48
電信學有哪些可投稿的SCI期刊,值...關注:66
通信工程行業論文選題關注:73
SCIE、ESCI、SSCI和AHCI期刊目錄...關注:121
評職稱發論文好還是出書好關注:68
復印報刊資料重要轉載來源期刊(...關注:51
英文期刊審稿常見的論文狀態及其...關注:69
電子信息論文范文
智能科學技術論文 廣播電視論文 光電技術論文 計算機信息管理論文 計算機網絡論文 計算機應用論文 通信論文 信息安全論文 微電子應用論文 電子技術論文 生物醫學工程論文 軟件開發論文
SCI期刊分析
copyright © www.anghan.cn, All Rights Reserved
搜論文知識網 冀ICP備15021333號-3