" />

久久精品电影网_久久久久久电影_久久99精品久久久久久按摩秒播_天堂福利影院_国产男女爽爽爽免费视频_国产美女久久

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

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

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

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

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

轉(zhuǎn)載請(qǐng)注明來(lái)自:http://www.56st48f.cn/fblw/dianxin/ruanjiankaifa/4161.html

相關(guān)問題解答

SCI服務(wù)

搜論文知識(shí)網(wǎng) 冀ICP備15021333號(hào)-3

主站蜘蛛池模板: 成人高清在线视频 | 亚洲精品乱码8久久久久久日本 | 日韩精品一区二区三区四区 | jizz18国产 | 免费成人午夜 | 日韩精品一区二区三区第95 | 一区二区三区四区电影 | 国产一区二区三区精品久久久 | 精品一区二区在线视频 | 欧美一级免费片 | 久久久久国产一区二区三区四区 | 亚洲毛片在线观看 | 一区二区三区免费观看 | 欧美h| 国产精品久久久久久婷婷天堂 | 99久久免费精品国产免费高清 | 欧美亚洲视频在线观看 | 久热电影 | 日本黄色大片免费 | 久久久久久亚洲精品 | 国产九一精品 | 成人动漫视频网站 | 尹人av| 久久一热 | 求个av网址 | 日韩久草 | 性欧美xxxx | 91精品国产91久久久久游泳池 | 国产一二三区电影 | 久久最新| 日韩精品区| 亚洲国产aⅴ精品一区二区 免费观看av | 欧美久久久久久久久中文字幕 | 国产精品a久久久久 | 久久成人精品视频 | 久久国产精品无码网站 | 激情一区二区三区 | 亚洲天堂av一区 | 国产免费va | 欧美在线亚洲 | 欧美成人一区二区三区片免费 |