" />

国产黄色毛片-国产黄色毛片视频-国产黄色片91-国产黄色片一级-一级坐爱片-一级免费

通信中間件實(shí)現(xiàn)的關(guān)鍵技術(shù)探討

所屬欄目:軟件開發(fā)論文 發(fā)布日期:2010-09-15 09:23 熱度:

  摘要:分布式計算系統(tǒng)的應(yīng)用越來越廣泛,它是由一組分布在網(wǎng)絡(luò)中不同節(jié)點(diǎn)上的進(jìn)程彼此協(xié)作來完成任務(wù)的。這些進(jìn)程通過通信中間件來完成同步、互斥以及數(shù)據(jù)傳送等操作,通信中間件是分布式系統(tǒng)實(shí)現(xiàn)的基礎(chǔ)。本文就通信中間件的實(shí)現(xiàn)所用到的各種技術(shù)進(jìn)行了比較詳細(xì)的介紹,從而給讀者一些有用的參考和啟發(fā)。
  關(guān)鍵字:守護(hù)進(jìn)程;Posix線程;互斥鎖;讀寫鎖
  
  1、守護(hù)進(jìn)程
  1.1什么是守護(hù)進(jìn)程
  守護(hù)進(jìn)程(Daemon)是運(yùn)行在后臺的特殊進(jìn)程,它獨(dú)立于控制終端并且周期性地執(zhí)行某種任務(wù)或等待處理某些發(fā)生的事件。守護(hù)進(jìn)程是一種很有用的進(jìn)程。[1]UNIX中的大多數(shù)服務(wù)器就是用守護(hù)進(jìn)程實(shí)現(xiàn)的。比如,超級服務(wù)器inetd,Web服務(wù)器httpd等。同時,守護(hù)進(jìn)程完成許多系統(tǒng)任務(wù)。比如,作業(yè)規(guī)劃進(jìn)程crond,打印進(jìn)程lpd等。守護(hù)進(jìn)程的編程本身并不復(fù)雜,復(fù)雜的是各種版本的UNIX的實(shí)現(xiàn)機(jī)制不盡相同,造成不同UNIX環(huán)境下守護(hù)進(jìn)程的編程規(guī)則并不一致。
  1.2守護(hù)進(jìn)程的特性
  守護(hù)進(jìn)程最重要的特性是后臺運(yùn)行。在這一點(diǎn)上DOS下的常駐內(nèi)存程序TSR與之相似。其次,守護(hù)進(jìn)程必須與其運(yùn)行前的環(huán)境隔離開來。這些環(huán)境包括未關(guān)閉的文件描述符,控制終端,會話和進(jìn)程組,工作目錄以及文件創(chuàng)建掩模等。這些環(huán)境通常是守護(hù)進(jìn)程從執(zhí)行它的父進(jìn)程中繼承下來的。最后,守護(hù)進(jìn)程的啟動方式有其特殊之處。它可以在Linux系統(tǒng)啟動時從啟動腳本/etc/rcd中啟動,也可以由作業(yè)規(guī)劃進(jìn)程crond啟動,還可以由用戶終端(通常是shell)執(zhí)行。
  2、POSIX線程
  2.1POSIX線程的創(chuàng)建
  1線程與進(jìn)程
  相對進(jìn)程而言,線程是一個更加接近于執(zhí)行體的概念,它可以與同進(jìn)程中的其他線程共享數(shù)據(jù),但擁有自己的棧空間,擁有獨(dú)立的執(zhí)行序列。在串行程序基礎(chǔ)上引入線程是為了提高程序的并發(fā)度,從而提高程序運(yùn)行效率和響應(yīng)時間。線程和進(jìn)程在使用上各有優(yōu)缺點(diǎn):線程執(zhí)行開銷小,但不利于資源的管理和保護(hù);而進(jìn)程正相反。同時,線程適合于在SMP機(jī)器上運(yùn)行,而進(jìn)程則可以跨機(jī)器遷移。[2]
  2創(chuàng)建線程
  POSIX通過pthread_create()函數(shù)創(chuàng)建線程,pthread_create()創(chuàng)建的線程并不具備與主線程(即調(diào)用pthread_create()的線程)同樣的執(zhí)行序列,而是使其運(yùn)行start_routine()函數(shù)。thread返回創(chuàng)建的線程ID,而attr是創(chuàng)建線程時設(shè)置的線程屬性。pthread_create()的返回值表示線程創(chuàng)建是否成功。盡管arg是void*類型的變量,但它同樣可以作為任意類型的參數(shù)傳給start_routine()函數(shù);同時,start_routine()可以返回一個void*類型的返回值,而這個返回值也可以是其他類型,并由pthread_join()獲取。[3]
  2.2線程的取消
  1線程取消的定義
  一般情況下,線程在其主體函數(shù)退出的時候會自動終止,但同時也可以因為接收到另一個線程發(fā)來的終止(取消)請求而被強(qiáng)制取消。線程的取消類似于線程的終止,但還是有概念上的不同,雖然取消的目的和結(jié)果是終止,但是取消往往是被動的。
  2取消點(diǎn)
  根據(jù)POSIX標(biāo)準(zhǔn),pthread_join()、pthread_testcancel()、pthread_cond_wait()、pthread_cond_timedwait()、sem_wait()、sigwait()等函數(shù)以及read()、write()等會引起執(zhí)行阻塞的系統(tǒng)調(diào)用都是Cancelation-point,而其他pthread函數(shù)都不會引起Cancelation動作。但是pthread_cancel的手冊頁聲稱,由于LinuxThread庫與C庫結(jié)合得不好,因而目前C庫函數(shù)都不是Cancelation-point;但CANCEL信號會使線程從阻塞的系統(tǒng)調(diào)用中退出,并置EINTR錯誤碼,因此可以在需要作為Cancelation-point的系統(tǒng)調(diào)用前后調(diào)用pthread_testcancel(),從而達(dá)到POSIX標(biāo)準(zhǔn)所要求的目標(biāo),即如下例子代碼段所示[4]
  pthread_testcancel();
  retcode=read(fd,buffer,length);
  pthread_testcancel();
  3程序設(shè)計方面的考慮
  如果線程處于無限循環(huán)中,且循環(huán)體內(nèi)沒有執(zhí)行至取消點(diǎn)的必然路徑,則線程無法由外部其他線程的取消請求而終止。因此在這樣的循環(huán)體的必經(jīng)路徑上應(yīng)該加入pthread_testcancel()調(diào)用。
  2.3線程的中止
  一般來說,Posix的線程終止有兩種情況:正常終止和非正常終止。線程主動調(diào)用pthread_exit()或者從線程函數(shù)中return都將使線程正常退出,這是可預(yù)見的退出方式;非正常終止是線程在其他線程的干預(yù)下,或者由于自身運(yùn)行出錯(比如訪問非法地址)而退出,這種退出方式是不可預(yù)見的。
  3、互斥鎖
  盡管在Posix線程中同樣可以使用IPC的信號量機(jī)制來實(shí)現(xiàn)互斥鎖mutex功能,但顯然semphore的功能過于強(qiáng)大了,在Posix線程中定義了另外一套專門用于線程同步的mutex函數(shù)。
  1.創(chuàng)建和銷毀
  有兩種方法創(chuàng)建互斥鎖,靜態(tài)方式和動態(tài)方式。而銷毀一個互斥鎖即意味著釋放它所占用的資源,且要求此鎖當(dāng)前處于開放狀態(tài)。由于在Linux中,互斥鎖并不占用任何資源,因此LinuxThreads中的pthread_mutex_destroy()除了檢查鎖狀態(tài)以外沒有其他動作。
  2.互斥鎖的屬性
  互斥鎖的屬性在創(chuàng)建鎖的時候指定,在LinuxThreads實(shí)現(xiàn)中僅有一個鎖類型屬性,不同的鎖類型在試圖對一個已經(jīng)被鎖定的互斥鎖加鎖時表現(xiàn)不同。當(dāng)前有四個值可供選擇:
  PTHREAD_MUTEX_TIMED_NP,這是缺省值,也就是普通鎖。當(dāng)一個線程加鎖以后,其余請求鎖的線程將形成一個等待隊列,并在解鎖后按優(yōu)先級獲得鎖。這種鎖策略保證了資源分配的公平性。
  PTHREAD_MUTEX_RECURSIVE_NP,嵌套鎖,允許同一個線程對同一個鎖成功獲得多次,并通過多次unlock解鎖。如果是不同線程請求,則在加鎖線程解鎖時重新競爭。
  PTHREAD_MUTEX_ERRORCHECK_NP,檢錯鎖,如果同一個線程請求同一個鎖,則返回EDEADLK,否則與PTHREAD_MUTEX_TIMED_NP類型動作相同。這樣就保證當(dāng)不允許多次加鎖時不會出現(xiàn)最簡單情況下的死鎖。
  PTHREAD_MUTEX_ADAPTIVE_NP,適應(yīng)鎖,動作最簡單的鎖類型,僅等待解鎖后重新競爭。
  3.互斥鎖的操作
  互斥鎖操作主要包括加鎖pthread_mutex_lock()、解鎖pthread_mutex_unlock()和測試加鎖pthread_mutex_trylock()三個,不論哪種類型的鎖,都不可能被兩個不同的線程同時得到,而必須等待解鎖。對于普通鎖和適應(yīng)鎖類型,解鎖者可以是同進(jìn)程內(nèi)任何線程;而檢錯鎖則必須由加鎖者解鎖才有效,否則返回EPERM;對于嵌套鎖,文檔和實(shí)現(xiàn)要求必須由加鎖者解鎖,但實(shí)驗結(jié)果表明并沒有這種限制,這個不同目前還沒有得到解釋。
  4、條件變量
  條件變量是利用線程間共享的全局變量進(jìn)行同步的一種機(jī)制,主要包括兩個動作:一個線程等待“條件變量的條件成立”而掛起;另一個線程使“條件成立”(給出條件成立信號)。為了防止競爭,條件變量的使用總是和一個互斥鎖結(jié)合在一起。
  1.創(chuàng)建和注銷
  條件變有靜態(tài)動態(tài)兩種創(chuàng)建方式,靜態(tài)方式使PTHREAD_COND_INITIALIZER常量初始化;動態(tài)方式則調(diào)用pthread_cond_init()函數(shù)。注銷一個條件變量需要調(diào)用pthread_cond_destroy(),只有在沒有線程在該條件變量上等待的時候才能注銷這個條件變量,否則將返回EBUSY。因為Linux實(shí)現(xiàn)的條件變量沒有分配什么資源,所以注銷動作只包括檢查是否有等待線程。
  2.等待和激發(fā)
  等待條件有兩種方式:無時間設(shè)定等待pthread_cond_wait()和計時等待pthread_cond_timedwait(),其中計時等待方式如果在給定時刻前條件沒有滿足,則返回ETIMEOUT,結(jié)束等待。無論哪種等待方式,都必須和一個互斥鎖配合,以防止多個線程同時請求pthread_cond_wait()的競爭條件(RaceCondition)。
  激發(fā)條件有兩種形式:pthread_cond_signal()激活一個等待該條件的線程,存在多個等待線程時按入隊順序激活其中一個;而pthread_cond_broadcast()則激活所有等待線程。
  5、讀寫鎖
  通過讀寫鎖,可以對受保護(hù)的共享資源進(jìn)行并發(fā)讀取和獨(dú)占寫入。讀寫鎖是可以在讀取或?qū)懭肽J较骆i定的單一實(shí)體。要修改資源,線程必須首先獲取互斥寫鎖。必須釋放所有讀鎖之后,才允許使用互斥寫鎖。
  5.1讀寫鎖的屬性
  初始化讀寫鎖屬性
  pthread_rwlockattr_init使用實(shí)現(xiàn)中定義的所有屬性的缺省值來初始化讀寫鎖屬性對象attr。讀寫鎖屬性對象初始化一個或多個讀寫鎖之后,影響該對象的任何函數(shù)(包括銷毀)不會影響先前已初始化的讀寫鎖。
  銷毀讀寫鎖屬性
  pthread_rwlockattr_destroy可用來銷毀讀寫鎖屬性對象。
  實(shí)現(xiàn)可以導(dǎo)致pthread_rwlockattr_destroy()將attr所引用的對象設(shè)置為無效值。
  設(shè)置讀寫鎖屬性
  pthread_rwlockattr_setpshared可用來設(shè)置由進(jìn)程共享的讀寫鎖屬性。
  5.2讀寫鎖的使用
  1.初始化讀寫鎖
  pthread_rwlock_init可以通過attr所引用的屬性初始化rwlock所引用的讀寫鎖。初始化讀寫鎖之后,該鎖可以使用任意次數(shù),而無需重新初始化。成功初始化之后,讀寫鎖的狀態(tài)會變?yōu)橐殉跏蓟臀存i定。
  2.獲取讀鎖
  pthread_rwlock_rdlock可用來向rwlock所引用的讀寫鎖應(yīng)用讀鎖。如果寫入器未持有讀鎖,并且沒有任何寫入器基于該鎖阻塞,則調(diào)用線程會獲取讀鎖。如果寫入器未持有讀鎖,但有多個寫入器正在等待該鎖時,調(diào)用線程是否能獲取該鎖是不確定的。如果某個寫入器持有讀鎖,則調(diào)用線程無法獲取該鎖。如果調(diào)用線程未獲取讀鎖,則它將阻塞。
  3.獲取寫鎖
  pthread_rwlock_wrlock可用來向rwlock所引用的讀寫鎖應(yīng)用寫鎖。如果沒有其他讀取器線程或?qū)懭肫骶程持有讀寫鎖rwlock,則調(diào)用線程將獲取寫鎖。否則,調(diào)用線程將阻塞。如果在進(jìn)行調(diào)用時,調(diào)用線程持有讀寫鎖(讀鎖或?qū)戞i),則結(jié)果是不確定的。為避免寫入器資源匱乏,允許在多個實(shí)現(xiàn)中使寫入器的優(yōu)先級高于讀取器。如果針對未初始化的讀寫鎖調(diào)用pthread_rwlock_wrlock(),則結(jié)果是不確定的。
  4.釋放讀寫鎖
  pthread_rwlock_unlock可用來釋放在rwlock引用的讀寫鎖對象中持有的鎖。如果通過調(diào)用pthread_rwlock_unlock()來釋放讀寫鎖對象中的讀鎖,并且其他讀鎖當(dāng)前由該鎖對象持有,則該對象會保持讀取鎖定狀態(tài)。如果多個線程基于rwlock中的讀鎖和寫鎖阻塞,則無法確定讀取器和寫入器誰先獲得該鎖。如果針對未初始化的讀寫鎖調(diào)用pthread_rwlock_unlock(),則結(jié)果是不確定的。
  5.銷毀讀寫鎖
  pthread_rwlock_destroy可用來銷毀rwlock引用的讀寫鎖對象并釋放該鎖使用的任何資源。再次調(diào)用pthread_rwlock_init()重新初始化該鎖之前,使用該鎖所產(chǎn)生的影響是不確定的。實(shí)現(xiàn)可能會導(dǎo)致pthread_rwlock_destroy()將rwlock所引用的對象設(shè)置為無效值。
  6、結(jié)束語
  由于文章篇幅有限,只能從大體上對通信中間件實(shí)現(xiàn)的關(guān)鍵技術(shù)進(jìn)行簡單的介紹,具體的一些細(xì)節(jié)可能不夠深入,在這只能給讀者作為參考,請讀者見諒。
  參考文獻(xiàn):
  [1]李勇.《進(jìn)程間通信的分布式實(shí)現(xiàn)》.吉林大學(xué),2004.
  [2]JohnShapleyGray著,張寧等譯.《UNIX進(jìn)程間通信(第二版)》.電子工業(yè)出版社,2001.
  [3](英)GeorgeCoulouris,JeanDollimore,TimKindberg著,金蓓弘等譯.《分布式系統(tǒng)概念與設(shè)計》第三版.機(jī)械工業(yè)出版社,中信出版社,2004.
  [4]DouglasE.Comer,DavidL.Stevens著.趙剛,林瑤,蔣慧譯.《用TCP/IP進(jìn)行網(wǎng)際互聯(lián)第三卷:客戶-服務(wù)器編程與應(yīng)用(Linux/POSIX套接字版)》.電子工業(yè)出版社,2001.

  搜論文知識網(wǎng)致力于為需要刊登論文的人士提供相關(guān)服務(wù),提供迅速快捷的論文發(fā)表、寫作指導(dǎo)等服務(wù)。具體發(fā)表流程為:客戶咨詢→確定合作,客戶支付定金→文章發(fā)送并發(fā)表→客戶接收錄用通知,支付余款→雜志出版并寄送客戶→客戶確認(rèn)收到。鳴網(wǎng)系學(xué)術(shù)網(wǎng)站,對所投稿件無稿酬支付,謝絕非學(xué)術(shù)類稿件的投遞!
  

