版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、 操作系統(tǒng)課程設(shè)計(jì)報(bào)告一、操作系統(tǒng)課程設(shè)計(jì)任務(wù)書讀者-寫者問題實(shí)現(xiàn)1 設(shè)計(jì)目的通過實(shí)現(xiàn)經(jīng)典的讀者寫者問題,鞏固對(duì)線程及其同步機(jī)制的學(xué)習(xí)效果,加深對(duì)相關(guān)基本概念的理解,并學(xué)習(xí)如何將基本原理和實(shí)際設(shè)計(jì)有機(jī)的結(jié)合。2 設(shè)計(jì)內(nèi)容在windows 2000/xp環(huán)境下,使用多線程和信號(hào)量機(jī)制實(shí)現(xiàn)經(jīng)典的讀者寫者問題,每個(gè)線程代表一個(gè)讀者或一個(gè)寫者。每個(gè)線程按相應(yīng)測(cè)試數(shù)據(jù)文件的要求,進(jìn)行讀寫操作。請(qǐng)用信號(hào)量機(jī)制分別實(shí)現(xiàn)讀者優(yōu)先和寫者優(yōu)先的讀者-寫者問題。讀者-寫者問題的讀寫操作限制:(1)寫-寫互斥,即不能有兩個(gè)寫者同時(shí)進(jìn)行寫操作(2)讀-寫互斥,即不能同時(shí)有一個(gè)讀者在讀,同時(shí)卻有一個(gè)寫者在寫(3)讀-讀允
2、許,即可以有二個(gè)以上的讀者同時(shí)讀讀者優(yōu)先的附加限制:如果一個(gè)讀者申請(qǐng)進(jìn)行讀操作時(shí)已有另一讀者正在進(jìn)行讀操作,則該讀者可直接開始讀操作。寫者優(yōu)先的附加限制:如果一個(gè)讀者申請(qǐng)進(jìn)行讀操作時(shí)已有另一寫者在等待訪問共享資源,則該讀者必須等到?jīng)]有寫者處于等待狀態(tài)后才能開始讀操作。運(yùn)行結(jié)果顯示要求:要求在每個(gè)線程創(chuàng)建、發(fā)出讀寫操作申請(qǐng)、開始讀寫操作和結(jié)束讀寫操作時(shí)分別顯示一行提示信息,以確信所有處理都遵守相應(yīng)的讀寫操作限制。3 測(cè)試數(shù)據(jù)文件格式測(cè)試數(shù)據(jù)文件包括n 行測(cè)試數(shù)據(jù),分別描述創(chuàng)建的n 個(gè)線程是讀者還是寫者,以及讀寫操作的開始時(shí)間和持續(xù)時(shí)間。每行測(cè)試數(shù)據(jù)包括四個(gè)字段,各字段間用空格分隔。第一字段為一個(gè)
3、正整數(shù),表示線程序號(hào)。第二字段表示相應(yīng)線程角色,r 表示讀者是,w 表示寫者。第三字段為一個(gè)正數(shù),表示讀寫操作的開始時(shí)間。線程創(chuàng)建后,延時(shí)相應(yīng)時(shí)間(單位為秒)后發(fā)出對(duì)共享資源的讀寫申請(qǐng)。第四字段為一個(gè)正數(shù),表示讀寫操作的持續(xù)時(shí)間。當(dāng)線程讀寫申請(qǐng)成功后,開始對(duì)共享資源的讀寫操作,該操作持續(xù)相應(yīng)時(shí)間后結(jié)束,并釋放共享資源。下面是一個(gè)測(cè)試數(shù)據(jù)文件的例子:1 r 3 52 w 4 53 r 5 24 r 6 55 w 5.1 34 相關(guān)api函數(shù)createthread()在調(diào)用進(jìn)程的地址空間上創(chuàng)建一個(gè)線程exitthread()用于結(jié)束當(dāng)前線程sleep()可在指定的時(shí)間內(nèi)掛起當(dāng)前線程createm
4、utex()創(chuàng)建一個(gè)互斥對(duì)象,返回對(duì)象句柄openmutex()打開并返回一個(gè)已存在的互斥對(duì)象句柄,用于后續(xù)訪問releasemutex()釋放對(duì)互斥對(duì)象的占用,使之成為可用waitforsingleobject()可在指定的時(shí)間內(nèi)等待指定對(duì)象為可用狀態(tài)initializecriticalsection()初始化臨界區(qū)對(duì)象entercriticalsection()等待指定臨界區(qū)對(duì)象的所有權(quán)l(xiāng)eavecriticalsection()釋放指定臨界區(qū)對(duì)象的所有權(quán)二、設(shè)計(jì)思路 將所有的讀者和所有的寫者分別放進(jìn)兩個(gè)等待隊(duì)列中,當(dāng)讀允許時(shí)就讓讀者隊(duì)列釋放一個(gè)或多個(gè)讀者,當(dāng)寫允許時(shí),釋放第一個(gè)寫者操作。
5、讀者優(yōu)先: 如果沒有寫者正在操作,則讀者不需要等待,用一個(gè)整型變量readcount記錄當(dāng)前的讀者數(shù)目,用于確定是否釋放寫者線程,(當(dāng)readcout=0 時(shí),說明所有的讀者都已經(jīng)讀完,釋放一個(gè)寫者線程),每個(gè)讀者開始讀之前都要修改readcount,為了互斥的實(shí)現(xiàn)對(duì)readcount 的修改,需要一個(gè)互斥對(duì)象mutex來實(shí)現(xiàn)互斥。 另外,為了實(shí)現(xiàn)寫-寫互斥,需要一個(gè)臨界區(qū)對(duì)象 write,當(dāng)寫者發(fā)出寫的請(qǐng)求時(shí),必須先得到臨界區(qū)對(duì)象的所有權(quán)。通過這種方法,可以實(shí)現(xiàn)讀寫互斥,當(dāng)readcount=1 時(shí),(即第一個(gè)讀者的到來時(shí),),讀者線程也必須申請(qǐng)臨界區(qū)對(duì)象的所有權(quán). 當(dāng)讀者擁有臨界區(qū)的所有權(quán)
6、,寫者都阻塞在臨界區(qū)對(duì)象write上。當(dāng)寫者擁有臨界區(qū)對(duì)象所有權(quán)時(shí),第一個(gè)判斷完readcount=1 后,其余的讀者由于等待對(duì)readcount的判斷,阻塞在mutex上!寫者優(yōu)先:寫者優(yōu)先和讀者優(yōu)先有相同之處,不同的地方在:一旦有一個(gè)寫者到來時(shí),應(yīng)該盡快讓寫者進(jìn)行寫,如果有一個(gè)寫者在等待,則新到的讀者操作不能讀操作,為此添加一個(gè)整型變量writecount,記錄寫者的數(shù)目,當(dāng)writecount=0時(shí)才可以釋放讀者進(jìn)行讀操作! 為了實(shí)現(xiàn)對(duì)全局變量writecount的互斥訪問,設(shè)置了一個(gè)互斥對(duì)象mutex3。 為了實(shí)現(xiàn)寫者優(yōu)先,設(shè)置一個(gè)臨界區(qū)對(duì)象read,當(dāng)有寫者在寫或等待時(shí),讀者必須阻塞
7、在臨界區(qū)對(duì)象read上。 讀者除了要一個(gè)全局變量readcount實(shí)現(xiàn)操作上的互斥外,還需要一個(gè)互斥對(duì)象對(duì)阻塞在read這一個(gè)過程實(shí)現(xiàn)互斥,這兩個(gè)互斥對(duì)象分別為mutex1和mutex2。程序結(jié)構(gòu)主要代碼進(jìn)行分析:1、臨界區(qū):critical_section rp_write; /臨界區(qū)critical_section cs_write;critical_section cs_read;臨界區(qū)(critical section)是一段獨(dú)占對(duì)某些共享資源訪問的代碼,在任意時(shí)刻只允許一個(gè)線程對(duì)共享資源進(jìn)行訪問。如果有多個(gè)線程試圖同時(shí)訪問臨界區(qū),那么在有一個(gè)線程進(jìn)入后其他所有試圖訪問此臨界區(qū)的線程將
8、被掛起,并一直持續(xù)到進(jìn)入臨界區(qū)的線程離開。臨界區(qū)在被釋放后,其他線程可以繼續(xù)搶占,并以此達(dá)到用原子方式操作共享資源的目的。臨界區(qū)在使用時(shí)以critical_section結(jié)構(gòu)對(duì)象保護(hù)共享資源,并分別用entercriticalsection()和leavecriticalsection()函數(shù)去標(biāo)識(shí)和釋放一個(gè)臨界區(qū)。所用到的critical_section結(jié)構(gòu)對(duì)象必須經(jīng)過initializecriticalsection()的初始化后才能使用,而且必須確保所有線程中的任何試圖訪問此共享資源的代碼都處在此臨界區(qū)的保護(hù)之下。否則臨界區(qū)將不會(huì)起到應(yīng)有的作用,共享資源依然有被破壞的可能。2、定義線程結(jié)
9、構(gòu):struct threadinfo int threadhao; char threadclass; double threadstarttime; double threadruntime; ;此結(jié)構(gòu)用來存放線程的信息,四個(gè)成員變量依次表示線程序號(hào)、線程類別、線程開始時(shí)間、線程讀寫持續(xù)時(shí)間。3、互斥對(duì)象創(chuàng)建互斥對(duì)象createmutex(null,false,mutex_for_readcount);參數(shù)含義如下: null表示創(chuàng)建帶有默認(rèn)安全性的內(nèi)核對(duì)象false表示該互斥對(duì)象沒有被任何線程所擁有mutex_for_readcount是為內(nèi)核對(duì)象賦予名字。 釋放互斥信號(hào)releasem
10、utex(h_mutex); 對(duì)資源具有訪問權(quán)的線程不再需要訪問此資源而要離開時(shí),必須通過releasemutex()函數(shù)來釋放其擁有的互斥對(duì)象4、創(chuàng)建讀者線程createthread(null,0,(lpthread_start_routine)(r_readerthread),&thread_infoi,0,&thread_id);參數(shù)含義如下:null表示創(chuàng)建帶有默認(rèn)安全性的內(nèi)核對(duì)象0表示新讀者線程擁有自己的堆棧,使用缺省大?。?mb。 (lpthread_start_routine)(r_readerthread)表示新讀者線程執(zhí)行的線程函數(shù)的地址 &thread_infoi表示在線程
11、啟動(dòng)執(zhí)行時(shí)將該參數(shù)傳遞給讀者線程函數(shù)。0表示讀者線程創(chuàng)建后可以立即進(jìn)行調(diào)度 &thread_id表示createthread使用這個(gè)地址來存放系統(tǒng)分配 給新讀者線程的i d5、等待函數(shù)waitformultipleobjects(n_thread,h_thread,true,-1);等待函數(shù)可使線程自愿進(jìn)入等待狀態(tài),直到一個(gè)特定的內(nèi)核對(duì)象變?yōu)橐淹ㄖ獱顟B(tài)為止參數(shù)含義如下:n_thread表示線程數(shù)量。h_thread是指向線程對(duì)象句柄的數(shù)組的指針。ture表示:在所有線程對(duì)象變?yōu)橐淹ㄖ獱顟B(tài)之前,該函數(shù)將不允許調(diào)用線程運(yùn)行參數(shù) -1 告訴系統(tǒng),調(diào)用線程愿意永遠(yuǎn)等待下去(無限時(shí)間量),直到該進(jìn)程終止
12、運(yùn)行。三、運(yùn)行結(jié)果程序運(yùn)行結(jié)果如下:請(qǐng)選擇要進(jìn)行的操作:1 (回車)1 (回車)請(qǐng)選擇要進(jìn)行的操作:2 (回車)四、設(shè)計(jì)總結(jié)本次操作系統(tǒng)課程設(shè)計(jì)完成的是讀者-寫者問題,通過學(xué)習(xí)對(duì)線程及其同步機(jī)制有了很的學(xué)習(xí)和掌握. 并認(rèn)識(shí)到同步可以保證在一個(gè)時(shí)間內(nèi)只有一個(gè)線程對(duì)某個(gè)資源有控制權(quán)。共享資源包括全局變量、公共數(shù)據(jù)成員或者句柄等。同步還可以使得有關(guān)聯(lián)交互作用的代碼按一定的順序執(zhí)行。同時(shí)也掌握了實(shí)現(xiàn)線程同步的對(duì)象有critical_section(關(guān)鍵段),event(事件),mutex(互斥對(duì)象),semaphores(信號(hào)量)并對(duì)這些對(duì)象理解如下: 對(duì)于關(guān)鍵段對(duì)象:首先,定義一個(gè)關(guān)鍵段對(duì)象;然后,
13、初始化該對(duì)象。初始化時(shí)把對(duì)象設(shè)置為not_singaled,表示允許線程使用資源:如果一段程序代碼需要對(duì)某個(gè)資源進(jìn)行同步保護(hù),則這是一段關(guān)鍵段代碼。在進(jìn)入該關(guān)鍵段代碼前調(diào)用entercriticalsection函數(shù),這樣,其他線程都不能執(zhí)行該段代碼,若它們?cè)噲D執(zhí)行就會(huì)被阻塞。完成關(guān)鍵段的執(zhí)行之后,調(diào)用leavecriticalsection函數(shù),其他的線程就可以繼續(xù)執(zhí)行該段代碼。如果該函數(shù)不被調(diào)用,則其他線程將無限期的等待。對(duì)于互斥對(duì)象 首先,調(diào)用createmutex創(chuàng)建互斥對(duì)象;然后,調(diào)用等待函數(shù),可以的話利用關(guān)鍵資源;最后,調(diào)用realsemutex釋放互斥對(duì)象。互斥對(duì)象可以在進(jìn)程間使
14、用,但關(guān)鍵段對(duì)象只能用于同一進(jìn)程的線程之間。對(duì)于等待函數(shù):等待函數(shù)有:1.等待單個(gè)對(duì)象的(for single object): waitforsingleobject,函數(shù)參數(shù)包括同步對(duì)象的句柄和等待時(shí)間等。如果等待時(shí)間不限制(infinite),則只有同步對(duì)象獲得信號(hào)才返回;如果等待時(shí)間為0,則在測(cè)試了同步對(duì)象的狀態(tài)之后馬上返回。2.等待多個(gè)對(duì)象的(for multiple objects) waitformultipleobjects,函數(shù)參數(shù)包括同步對(duì)象的句柄,等待時(shí)間,是等待一個(gè)還是多個(gè)同步對(duì)象等等,如果等待時(shí)間不限制(infinite),則只有同步對(duì)象獲得信號(hào)才返回;如果等待時(shí)間為
15、0,則在測(cè)試了同步對(duì)象的狀態(tài)之后馬上返回。操作系統(tǒng)設(shè)計(jì)使我對(duì)c+有了一個(gè)很好的復(fù)習(xí)和學(xué)習(xí),對(duì)線程的創(chuàng)建及同步問題及其同步對(duì)象都有了很好的理解。并能初步進(jìn)行簡(jiǎn)單的程序編程。并對(duì)程序的調(diào)式過程,也使我更好了解到線程同步的具體運(yùn)行過程,使我更好的理解程序。學(xué)習(xí)語言是一個(gè)漫長(zhǎng)的過程,我想只有在不斷的實(shí)踐練習(xí)中,才能更好的掌握編程的技巧,提高自己的編程能力,通過此次課設(shè)也讓我深深體會(huì)到自己還有很多東西需要學(xué)習(xí),還有很多課程需要復(fù)習(xí)??傊?,此次課程設(shè)計(jì)使我收益匪淺。五、源代碼#include #include#include #include fstream.h int readcount=0; int
16、writecount=0; critical_section rp_write; critical_section cs_write;critical_section cs_read;struct threadinfo int threadhao; char threadclass; double threadstarttime; double threadruntime; /線程讀寫持續(xù)時(shí)間;void readerfun(char* file);void r_readerthread(void *p);void r_writerthread(void *p);void writerfun(c
17、har* file); void w_readerthread(void *p);void w_writerthread(void *p);int main()char select;while (true)cout*讀者-寫者問題*nendl;cout 1:讀者優(yōu)先endl; cout 2:寫者優(yōu)先endl;cout 3:退出endl;coutn*nendl;cout請(qǐng)選擇要進(jìn)行的操作:select;if(select!=1 & select!=2 & select!=3)cout你操作有誤,請(qǐng)重試!endl;while (select!=1 & select!=2 & select!=3)
18、;system(cls);if (select=3)return 0;else if (select=1)readerfun(exia.txt); else if(select=2) writerfun(exia.txt);coutn是否繼續(xù)? 1. 繼續(xù) 2.退出select;if(select!=1 & select!=2 )cout你操作有誤,請(qǐng)重試!endl;while (select!=1 & select!=2);if(select=2)return 0;system(cls);return 0;void readerfun(char* file)dword n_thread=0;
19、 /線程數(shù)初值為0dword thread_id; dword wait_for_all; /臨界資源handle h_mutex;/互斥對(duì)象(h_mutex)確保線程擁有對(duì)單個(gè)資源的互斥訪問權(quán)h_mutex=createmutex(null,false,mutex_for_readcount); /*創(chuàng)建互斥對(duì)象, false表示該互斥對(duì)象沒有被任何線程所擁有mutex_for_readcount是為內(nèi)核對(duì)象賦予名字。*/handle h_thread70;/線程對(duì)象數(shù)組,最大70threadinfo thread_info70;readcount=0; initializecritical
20、section(&rp_write); /初始化臨界區(qū)ifstream infile;infile.open(file); cout讀者優(yōu)先:nthread_infon_thread.threadhaothread_infon_thread.threadclassthread_infon_thread.threadstarttimethread_infon_thread.threadruntime;if (-1 = infile.get()break;n_thread+;/線程數(shù)加一for (int i=0;i(int)(n_thread);i+)if (thread_infoi.thread
21、class=r)/創(chuàng)建讀者線程h_threadi=createthread(null,0,(lpthread_start_routine)(r_readerthread),&thread_infoi,0,&thread_id); /* 0表示createthread就保留一個(gè)區(qū)域,并且將鏈接程序嵌入. exe文件的/ stack鏈接程序開關(guān)信息指明 的存儲(chǔ)器容量分配給線程堆棧。 (lpthread_start_routine)(r_readerthread)表示新線程執(zhí)行的線程函數(shù)的地址 &thread_infoi表示在線程啟動(dòng)執(zhí)行時(shí)將該參數(shù)傳遞給線程函數(shù)。 0表示讀者線程創(chuàng)建后可以立即進(jìn)行調(diào)
22、度 &thread_id表示createthread使用這個(gè)地址來存放系統(tǒng)分配 給新讀者線程的i d*/else/創(chuàng)建寫者線程h_threadi=createthread(null,0,(lpthread_start_routine)(r_writerthread),&thread_infoi,0,&thread_id);wait_for_all=waitformultipleobjects(n_thread,h_thread,true,-1);/*等待函數(shù)可使線程自愿進(jìn)入等待狀態(tài),直到一個(gè)特定的內(nèi)核對(duì)象變?yōu)橐淹ㄖ獱顟B(tài)為止n_thread表示線程數(shù)量。h_thread是指向線程對(duì)象句柄的數(shù)組的
23、指針。ture表示:在所有線程對(duì)象變?yōu)橐淹ㄖ獱顟B(tài)之前,該函數(shù)將不允許調(diào)用線程運(yùn)行參數(shù) -1 告訴系統(tǒng),調(diào)用線程愿意永遠(yuǎn)等待下去(無限時(shí)間量),直到該進(jìn)程終止運(yùn)行。*/cout所有的讀者和寫者線程完成操作.threadhao;m_delay=(dword)(threadinfo *)(p)-threadstarttime*100);m_threadruntime=(dword)(threadinfo *)(p)-threadruntime*100);sleep(m_delay); /延遲等待cout讀者線程 m_threadhao 發(fā)出讀請(qǐng)求.endl;wait_for_mutex=waitfo
24、rsingleobject(h_mutex,-1); /等待互斥信號(hào),保證對(duì)readcount的訪問、 /修改互斥readcount+; if (readcount=1)entercriticalsection(&rp_write);/禁止寫者進(jìn)入 releasemutex(h_mutex);/釋放互斥對(duì)象,允許下個(gè)讀者繼續(xù)讀:cout讀者線程 m_threadhao 開始讀文件.endl;sleep(m_threadruntime);cout讀者線程 m_threadhao 完成讀文件.threadhao;m_delay=(dword)(threadinfo *)(p)-threadstar
25、ttime*100);m_threadruntime=(dword)(threadinfo *)(p)-threadruntime*100);sleep(m_delay); /延遲等待cout寫者線程 m_threadhao 發(fā)出寫請(qǐng)求.endl;entercriticalsection(&rp_write);/禁止下一位寫者進(jìn)入cout寫者線程 m_threadhao 開始寫文件.endl;sleep(m_threadruntime);/退出線程cout寫者線程 m_threadhao 完成寫文件.endl;leavecriticalsection(&rp_write); /如果所有讀者讀完
26、,喚醒寫者void writerfun(char* file)dword n_thread=0; /線程數(shù)目dword thread_id; dword wait_for_all; /互斥對(duì)象handle h_mutex1, h_mutex2, h_mutex3;h_mutex1 = createmutex(null, false, mutex_for_writecount);h_mutex2 = createmutex(null, false, mutex_for_readcount);h_mutex3 = createmutex(null, false, mutex_for_read);/
27、線程對(duì)象數(shù)組handle h_thread70;threadinfo thread_info70;readcount=0; initializecriticalsection(&cs_write); /初始化臨界區(qū)initializecriticalsection(&cs_read);ifstream infile;infile.open(file); cout寫者優(yōu)先:nthread_infon_thread.threadhaothread_infon_thread.threadclassthread_infon_thread.threadstarttimethread_infon_thre
28、ad.threadruntime;if(-1 = infile.get()break;n_thread+;/線程數(shù)加一for (int i=0;i(int)(n_thread);i+)if (thread_infoi.threadclass=r)/創(chuàng)建讀者線程h_threadi=createthread(null,0,(lpthread_start_routine)(w_readerthread),&thread_infoi,0,&thread_id);else/創(chuàng)建寫者線程h_threadi=createthread(null,0,(lpthread_start_routine)(w_writerthread),&thread_infoi,0,&thread_id);/等待所有線程結(jié)束wait_for_all=waitformultipleobjects(n_thread,h_thread,true,-1);cout所有的讀者和寫者線程完成操作.threadhao;m_delay=(dword)(threadinfo *)(p)-threadstarttime*100);m_threadruntime=(dword)(threadinfo *)(p)-threadrunt
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 獨(dú)家入駐合同范例
- 叉車出租合同范例格式
- 2025年株洲貨運(yùn)考試題目
- 建筑碎石采購合同范例
- 2025年南昌貨運(yùn)從業(yè)資格證模擬考試試題及答案大全
- 投資餐飲門面合同范例
- 公司期權(quán)激勵(lì)合同范例
- 店門口擺攤合同范例
- 發(fā)廊門面轉(zhuǎn)讓合同范例
- 工程窗子改造合同范例
- 廢棄物分類、清運(yùn)、處理流程圖
- 葡萄花鳥紋銀香囊課件
- 群耀實(shí)業(yè)蘇州有限公司員工宿舍
- 醫(yī)院關(guān)于成立DRG-s管理領(lǐng)導(dǎo)小組通知
- 部編版語文四年級(jí)上冊(cè)作文歸納整理總復(fù)習(xí)課件
- 【新教材】蘇教版小學(xué)科學(xué)三年級(jí)上冊(cè):12河流與湖泊課件
- 配電項(xiàng)目工程重點(diǎn)、難點(diǎn)及解決措施
- 充氨安全安全操作規(guī)程20某0310
- 風(fēng)力發(fā)電項(xiàng)目報(bào)價(jià)清單 (風(fēng)機(jī)基礎(chǔ)等)
- DB41∕T 2001-2020 金銀花扦插育苗技術(shù)規(guī)程
- 會(huì)務(wù)合同模板
評(píng)論
0/150
提交評(píng)論