• <tr id="yyy80"></tr>
  • <sup id="yyy80"></sup>
  • <tfoot id="yyy80"><noscript id="yyy80"></noscript></tfoot>
  • 99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

    網(wǎng)絡(luò)庫(kù)Tbnet及其應(yīng)用分析

    2017-01-19 06:30:31艷,張玲,胡術(shù),李璞,潘
    關(guān)鍵詞:服務(wù)端主線指針

    李 艷,張 玲,胡 術(shù),李 璞,潘 倩

    (1. 四川大學(xué) 計(jì)算機(jī)學(xué)院,四川 成都 610064;2. 四川大學(xué) 國(guó)家空管自動(dòng)化系統(tǒng)技術(shù)重點(diǎn)實(shí)驗(yàn)室,四川 成都610064;3. 四川大學(xué) 計(jì)算機(jī)基礎(chǔ)教學(xué)實(shí)驗(yàn)中心,四川 成都 610064)

    網(wǎng)絡(luò)庫(kù)Tbnet及其應(yīng)用分析

    李 艷1,2,張 玲3,胡 術(shù)1,2,李 璞1,2,潘 倩1,2

    (1. 四川大學(xué) 計(jì)算機(jī)學(xué)院,四川 成都 610064;2. 四川大學(xué) 國(guó)家空管自動(dòng)化系統(tǒng)技術(shù)重點(diǎn)實(shí)驗(yàn)室,四川 成都610064;3. 四川大學(xué) 計(jì)算機(jī)基礎(chǔ)教學(xué)實(shí)驗(yàn)中心,四川 成都 610064)

    Tbnet采用生產(chǎn)者-消費(fèi)者隊(duì)列模型,具有附帶回應(yīng)的報(bào)文發(fā)送機(jī)制,對(duì)外提供類庫(kù)型的接口,應(yīng)用具有多樣性。研究了淘寶開(kāi)源網(wǎng)絡(luò)庫(kù)Tbnet的核心設(shè)計(jì)實(shí)現(xiàn)、多樣化使用,內(nèi)容包括Tbnet主要類及其類間關(guān)系,客戶端與服務(wù)端間的連接通信過(guò)程,以O(shè)ceanBase早期版本為代表的淘寶分布式產(chǎn)品對(duì)Tbnet使用的分析,以及該庫(kù)向Windows平臺(tái)的移植工作。

    輸入/輸出線程;工作線程;生產(chǎn)者-消費(fèi)者

    0 引言

    Tbnet廣泛應(yīng)用于TFS、Tair等開(kāi)源分布式系統(tǒng),不同于僅提供數(shù)據(jù)傳輸?shù)膫鹘y(tǒng)網(wǎng)絡(luò)庫(kù),該庫(kù)為客戶端/服務(wù)端提供交互式通信,即客戶端發(fā)出請(qǐng)求,服務(wù)端接收、處理并予以回應(yīng),適用于分布式系統(tǒng)開(kāi)發(fā)。Tbnet采用對(duì)象語(yǔ)義進(jìn)行類的設(shè)計(jì)并大量使用類的繼承,實(shí)際使用時(shí)需繼承IPacketHandler、IServerAdaptor等接口類,重寫類中虛函數(shù)。Tbnet內(nèi)部由一個(gè)處理事件的輸入/輸出線程、一個(gè)超時(shí)檢查線程及工作線程池組成,I/O線程與工作線程間采用單生產(chǎn)者-多消費(fèi)者模式[1]共享加鎖報(bào)文列表。本文分析了Tbnet主要類及其消息通信,對(duì)比分析了分布式產(chǎn)品使用Tbnet的差異性。

    1 內(nèi)部實(shí)現(xiàn)解析

    Tbnet對(duì)用戶提供庫(kù)類型接口,其使用方式呈多樣化。通過(guò)不同方式調(diào)用Transport類對(duì)象,可運(yùn)行為客戶端或服務(wù)端。為與多個(gè)服務(wù)端連接通信,客戶端主線程調(diào)用ConnectionManager類指針與由本機(jī)IP地址及其端口號(hào)轉(zhuǎn)換的無(wú)符號(hào)64位整型ipport提供的serverId標(biāo)識(shí)的服務(wù)端建立連接??蛻舳伺c服務(wù)端分別繼承IPacketHandler、采用對(duì)象適配器模式[2]的IServerAdaptor類,分別重寫handlePacket()實(shí)現(xiàn)報(bào)文處理流程。因繼承的類接口不同,服務(wù)端在I/O線程或工作線程處理報(bào)文,客戶端則在I/O線程處理報(bào)文。

    1.1 主要類

    1.1.1 線程相關(guān)類

    Tbnet采用I/O線程+工作線程池的模型[3],其線程的實(shí)現(xiàn)主要通過(guò)Runnable、DefaultRunnable以及Channel類完成,其中DefaultRunnable繼承自Runnable,內(nèi)部組合CThread類。Transport類繼承自Runnable,創(chuàng)建一個(gè)I/O線程和一個(gè)超時(shí)檢查線程,線程內(nèi)部包含至多一個(gè)eventLoop處理事件;而繼承自DefaultRunnable的PacketQueueThread類則創(chuàng)建工作線程池。

    1.1.2 IOComponent相關(guān)類

    Socket類封裝套接字及其操作函數(shù),SocketEvent類封裝epoll機(jī)制[4],而IOComponent類包含Socket類指針,設(shè)置SocketEvent類指針、引用計(jì)數(shù)及回調(diào)函數(shù)等。TCPAcceptor類繼承自IOComponent,完成類似Acceptor接收器功能,服務(wù)端根據(jù)TCPAcceptor類指針觸發(fā)讀事件執(zhí)行accept()生成已連接套接字的Socket來(lái)創(chuàng)建TCPComponent類指針。TCPComponent繼承自IOComponent類,TCPComponent根據(jù)init函數(shù)傳入的參數(shù)來(lái)判斷選擇客戶端或服務(wù)端,作為客戶端發(fā)起非阻塞連接,服務(wù)端則代表連接成功。

    1.1.3 Channel相關(guān)類

    為跟蹤各報(bào)文交互式通信,Tbnet使用Channel進(jìn)行抽象,通過(guò)對(duì)客戶端Packet設(shè)置信道ID,服務(wù)端回應(yīng)Packet也使用該ID,可確保請(qǐng)求與回應(yīng)一一對(duì)應(yīng)??蛻舳颂幚砘貞?yīng)報(bào)文的IPacketHandler類指針定義在Channel,實(shí)現(xiàn)了客戶端發(fā)送和接受處理報(bào)文的異步化,Channel機(jī)制也為用戶帶來(lái)更多可能性。因定義在主機(jī)間正在使用的Channel數(shù)量有限,為避免不斷申請(qǐng)Channel造成內(nèi)存碎片,客戶端發(fā)送請(qǐng)求報(bào)文需從ChannelPool中獲取一個(gè)空閑Channel,客戶端收到回應(yīng)報(bào)文后將該Channel取出并放回ChannelPool。

    1.1.4 Transport相關(guān)類

    Transport類封裝監(jiān)聽(tīng)與連接,創(chuàng)建Socket、IOComponent類指針,設(shè)置Socket超時(shí)檢查。主線程回調(diào)Socket設(shè)置IP地址、端口等信息;回調(diào)IOComponent創(chuàng)建套接字、設(shè)置套接字選項(xiàng)以及監(jiān)聽(tīng)或連接。因TCPComponent內(nèi)部創(chuàng)建了用于報(bào)文收發(fā)的TCPConnection類指針,Transport類創(chuàng)建的I/O線程在EPollSocketEvent類對(duì)象的驅(qū)動(dòng)下,回調(diào)IOComponent進(jìn)行事件處理。超時(shí)線程遍歷檢查存儲(chǔ)在vector中的內(nèi)部正在使用的超時(shí)IOComponent類指針,再檢查內(nèi)部發(fā)生錯(cuò)誤已移入刪除列表的超時(shí)或引用計(jì)數(shù)≤ -10的IOComponent類指針。

    1.1.5 ConnectionManager相關(guān)類

    ConnectionManager類包含Transport類指針,客戶端首次與指定服務(wù)端建立TCP連接時(shí)采用長(zhǎng)連接復(fù)用的ConnectionManager類指針,調(diào)用Transport類指針建立非阻塞連接,將key為對(duì)應(yīng)服務(wù)端序號(hào)(serverId)、value為主機(jī)間連接的Connection類指針插入map;待雙方再次連接,客戶端主線程不再調(diào)用Transport建立TCP連接,而是在map中根據(jù)serverId查找Connection類指針,通過(guò)該Connection將Packet壓入發(fā)送隊(duì)列,等待I/O線程觸發(fā)寫事件。

    1.2 對(duì)象生命周期管理設(shè)計(jì)

    Tbnet中類繼承、類間相互操作,導(dǎo)致較多類對(duì)象的創(chuàng)建與回收不在自身類中。主線程創(chuàng)建Socket類指針,并根據(jù)Socket創(chuàng)建IOComponent類指針。待I/O線程不再調(diào)用Socket及IOComponent時(shí),主線程IOComponent類的析構(gòu)函數(shù)回收Socket,Transport類的析構(gòu)函數(shù)回收在用鏈表及刪除鏈表中的IOComponent指針對(duì)象。服務(wù)端主線程創(chuàng)建的TCPAcceptor類指針,客戶端主線程以及服務(wù)端I/O線程分別創(chuàng)建的TCPComponent類指針,主機(jī)I/O線程通過(guò)原子計(jì)數(shù)修改這些類指針的引用計(jì)數(shù),待引用計(jì)數(shù)≤-10時(shí),回收該指針。TCPComponent內(nèi)部創(chuàng)建TCPConnection類指針,其析構(gòu)函數(shù)回收該類指針。

    1.3 消息通信

    客戶端與服務(wù)端使用單I/O線程+多線程模型即半同步半異步模式[5],主機(jī)間通信數(shù)據(jù)流程如圖1所示。

    圖1 Tbnet工作線程池處理與回應(yīng)消息通信數(shù)據(jù)流程圖

    客戶端主線程使用工廠類IPacketFactory,根據(jù)數(shù)據(jù)包類型創(chuàng)建Packet類指針,設(shè)置Packet超時(shí)時(shí)間,將分配的Channel信道ID設(shè)置到Packet頭部,再將Packet依次壓入加鎖的發(fā)送隊(duì)列,見(jiàn)步驟1~2;I/O線程將Packet從發(fā)送隊(duì)列移至臨時(shí)隊(duì)列,依次取出Packet并調(diào)用IPacketStreamer類指針將Packet二進(jìn)制轉(zhuǎn)換,Packet組裝后放入輸出緩存,直至臨時(shí)隊(duì)列為空或輸出緩存可寫空間尚未超過(guò)閾值,使用send函數(shù)發(fā)送請(qǐng)求報(bào)文直至輸出緩存為空或發(fā)送次數(shù)超過(guò)10次,見(jiàn)步驟4。服務(wù)端I/O線程使用recv函數(shù)接收請(qǐng)求報(bào)文至空間足夠的輸入緩存,調(diào)用IPacketStreamer類指針解析報(bào)文,獲取packet并放入加鎖的報(bào)文隊(duì)列,見(jiàn)步驟6;工作線程從報(bào)文隊(duì)列取出并處理Packet,接著回調(diào)Connection將設(shè)置了超時(shí)時(shí)間、信道ID的回應(yīng)Packet壓入發(fā)送隊(duì)列,見(jiàn)步驟7~8;服務(wù)端I/O線程觸發(fā)寫事件,從發(fā)送隊(duì)列中取出Packet,組裝并發(fā)送該回應(yīng)報(bào)文,見(jiàn)步驟9;客戶端I/O線程觸發(fā)讀事件,接收并處理報(bào)文,見(jiàn)步驟10。

    2 應(yīng)用分析

    相較于傳統(tǒng)的提供收發(fā)功能的網(wǎng)絡(luò)庫(kù),面向?qū)ο蟮腡bnet不僅在使用上存在較大差異且不能直接使用,開(kāi)發(fā)人員需繼承多個(gè)接口類,重寫成員函數(shù),還需將其他類如Transport實(shí)例化并通過(guò)編碼有機(jī)結(jié)合,方可實(shí)現(xiàn)通信功能。基于Tbnet的實(shí)現(xiàn)呈多樣化,本節(jié)將介紹兩個(gè)典型的應(yīng)用:Tbnet自帶示例代碼和OceanBaseV0.3中的應(yīng)用。

    2.1 示例代碼

    Tbnet提供一個(gè)簡(jiǎn)單的報(bào)文通信反射示例[6],包含客戶端EChoClient與服務(wù)端EChoServer兩個(gè)進(jìn)程。客戶端/服務(wù)端主線程使用Transport對(duì)象建立TCP連接、開(kāi)啟I/O線程及超時(shí)檢查線程、等待線程結(jié)束[7]。示例服務(wù)端無(wú)工作線程池,主機(jī)間消息通信流程如圖2所示。

    圖2 Tbnet I/O線程處理與回應(yīng)消息通信數(shù)據(jù)流程圖

    客戶端主線程分配內(nèi)存,創(chuàng)建字符串類型的Packet類指針,將附帶信道ID的請(qǐng)求Packet壓入加鎖的發(fā)送隊(duì)列,見(jiàn)步驟1~2;I/O線程從發(fā)送隊(duì)列中移出并組裝Packet,發(fā)送請(qǐng)求報(bào)文,見(jiàn)步驟4;服務(wù)端I/O線程接收并解析請(qǐng)求報(bào)文獲取請(qǐng)求Packet,將請(qǐng)求Packet內(nèi)容直接復(fù)制拷貝到回應(yīng)Packet并設(shè)置對(duì)應(yīng)信道ID,再將其壓入發(fā)送隊(duì)列,組裝Packet并發(fā)送回應(yīng)報(bào)文,見(jiàn)步驟6~7;客戶端I/O線程接收回應(yīng)報(bào)文,確認(rèn)收發(fā)數(shù)據(jù)包數(shù)目是否相同,接收完畢關(guān)閉I/O線程,銷毀I/O組件,刪除回應(yīng)數(shù)據(jù)包,見(jiàn)步驟8。

    2.2 OceanBase中的使用

    OceanBase[8]作為分布式關(guān)系數(shù)據(jù)庫(kù),其0.4之前版本均使用Tbnet,除常規(guī)使用,通過(guò)添加WaitObject等待對(duì)象機(jī)制,客戶端可在主線程阻塞等待回應(yīng)報(bào)文。OceanBase采用I/O線程+工作線程池模型[9],主機(jī)間網(wǎng)絡(luò)通信數(shù)據(jù)流程如圖3所示。

    圖3 WaitObject消息通信數(shù)據(jù)流程圖

    客戶端主線程創(chuàng)建含有回應(yīng)報(bào)文序號(hào)(seq_id)的WaitObject類指針,見(jiàn)步驟1;數(shù)據(jù)包設(shè)置附有seq_id的Channel信道ID并將其壓入加鎖發(fā)送隊(duì)列,WaitObject在主線程阻塞等待回應(yīng)報(bào)文,見(jiàn)步驟2~3;客戶端I/O線程向服務(wù)端發(fā)送從發(fā)送隊(duì)列移出并組裝的請(qǐng)求報(bào)文,見(jiàn)步驟5;服務(wù)端I/O線程接收并解析報(bào)文獲取請(qǐng)求Packet,將其放入加鎖的報(bào)文列表,見(jiàn)步驟6;服務(wù)端工作線程獲取報(bào)文并處理,處理完成后工作線程將帶有seq_id的回應(yīng)Packet壓入發(fā)送隊(duì)列,見(jiàn)步驟7~8;服務(wù)端I/O線程組裝并發(fā)送回應(yīng)報(bào)文,見(jiàn)步驟9;客戶端I/O線程接收回應(yīng)報(bào)文并處理,若報(bào)文帶有seq_id,則從map中查找對(duì)應(yīng)WaitObject并將回應(yīng)報(bào)文放入其中,利用條件變量喚醒阻塞等待的主線程;客戶端主線程從WaitObject中獲取回應(yīng)報(bào)文,見(jiàn)步驟10~11。

    3 向Windows平臺(tái)的移植實(shí)現(xiàn)

    Tbnet基于Linux平臺(tái)實(shí)現(xiàn),為便于使用,需向Windows平臺(tái)移植。移植主要思路:(1)Tbnet依賴淘寶另一開(kāi)源實(shí)現(xiàn)Tbsys,即對(duì)系統(tǒng)級(jí)函數(shù)的封裝,跨平臺(tái)移植需先替換Tbsys中的平臺(tái)相關(guān)部分;(2)替換Tbnet中I/O復(fù)用模型調(diào)用的epoll機(jī)制。

    3.1 Tbsys的移植

    開(kāi)源分布式協(xié)調(diào)系統(tǒng)Zookeeper的C語(yǔ)言客戶端的“winport.cpp”文件[10],其包含基于Windows函數(shù)實(shí)現(xiàn)的常見(jiàn)POSIX語(yǔ)義的線程函數(shù),包括線程創(chuàng)建、回收、互斥鎖、自旋鎖、讀寫鎖、條件變量等[11],也加載了socket動(dòng)態(tài)鏈接庫(kù)。該實(shí)現(xiàn)相對(duì)較輕量,滿足Tbnet移植要求,極大地減少了移植工作量。應(yīng)用于IOComponent類指針的引用計(jì)數(shù)通過(guò)Tbsys原子計(jì)數(shù)實(shí)現(xiàn),Tbsys使用AT&T嵌入式匯編實(shí)現(xiàn)32位整數(shù)的原子操作。在Windows平臺(tái),需使用Interlocked系列函數(shù)來(lái)替換Tbsys中atomic類的相關(guān)函數(shù),以此實(shí)現(xiàn)自動(dòng)增加、減少及比較替換功能。

    3.2 事件處理機(jī)制

    Tbnet中EPollSocketEvent類采用epoll機(jī)制實(shí)現(xiàn)I/O復(fù)用模型,移植采用select機(jī)制,通過(guò)繼承SocketEvent實(shí)現(xiàn)。epoll機(jī)制返回事件觸發(fā)的套接字,epoll_ctl()關(guān)注事件,epoll_wait()獲取激活事件;select機(jī)制獲取被觸發(fā)的套接字個(gè)數(shù)后,需遍歷整個(gè)套接字?jǐn)?shù)組查找事件觸發(fā)的套接字。移植中,為操作方便,封裝的SelectSocketEvent類內(nèi)部包含key為Socket類指針、value為Socket關(guān)聯(lián)的IOComponent類指針的map,考慮到跨線程操作map,使用互斥鎖機(jī)制。select處理流程調(diào)整為:(1)遍歷map將套接字描述符關(guān)注事件加入讀描述符集、寫描述符集;(2)有限時(shí)間內(nèi)執(zhí)行select函數(shù),再次遍歷map,將map中迭代器指向的已觸發(fā)事件的value設(shè)置到根據(jù)標(biāo)識(shí)判斷觸發(fā)了讀或?qū)懯录腎OEvent類指針的成員變量IOComponent類指針中,返回觸發(fā)事件數(shù)目。

    4 結(jié)論

    作為支持交互式通信的網(wǎng)絡(luò)庫(kù),Tbnet使用時(shí)需注意:一個(gè)Transport僅有一個(gè)I/O線程,對(duì)于連接多、吞吐量大的應(yīng)用存在瓶頸[12];因服務(wù)端使用工作線程池處理請(qǐng)求報(bào)文,導(dǎo)致報(bào)文的處理順序、回應(yīng)報(bào)文的發(fā)送順序及其接收順序不一致,對(duì)同一客戶端發(fā)出的報(bào)文也存在相同情況,該亂序會(huì)導(dǎo)致應(yīng)用層面問(wèn)題,如先進(jìn)先出;服務(wù)端對(duì)請(qǐng)求報(bào)文的處理既可在I/O線程也可在工作線程中進(jìn)行,客戶端則在I/O線程中處理回應(yīng)報(bào)文,這種將應(yīng)用層的處理放入線程的做法,通常存在線程不安全問(wèn)題,需附加隊(duì)列等處理機(jī)制。

    [1] BEVERIDGE J. Win32 多線程程序設(shè)計(jì)[M]. 侯捷,譯.武漢:華中科技大學(xué)出版社,2002.

    [2] (美)沙洛韋,(美)特羅特.設(shè)計(jì)模式精解[M]. 熊節(jié),譯.北京:清華大學(xué)出版社,2004.

    [3] 陳碩. Linux多線程服務(wù)端編程:使用muduo C++網(wǎng)絡(luò)庫(kù)[M]. 北京:電子工業(yè)出版社,2013.

    [4] STEVENS W R, FENNER B,RUDOFF A M. Unix網(wǎng)絡(luò)編程卷1:套接字聯(lián)網(wǎng)API(第3版)[M]. 北京:人民郵電出版社,2015.

    [5] SCHMIDT D C,STAL M, ROHNERT H, et al.面向模式的軟件體系結(jié)構(gòu) 卷2:用于并發(fā)和網(wǎng)絡(luò)化對(duì)象的模式[M]. 張志祥,任雄偉,肖斌,等,譯.北京:機(jī)械工業(yè)出版社,2003.

    [6] Mao Qi.Tbnet開(kāi)源[EB/OL]. (2013-11-xx)[2015-12-25].http://code.taobao.org/svn/tb-common-utils/.

    [7] STEVENS W R. UNIX網(wǎng)絡(luò)編程卷2:進(jìn)程間通信(第2版)[M]. 楊繼張,譯.北京:人民郵電出版社,2010.

    [8] OceanBase開(kāi)源[EB/OL]. (2014-04-xx)[2016-04-02].http://code.taobao.org/svn/OceanBase/.

    [9]黃貴,莊明強(qiáng). OceanBase分布式存儲(chǔ)引擎[J]. 華東師范大學(xué)學(xué)報(bào)(自然科學(xué)版),2014(5):164-173.

    [10] The Apache Software Foundation. Zookeeper開(kāi)源[EB/OL].(2016-01-xx)[2016-05-02].http://www-us.apache.org/dist/zookeeper/.

    [11] BUTENHOF D R. POSIX多線程程序設(shè)計(jì) [M]. 丁磊,曾剛,譯.北京:中國(guó)電力出版社,2003.

    [12] 楊傳輝. 大規(guī)模分布式存儲(chǔ)系統(tǒng):原理解析和架構(gòu)實(shí)戰(zhàn)[M]. 北京:機(jī)械工業(yè)出版社,2013.

    Network library Tbnet and its application

    Li Yan1,2,Zhang Ling3,Hu Shu1,2,Li Pu1,2,Pan Qian1,2

    (1.College of Computer Science, Sichuan University, Chengdu 610064, China; 2.State Key Laboratory of ATC Automation System Technology,Sichuan University, Chengdu 610064, China; 3. Computer Teaching Experiment Center, Sichuan University, Chengdu 610064, China)

    Tbnet uses the queue model of producer-consumer, it can wait for the response when send packet, provide the interface of library type for user, and its application is diversity. This paper studies the core design and implementation of the Taobao open source network library Tbnet. Including inter main classes and their relations in Tbnet, the communication process between the client and the server, an analysis of the use of earlier versions of OceanBase represented by Taobao distributed products on the Tbnet, and the transplantation of the library to Windows platform.

    input/output thread; worker thread;producer-consumer

    TP393.1

    A

    10.19358/j.issn.1674- 7720.2017.01.020

    李艷,張玲,胡術(shù),等. 網(wǎng)絡(luò)庫(kù)Tbnet及其應(yīng)用分析[J].微型機(jī)與應(yīng)用,2017,36(1):66-68,72.

    2016-08-14)

    李艷(1992-),女,碩士研究生,主要研究方向:計(jì)算機(jī)網(wǎng)絡(luò),分布式系統(tǒng)理論。

    張玲(1964-),女,學(xué)士,實(shí)驗(yàn)師,主要研究方向:計(jì)算機(jī)應(yīng)用,仿真與網(wǎng)絡(luò)。

    胡術(shù)(1972-),通信作者,男,博士,副教授,主要研究方向:計(jì)算機(jī)網(wǎng)絡(luò),操作系統(tǒng)及中間件。E-mail:hushu20050327@163.com。

    猜你喜歡
    服務(wù)端主線指針
    人物報(bào)道的多維思考、主線聚焦與故事呈現(xiàn)
    活力(2019年17期)2019-11-26 00:42:32
    更加突出主線 落實(shí)四個(gè)到位 推動(dòng)主題教育取得實(shí)實(shí)在在成效
    偷指針的人
    云存儲(chǔ)中基于相似性的客戶-服務(wù)端雙端數(shù)據(jù)去重方法
    新時(shí)期《移動(dòng)Web服務(wù)端開(kāi)發(fā)》課程教學(xué)改革的研究
    數(shù)字主線
    在Windows Server 2008上創(chuàng)建應(yīng)用
    為什么表的指針都按照順時(shí)針?lè)较蜣D(zhuǎn)動(dòng)
    基于改進(jìn)Hough變換和BP網(wǎng)絡(luò)的指針儀表識(shí)別
    下沉和整合 遼寧醫(yī)改主線
    饶河县| 长泰县| 长宁区| 靖江市| 鄱阳县| 康乐县| 宝丰县| 秀山| 琼中| 泰和县| 长汀县| 延长县| 罗山县| 金华市| 扎囊县| 东乌珠穆沁旗| 唐河县| 杭锦旗| 长泰县| 蒙山县| 英吉沙县| 衡水市| 札达县| 宿迁市| 东莞市| 林西县| 安乡县| 曲麻莱县| 迁西县| 咸宁市| 平江县| 穆棱市| 合水县| 崇仁县| 闽侯县| 金沙县| 明光市| 安仁县| 伊春市| 额敏县| 咸宁市|