




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、Good is good, but better carries it.精益求精,善益求善。Vxworks網(wǎng)絡(luò)協(xié)議棧-嵌入式操作系統(tǒng)VxWorks中網(wǎng)絡(luò)協(xié)議存儲池原理及實(shí)現(xiàn)周衛(wèi)東藺妍劉利強(qiáng)(哈爾濱工程大學(xué)自動化學(xué)院,黑龍江哈爾濱,150001)摘要本文討論了網(wǎng)絡(luò)協(xié)議存儲池的基本原理和在嵌入式操作系統(tǒng)中的實(shí)現(xiàn)方法。為在嵌入式系統(tǒng)中實(shí)現(xiàn)TCPIP協(xié)議棧,提供了一種有效、簡潔、可靠的緩沖區(qū)管理。關(guān)鍵詞VxWorks;mBlk;clBlk;網(wǎng)絡(luò)協(xié)議存儲池VxWorks操作系統(tǒng)是美國WindRiver公司于1983年設(shè)計(jì)開發(fā)的一種嵌入式實(shí)時(shí)操作系統(tǒng)(RTOS)。它以良好的持續(xù)發(fā)展能力、高性能的內(nèi)核以及卓
2、越的實(shí)時(shí)性被廣泛的應(yīng)用在通信、軍事、航空、航天等高精尖技術(shù)及實(shí)時(shí)性要求極高的領(lǐng)域中。VxWorks操作系統(tǒng)有著優(yōu)越的網(wǎng)絡(luò)性能,而緩沖區(qū)的數(shù)據(jù)拷貝是影響網(wǎng)絡(luò)性能的主要因素。眾所周知,緩沖區(qū)在網(wǎng)絡(luò)協(xié)議棧中有兩個(gè)作用:第一,提供載體,使分組或報(bào)文可以在各協(xié)議層中流動;第二,為各級緩沖區(qū)提供空間。緩沖區(qū)的設(shè)立使得TCPIP協(xié)議棧支持異步IO操作,異步操作對于協(xié)議棧的I0性能是非常重要的。在網(wǎng)絡(luò)輸出的過程中每一層需要在數(shù)據(jù)的首部或者尾部添加數(shù)據(jù)頭和數(shù)據(jù)尾來對數(shù)據(jù)進(jìn)行封裝使得接收端對應(yīng)的層能夠進(jìn)行正確的接收,在輸入的過程中每層都需要將本層的數(shù)據(jù)頭和數(shù)據(jù)尾去掉而最終還原成發(fā)送端發(fā)送的數(shù)據(jù)。上述的封裝去封裝和
3、拷貝操作使得網(wǎng)絡(luò)協(xié)議對內(nèi)核的存儲器管理能力提出了很多要求。這些要求包括能方便地操作可變長緩存,能在緩存頭部和尾部添加數(shù)據(jù)(如低層封裝來自高層的數(shù)據(jù)),能從緩存中移去數(shù)據(jù)(如當(dāng)數(shù)據(jù)包向上經(jīng)過協(xié)議棧時(shí)要去掉首部),并能盡量減少這些操作所作的數(shù)據(jù)復(fù)制。1使用netBufLib管理存儲池的基本原理網(wǎng)絡(luò)協(xié)議存儲池使用mBlk結(jié)構(gòu)、clBlk結(jié)構(gòu)、簇緩沖區(qū)和netBufLib提供的函數(shù)進(jìn)行組織和管理。mBlk和clBlk結(jié)構(gòu)為簇緩沖區(qū)(cluster)中數(shù)據(jù)的緩沖共享和緩沖鏈接提供必要的信息。netBufLib例程使用mBlk和clBlk來管理cluster和引用cluster中的數(shù)據(jù),這些結(jié)構(gòu)體中的信息
4、用于管理cluster中的數(shù)據(jù)并且允許他們通過引用的形式來實(shí)現(xiàn)數(shù)據(jù)共享,從而達(dá)到數(shù)據(jù)“零拷貝”的目的。1.1結(jié)構(gòu)體mBlk和clBlk及其數(shù)據(jù)結(jié)構(gòu)mBlk是訪問存儲在內(nèi)存池中數(shù)據(jù)的最基本對象,由于mBlk僅僅只是通過clBlk來引用數(shù)據(jù),這使得網(wǎng)絡(luò)層在交換數(shù)據(jù)時(shí)就可以避免數(shù)據(jù)復(fù)制。只需把一個(gè)mBlk連到相應(yīng)mBlk鏈上就可以存儲和交換任意多的數(shù)據(jù)。一個(gè)mBlk結(jié)構(gòu)體包括兩個(gè)成員變量mNext和mNextPkt,由它們來組成縱橫兩個(gè)鏈表:mNext來組成橫的鏈表,這個(gè)鏈表中的所有結(jié)點(diǎn)構(gòu)成一個(gè)包(packet);mNextPkt來組成縱的鏈表,這個(gè)鏈表中的每個(gè)結(jié)點(diǎn)就是一個(gè)包(packet),所有的
5、結(jié)點(diǎn)鏈在一起構(gòu)成一個(gè)包隊(duì)列,如圖1所示。圖1包含兩個(gè)數(shù)據(jù)包的mBlk鏈結(jié)構(gòu)體mBlk和clBlk的數(shù)據(jù)結(jié)構(gòu)如下所示:structmBlkM_BLK_HDRmBlkHdr;/*header*/M_PKT_HDRmBlkPktHdr;/*pkthdr*/CL_BLK*pClBlk;/*pointertoclusterblk*/M_BLK;structclBlkCL_BLK_LISTclNode;/*unionofnextclBlk*/UINTclSize;/*clustersize*/intclRefCnt;/*countofthecluster*/structnetPool*pNetPool;/
6、*pointertothenetPool*/CL_BLK;/*headeratbeginningofeachmBlk*/structmHdrstructmBlk*mNext;/*nextbufferinchain*/structmBlk*mNextPkt;/*nextchaininqueue/record*/char*mData;/*locationofdata*/intmLen;/*amountofdatainthismBlk*/UCHARmType;/*typeofdatainthismBlk*/UCHARmFlags;/*flags;seebelow*/M_BLK_HDR;/*recor
7、d/packetheaderinfirstmBlkofchain;validifM_PKTHDRset*/structpktHdrstructifnet*rcvif;/*rcvinterface*/intlen;/*totalpacketlength*/M_PKT_HDR;1.2網(wǎng)絡(luò)協(xié)議存儲池的初始化VxWorks在網(wǎng)絡(luò)初始化時(shí)給網(wǎng)絡(luò)協(xié)議分配存儲池并調(diào)用netPoolInit()函數(shù)對其初始化,由于一個(gè)網(wǎng)絡(luò)協(xié)議通常需要不同大小的簇,因此它的存儲池也必須包含很多簇池(每一個(gè)簇池對應(yīng)一個(gè)大小的簇)。如圖2所示。另外,每個(gè)簇的大小必須為2的方冪,最大可為64KB(65536),存儲池的常用簇的大小為
8、64,128,256,512,1024比特,簇的大小是否有效取決于CL_DESC表中的相關(guān)內(nèi)容,CL_DESC表是由netPoolInit()函數(shù)調(diào)用設(shè)定的。圖2網(wǎng)絡(luò)協(xié)議存儲池初始化后的結(jié)構(gòu)1.3存儲池的鏈接及釋放存儲池在初始化后,由netPool結(jié)構(gòu)組織幾個(gè)下一級子池:一個(gè)mBlk池、一個(gè)clBlk池和一個(gè)cluster池。mBlk池就是由很多mBlk組成的一條mBlk鏈;clBlk池就是由很多clBlk組成的一條clBlk鏈。cluster池由很多的更下一級cluster子池構(gòu)成,每一個(gè)cluster子池就是一個(gè)cluster鏈。每一個(gè)cluster鏈中的所有cluster的大小相同,不同
9、鏈中的cluster大小不同。但要實(shí)現(xiàn)不同進(jìn)程訪問同一簇而不需要作數(shù)據(jù)的拷貝,還需要把mBlk結(jié)構(gòu),clBlk結(jié)構(gòu)和簇結(jié)構(gòu)鏈接在一起。創(chuàng)建這三級結(jié)構(gòu)一般要遵循這樣五步:a.調(diào)用系統(tǒng)函數(shù)netClusterGet()預(yù)定一塊簇緩沖區(qū);b.調(diào)用系統(tǒng)函數(shù)netClBlkGet()預(yù)定一個(gè)clBlk結(jié)構(gòu);c.調(diào)用系統(tǒng)函數(shù)netMblkGet()預(yù)定一個(gè)mBlk結(jié)構(gòu);d.調(diào)用系統(tǒng)函數(shù)netClBlkJoin()把簇添加到clBlk結(jié)構(gòu)中;e.調(diào)用系統(tǒng)函數(shù)netMblkClJoin()把clBlk結(jié)構(gòu)添加到mBlk結(jié)構(gòu)中。這樣,就構(gòu)成了最后的緩沖區(qū)。在緩沖區(qū)中的數(shù)據(jù)使用完畢后要及時(shí)的釋放內(nèi)存,這一過程只需
10、要調(diào)用系統(tǒng)函數(shù)netMblkC1ChainFree()釋放存有數(shù)據(jù)的mBlk鏈表。例如當(dāng)數(shù)據(jù)向上層傳送時(shí),在本層中可以釋放已經(jīng)不再使用的mBlk鏈表,由于在clBlk中記錄著指向本模塊的mBlk的個(gè)數(shù),雖然釋放了mBlk鏈表,但是這并不表示將cluster中的數(shù)據(jù)釋放掉了,上層復(fù)制的鏈表仍然控制著這些數(shù)據(jù),直到clBlk中的mBlk計(jì)數(shù)為0時(shí)才真正的將數(shù)據(jù)占用的簇釋放掉,將數(shù)據(jù)占用的內(nèi)存空間釋放、歸還給系統(tǒng)將來使用。2網(wǎng)絡(luò)協(xié)議存儲池與數(shù)據(jù)的封裝處理VxWorks操作系統(tǒng)之所以采用mBlkclBlkcluster這樣的網(wǎng)絡(luò)數(shù)據(jù)存儲結(jié)構(gòu),目的就是減少數(shù)據(jù)拷貝的次數(shù),提高網(wǎng)絡(luò)數(shù)據(jù)的傳輸速率。圖3存儲
11、帶有1460個(gè)字節(jié)數(shù)據(jù)的mBlk在網(wǎng)絡(luò)輸出的過程中當(dāng)從上層向下層傳遞數(shù)據(jù)時(shí),下層協(xié)議需要對數(shù)據(jù)進(jìn)行封裝使得接收端對應(yīng)的層能夠進(jìn)行正確的接收。下面通過實(shí)例分析網(wǎng)絡(luò)數(shù)據(jù)的封裝過程。例如要在如圖3所示的mBlk鏈中添加IP和UDP的首部。在mBlk鏈表中封裝數(shù)據(jù)的方法是分配另外一個(gè)mBlk,把它放在鏈?zhǔn)祝⒎纸M首部復(fù)制到這個(gè)mBlk。IP首部和UDP首部被放置在新mBlk的最后,這個(gè)新mBlk就成了整個(gè)鏈表的首部。如果需要,它允許任何其它低層協(xié)議(例如添加以太網(wǎng)首部)在IP首部前添加自己的首部,不需要再復(fù)制IP和UDP首部。在第一個(gè)mBlk中的mBlkHdr.mData指針指向首部的起始位置,mB
12、lkHdr.mLen的值是28。在分組首部和IP首部之間有72字節(jié)的未用空間留給以后的首部,通過適當(dāng)?shù)匦薷膍BlkHdr.mData指針和mBlkHdr.mLen添加在IP首部的前面。注意,分組首部已經(jīng)移到新mBlk中了,分組首部必須放在mBlk鏈表的第一個(gè)mBlk中。在移動分組首部的同時(shí),在第一個(gè)mBlk設(shè)置M_PKTHDR標(biāo)志。在第二個(gè)mBlk中分組首部占用的空間現(xiàn)在未用。最后,改變在此分組首部中的長度成員mBlkPktHdr.len,成員mBlkPktHdr.len的值是這個(gè)分組的mBlk鏈表中所有數(shù)據(jù)的總長度:即所有通過mBlkHdr.mNext指針鏈接的mbuf的mBlkHdr.mL
13、en值的和。本例中由于增加了28個(gè)字節(jié)變成了1488。如圖4所示。圖4添加完IP和UDP首部的mBlk這樣,當(dāng)報(bào)文在協(xié)議棧中流動時(shí),不會拷貝報(bào)文鏈,而只需把指向mBlk的指針通過參數(shù)傳遞。當(dāng)報(bào)文需要進(jìn)人緩沖區(qū)時(shí),也是通過鏈表的指針操作將報(bào)文插入或添加到隊(duì)列中。3結(jié)論網(wǎng)絡(luò)協(xié)議存儲池的職責(zé)有兩個(gè):為協(xié)議棧提供合適的緩沖區(qū),如果太大會浪費(fèi)系統(tǒng)資源,太小會影響協(xié)議棧的吞吐量;提供合適的數(shù)據(jù)結(jié)構(gòu)裝載網(wǎng)絡(luò)報(bào)文,既可以使協(xié)議棧方便地處理報(bào)文,又可以減少緩沖區(qū)拷貝的次數(shù)。減少拷貝次數(shù)不僅降低了CPU的負(fù)荷,還可以降低存儲器的消耗。本文剖析了嵌入式操作系統(tǒng)VxWorks中網(wǎng)絡(luò)協(xié)議存儲池的原理,實(shí)現(xiàn)了數(shù)據(jù)能夠動態(tài)
14、增刪、但在邏輯上又呈現(xiàn)連續(xù)性的數(shù)據(jù)結(jié)構(gòu)。能夠滿足在各協(xié)議層之間傳遞數(shù)據(jù)而不需要進(jìn)行內(nèi)存拷貝。參考文獻(xiàn)1翟東海,李力.mbuf的實(shí)現(xiàn)原理剖析及其在網(wǎng)絡(luò)編程中的應(yīng)用J.計(jì)算機(jī)工程與應(yīng),2004(8):104-106.2美DouglasEComer著張娟等譯用TCPIP進(jìn)行網(wǎng)際互聯(lián)第二卷:設(shè)計(jì)、實(shí)現(xiàn)與內(nèi)核(第三版)M北京:電子工業(yè)出版社,200105.3美GaryRWrightWRichardStevens著陸雪瑩,蔣慧等譯TCPIP詳解卷2:實(shí)現(xiàn)M北京:機(jī)械工業(yè)出版社200007:10504WindRiverSystemInc.VxWorksNetwork收稿日期:8月25日修改日期:9月2日Vx
15、Works任務(wù)追蹤實(shí)例分析VxWorks中如果稍有不慎,就可能導(dǎo)致tasksuspend,如果運(yùn)氣好,shell沒有被掛起,則可以通過系統(tǒng)的一些命令追蹤一下掛起的原因。其中用到的主要命令是i、tt、ti、d等。首先從出錯(cuò)信息開始:0 xfc8125b8(t_Lcd):memPartFree:invalidblock0 xfdfc6f38inpartition0 xfe508894.由于memPartFree了一個(gè)非法的內(nèi)存塊,導(dǎo)致了任務(wù)掛起,我們需要確定到底是哪條語句導(dǎo)致了這個(gè)異常的產(chǎn)生,可能是什么原因引起的。首先,需要通過“i”命令察看任務(wù)狀態(tài):-iNAMEENTRYTIDPRISTATUS
16、PCSPERRNODELAY-tExcTaskexcTaskfdffec800PENDfe3c5f50fdffeb603006b0tLogTasklogTaskfdffc2980PENDfe3c5f50fdffc18800tShellshellfdf5fa481READYfe1f3afcfdf5f62800t_Lcdfe392a30fc8125b8100SUSPENDfe1f24b0fc8120b8d00030可以看到任務(wù)t_Lcd的狀態(tài)為SUSPEND,即被掛起的狀態(tài)。其他各項(xiàng)的含義都比較清楚,ENTRY是任務(wù)的入口函數(shù),如果沒有symbol,則直接顯示地址,TID是任務(wù)的ID號,一般用任務(wù)
17、的棧底地址表示,PC是當(dāng)前的指令位置,SP是當(dāng)前棧頂位置。然后通過”tt”來追溯函數(shù)調(diào)用過程:-ttt_Lcdfe3c14f4vxTaskEntry+68:fe392a30()fe392b48initLcdComponent+2e8:fe392bdc()fe392becinitLcdComponent+38c:fe392bfc()fe39333cinitLcdComponent+adc:lcdShowPassWord()fe398590lcdShowPassWord+84:saveModifiedSetting()fe3a3790saveModifiedSetting+220:saveSett
18、ingValue(1)fe1fd6d0saveSettingValue+148:fe1fc428(0,5,ffffffff)fe1fc888getDeviceSettingValue+64c:fclose()fe1aab48fclose+ec:free()fe1bb7d4free+1c:memPartFree()fe1bb2dcmemPartFree+148:taskSuspend()我們可以了解到函數(shù)的調(diào)用過程,vxTaskEntry()?-fe392a30()-fe392bdc()-fe392bfc()-lcdShowPassWord()-saveModifiedSetting()-sav
19、eSettingValue(1)-fe1fc428(0,5,ffffffff)-fclose()-free()-memPartFree()-taskSuspend()。其他相關(guān)信息:第一欄是發(fā)生跳轉(zhuǎn)(即函數(shù)調(diào)用)后的返回地址,稍后會作詳細(xì)解釋,第二欄是離返回地址最近的symbol和偏移量,一般情況下會是發(fā)起調(diào)用的那個(gè)函數(shù)的名稱,除非該函數(shù)是內(nèi)部函數(shù),系統(tǒng)中沒有symbol,第三欄是被調(diào)用的函數(shù)。再來查看一下t_Lcd任務(wù)的棧里的內(nèi)容,從前面的任務(wù)信息里已經(jīng)得知當(dāng)前棧頂位置為fc8120b8,通過“d”命令顯示該地址的內(nèi)容。-d0 xfc8120b0fc8120b0:fc8125b8fc8125
20、b8fc8120c8fe1f24b0*.%.%.$.*fc8120c0:fe508894fdfc6f30fc8120e8fe1bb2dc*.P.o0.*fc8120d0:fdf26b08000001000000000c00000000*.k.*fc8120e0:00000000fdf1ed80fc8120f8fe1bb7d4*.*fc8120f0:fd9a3538fdf1ed80fc812108fe1aab48*.58.!.H*fc812100:fd9a3538fc812108fc812238fe1fc888*.58.!.8.*fc812110:0000000000000005ffffffff
21、00000600*.*fc812120:0000000afdf1ed804230312e78746373*.B01.xtcs*fc812130:5f6275662e696c320000000000000000*_buf.il2.*這里我們可以看到一些熟悉的地址,注意看最后兩列,在這里可以找到”tt”中顯示的第一欄地址即函數(shù)調(diào)用的返回地址。兩個(gè)返回地址之間是該函數(shù)的??臻g,用于保存棧指針、局部變量或者相關(guān)寄存器的值。要具體了解這些值是怎么來的,就要用到反匯編了。反匯編通過objdump命令來實(shí)現(xiàn),不同類型的cpu會有不同的可執(zhí)行文件,例如objdumpppc-Dvxworksxx.s反匯編的結(jié)果
22、可能會很大,耐心等待吧。我們來看一下fclose()里調(diào)用free()的這一過程,在匯編代碼里查找返回地址fe1aab48。fe1aaa5c:fe1aab44:48010c75blfe1bb7b8fe1aab48:38000000lir0,0bl是無條件跳轉(zhuǎn)指令,free()執(zhí)行完之后,應(yīng)返回fe1aab48繼續(xù)執(zhí)行。查找fe1bb7b8,看看free被調(diào)用時(shí)干了些什么?fe1bb7b8:fe1bb7b8:9421fff0stwur1,-16(r1)fe1bb7bc:7c0802a6mflrr0fe1bb7c0:90010014stwr0,20(r1)fe1bb7c4:7c641b78mrr4
23、,r3fe1bb7c8:3c60fe51lisr3,-431fe1bb7cc:38638894addir3,r3,-30572fe1bb7d0:4bfff9c5blfe1bb194fe1bb7d4:80010014lwzr0,20(r1)fe1bb7d8:7c0803a6mtlrr0fe1bb7dc:38210010addir1,r1,16fe1bb7e0:4e800020blr雖然不同類型cpu的匯編指令不同,但還是可以大致猜出其中的含義。HYPERLINKhttp:/pds.twi.tudelft.nl/vakken/in1200/labcourse/instruction-set/stw
24、u.htmlstwu指令將r1保存到地址(r1-16)位置,然后讓將r1減去16保存到r1中,完成了保存并更新棧指針的過程;第2、3條語句將返回地址保存到r1+20的位置;下面幾條語句實(shí)際上是準(zhǔn)備參數(shù)的過程,r3,r4一般用來保存函數(shù)的形參值,隨后調(diào)用了memPartFree。從memPartFree返回后,先從堆棧上讀取返回地址,然后將棧頂下移16字節(jié),即恢復(fù)到原來的位置,最后跳轉(zhuǎn)到返回地址。對著內(nèi)存內(nèi)容校驗(yàn)一下,fclose調(diào)用free后的返回地址為fe1aab48,按照上面的分析,這個(gè)地址會被free()函數(shù)保存在r1+20的位置,因此r1+20=fc8120fc,r1=fc8120e8,而free中將r1減去了16,所以剛進(jìn)入free()時(shí),r1應(yīng)該等于fc8120f8,這個(gè)數(shù)值會被保存在fc8120e8處,事實(shí)正是如此。這里棧內(nèi)空間的利用有點(diǎn)交叉混雜,暫時(shí)沒有弄的太明白,并且free()中沒有用到過fc8120f0-fc8120f8空間的內(nèi)存,推測可能是棧的大小至少為16字節(jié)所以留空了,里面的內(nèi)容是歷史遺留產(chǎn)物,是否如此,還有待進(jìn)一步的研究。以上是比較通用的分析過程,本來還涉及到結(jié)合c代碼的分析,跟具體的例子結(jié)合太緊密,就不贅述了,有一點(diǎn)可以提一下,想追溯函數(shù)調(diào)用過程中某一參數(shù)的運(yùn)行值,可能會在調(diào)用者的棧中,也可能會在調(diào)用者的調(diào)用者的棧中,這個(gè)需要結(jié)合具體的匯編
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 橋梁工程設(shè)計(jì)考題及答案
- 幼兒園數(shù)學(xué)智慧點(diǎn)滴試題及答案
- 家具設(shè)計(jì)中如何實(shí)現(xiàn)藝術(shù)性與功能性的結(jié)合試題及答案
- 鹽湖提鋰技術(shù)成本降低與產(chǎn)能快速擴(kuò)張可行性研究報(bào)告
- 綠色環(huán)保產(chǎn)業(yè)發(fā)展資金申請報(bào)告:環(huán)保產(chǎn)業(yè)技術(shù)創(chuàng)新與產(chǎn)業(yè)化
- 電動汽車安全技術(shù)的現(xiàn)狀與發(fā)展前景探討試題及答案
- 新安全工程師施工安全考點(diǎn)試題及答案
- 未來科技背景下的大學(xué)物理考試試題及答案
- 2025特崗教師招聘教學(xué)能力測試題目及答案
- 2025南航招聘空姐面試試題及答案
- 靜脈導(dǎo)管常見并發(fā)癥臨床護(hù)理實(shí)踐指南
- 圍手術(shù)期血糖管理專家共識
- 上肢肘腕關(guān)節(jié)松動術(shù)
- (高清版)DZT 0419.3-2022 礦產(chǎn)資源潛力評價(jià)規(guī)范(1:250 000)第3部分:成礦規(guī)律研究
- 科學(xué)道德與學(xué)術(shù)規(guī)范知識試題及答案
- 將健康社區(qū)納入社區(qū)發(fā)展規(guī)劃
- 痛風(fēng)科普講座課件
- 心肌梗死的早期識別與緊急處理
- 國開【形考】《管理英語(3)》形成性考核1-8答案
- 2023學(xué)年完整公開課版用戶思維
評論
0/150
提交評論