文章標(biāo)題:通信中間件實(shí)現(xiàn)的關(guān)鍵技術(shù)探討

轉(zhuǎn)載請注明來自:http://www.optiwork.cn/fblw/dianxin/ruanjiankaifa/4161.html

相關(guān)問題解答

SCI服務(wù)

搜論文知識網(wǎng) 冀ICP備15021333號-3

主站蜘蛛池模板: 手机看片日韩日韩韩 | 亚洲精品综合一区二区三区在线 | 全免费a级毛片免费看 | 久久精品国产精品亚洲精品 | 毛片搜索 | 国产精品久久久久久久久久久久 | 精品综合 | 欧美亚洲日本一区二区三区浪人 | 视频一二三区 | 国内精品久久久久影院网站 | 国产成人精品视频在放 | 91人成亚洲高清在线观看 | 免费看日韩欧美一级毛片 | 九九色网站 | 毛片在线视频观看 | 国产欧美日韩在线观看一区二区三区 | a免费视频 | 国产97公开成人免费视频 | a级毛片在线看日本 | 青青青青爽视频在线播放 | 成人毛片手机版免费看 | 99av在线播放 | 91精品成人免费国产片 | 男人操美女 | 国产九九精品 | 欧美曰韩一区二区三区 | 99久久久国产精品免费播放器 | 91丨九色丨首页在线观看 | 日韩欧美亚洲国产 | 久久九九国产精品怡红院 | 国产伦精品一区二区三区免费 | 成年人色网站 | 精品久久中文字幕有码 | 久草免费在线播放 | 91视频一区二区 | 亚洲视频手机在线观看 | 欧美最大成人毛片视频网站 | 国产九九在线观看播放 | 国产成人综合久久亚洲精品 | 欧美一级视频在线高清观看 | 日本精品视频在线播放 |