




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、北京聯合大學 信息 學院實 驗 報 告題目: 操作系統實驗 系 別: 計算機科學與技術 專 業: 計算機科學與技術 班 級: 計算機1303B 學 號: 2013080332058 姓 名: 劉佳敏 指導教師: 孫悅 2015年11月 19日實驗二 進入VI編輯器格式:vi 文件名例 :vi sy.cVi編輯器三種工作方式:1 編輯方式:進入VI 處于編輯方式2 文本輸入方式:在編輯方式下輸入a ,進入追加方式,輸入i,進入插入方式3 命令方式:在輸入方式下,按Esc 鍵,由文本輸入轉向編輯方式,輸入冒號:進入命令方式4 退出vi : wq寫文件退出:w wenjianming 寫文件: q!
2、 不寫退出:wq! 寫退出編譯c文件Gcc -o wenjianming.out wenjianming.c運行文件:./wenjianming.out1 實驗內容和目的用vi編輯器編輯下列文件,使用gcc編譯器和gdb調試器,對下列程序編譯運行,分析運行結果。要求至少完成3個程序。2程序示例(1) /* 父子進程之間的同步之例 */#include <stdio.h> main( ) int pid1; /*聲明*/if(pid1=fork() /*調用fork函數復制創建child1進程*/ if (fork() /*調用fork函數復制child1進程創建child2進程,即
3、child1的子進程*/ printf (“parents context.n”); printf(“parent is waiting the child1 terminate.n); wait(0); /*父進程同步等待子進程結束,結束之后進行下一步,否則繼續等待*/ printf(“parent is waiting the child2 terminate.n”);wait(0); /*父進程同步等待子進程結束,結束之后進行下一步,否則繼續等待*/ printf(“parent terminate.n”);exit(0); /*父進程終止*/ Else /*如果創建child2進程不成
4、功,進行以下操作*/ /* child2*/ printf(“child2s context.n”); sleep(5); /*休眠5秒鐘*/ printf(“ child2 terminate.n”); exit(0); /*child2進程終止*/ else if(pid1=0) /*在子進程中*/ printf(“child1s context.n”); sleep(10); /*休眠10秒鐘*/ printf(“child1 terminate.n”); exit(0); /*child1進程終止*/ 分析: 上述程序是父進程首先創建一個子進程,若成功,再創建另一個子進程,之后三個進程
5、并發執行。究竟誰先執行,是隨機的,可根據執行結果判斷。試分析該程序的所有運行結果。注釋: fork( ) 調用正確完成時,給父進程返回地是被創建子進程的標識,給子進程返回的是0;創建失敗時,返回給父進程的時1;exit(0) 進程終止自己wait(0) 父進程同步等待子進程結束,即無子進程結束,父進程等待。實驗分析:首先fork()正確調用,執行父進程,輸出parents context parent is waiting the child1 terminate.這個時候wait(0); /父進程同步等待子進程結束,即無子進程結束,父進程等待。執行子進程2,輸出child2s context
6、。然后休眠5秒鐘,執行子進程1 輸出child1s context 休眠10秒鐘。進程2首先結束休眠,輸出child2 terminate。父進程輸出parent is waiting the child2 terminate。子進程1結束休眠,輸出child1 terminate,進程1中止自己。父進程child1 terminate,中止自己。在運行的時候會發現,在child1s context 結果出來以后,有一點時間停頓,是因為子進程2還沒有結束休眠。同理子進程1也是這樣的。(2)管道通信機制通過使用管道實現兩個和多個進程之間的通信。所謂管道,就是將一個進程的標準輸出與另一個進程的標準
7、輸入聯系在一起,進行通信的一種方法。同組進程之間可用無名管道進行通信,不同組進程可通過有名管道通信。使用無名管道進行父子進程之間的通信#include <sys/types.h>#include<ctype.h>#include<unistd.h>int pipe( int filedes2); /*創建一個無名管道,filedes0為讀通道,filedes1為寫通道*/char parent=”a message to pipe communication.n”; /*定義字符串存放于數組中*/main() int pid,chan12; char buf
8、100; pipe(chan1); pid=fork(); /*創建子進程*/if(pid<0) /*如果創建失敗*/ printf(“to create child errorn”); exit(1); /*異常終止*/if(pid>0) /*返回值大于0代表父進程*/ close(chan10); /*父進程關閉讀通道*/ printf(“parent process sends a message to child.n”); write(chan11,parent,sizeof(parent); close(chan11); /*父進程關閉寫通道*/ printf(“pare
9、nt process waits the child to terminate.n”); wait(0);printf(“parent process terminates.n”);else close(chan11); /*子進程關閉寫通道*/ read(chan10,buf,100); /*子進程讀緩存中的內容*/ printf(“the message read by child process form parent is %s.n”,buf); /*輸出讀的內容*/ close (chan10); /*子進程關閉讀通道*/ printf(“child process terminat
10、esn”);注釋:pipe( int filedes2):創建一個無名管道,filedes0為讀通道,filedes1為寫通道。結果分析:首先程序創建了一個無名管道,如果子進程創建成功,則父進程關閉讀通道,輸出parent process sends a message to child.然后寫信息,關閉寫通道,輸出parent process waits the child to terminate.等待子進程結束。子進程關閉寫通道,然后進行讀通道。輸出the message read by child process form parent is a message to pipe com
11、munication.關閉子進程,輸出child process terminates。父進程終止輸出parent process terminates.(3)Linux中的多線程編程threads.c#include <pthread.h>#include <stdio.h>#include <sys/time.h>#include <string.h>#define MAX 10pthread_t thread2;pthread_mutex_t mut;int number=0, i;void *thread1() /*線程1*/ print
12、f ("thread1 : I'm thread 1n"); for (i = 0; i < MAX; i+) printf("thread1 : number = %dn",number); pthread_mutex_lock(&mut); /*聲明開始用互斥鎖上鎖*/ number+; /*同一時間只能被一個進程調用*/ pthread_mutex_unlock(&mut); /*解鎖*/ sleep(2); /*休眠2秒*/ printf("thread1 :主函數在等我完成任務嗎?n"); pt
13、hread_exit(NULL); /*線程退出*/void *thread2() /*線程2*/ printf("thread2 : I'm thread 2n"); for (i = 0; i < MAX; i+) printf("thread2 : number = %dn",number); pthread_mutex_lock(&mut); number+; pthread_mutex_unlock(&mut); sleep(3); /*休眠3秒*/ printf("thread2 :主函數在等我完成任務
14、嗎?n"); pthread_exit(NULL);void thread_create(void) /*創建線程*/ int temp; memset(&thread, 0, sizeof(thread); /comment1 if(temp = pthread_create(&thread0, NULL, thread1, NULL) != 0) /comment2 printf("線程1創建失敗!n"); else printf("線程1被創建n"); if(temp = pthread_create(&threa
15、d1, NULL, thread2, NULL) != 0) /comment3 printf("線程2創建失敗"); else printf("線程2被創建n");void thread_wait(void) /*等待線程結束*/ if(thread0 !=0) /comment4 pthread_join(thread0,NULL); printf("線程1已經結束n"); if(thread1 !=0) /comment5 pthread_join(thread1,NULL); printf("線程2已經結束n&quo
16、t;); int main() pthread_mutex_init(&mut,NULL); /*用默認屬性初始化互斥鎖*/ printf("我是主函數哦,我正在創建線程,呵呵n"); thread_create(); printf("我是主函數哦,我正在等待線程完成任務阿,呵呵n"); thread_wait(); return 0;結果分析首先有一個線程的標識符,然后用函數pthread mutex init生成一個互斥鎖。然后通過void thread_create(void)函數創建線程。在主函數中首先輸出:我是主函數哦,我正在創建線程,
17、呵呵,然后執行thread_create();輸出:線程1被創建,線程2被創建。然后輸出我是主函數哦,我正在等待線程完成任務阿,呵呵 。然后線程一線程二交替運行,直至最終結束。本實驗中我們使用pthread_mutex_init()函數生成互斥鎖來解決變量問題,保證一段時間內只有一個線程在執行一段代碼。3 注意:Gcc lpthread o thread.out thread.c線程相關操作1) pthread_tpthread_t在頭文件/usr/include/bits/pthreadtypes.h中定義: typedef unsigned long int pthread_t; 它是一個
18、線程的標識符。2)pthread_create函數pthread_create用來創建一個線程,它的原型為: extern int pthread_create _P (pthread_t *_thread, _const pthread_attr_t *_attr, void *(*_start_routine) (void *), void *_arg); 第一個參數為指向線程標識符的指針,第二個參數用來設置線程屬性,第三個參數是線程運行函數的起始地址,最后一個參數是運行函數的參數。這里,我們的函數thread不需要參數,所以最后一個參數設為空指針。第二個參數我們也設為空指針,這樣將生成默
19、認屬性的線程。對線程屬性的設定和修改我們將在下一節闡述。當創建線程成功時,函數返回0,若不為0則說明創建線程失敗,常見的錯誤返回代碼為EAGAIN和EINVAL。前者表示系統限制創建新的線程,例如線程數目過多了;后者表示第二個參數代表的線程屬性值非法。創建線程成功后,新創建的線程則運行參數三和參數四確定的函數,原來的線程則繼續運行下一行代碼。3)pthread_join pthread_exit函數pthread_join用來等待一個線程的結束。函數原型為:extern int pthread_join _P (pthread_t _th, void *_thread_return);第一個參
20、數為被等待的線程標識符,第二個參數為一個用戶定義的指針,它可以用來存儲被等待線程的返回值。這個函數是一個線程阻塞的函數,調用它的函數將一直等待到被等待的線程結束為止,當函數返回時,被等待線程的資源被收回。一個線程的結束有兩種途徑,一種是象我們上面的例子一樣,函數結束了,調用它的線程也就結束了;另一種方式是通過函數pthread_exit來實現。它的函數原型為:extern void pthread_exit _P (void *_retval) _attribute_ (_noreturn_);唯一的參數是函數的返回代碼,只要pthread_join中的第二個參數thread_return不是
21、NULL,這個值將被傳遞給 thread_return。最后要說明的是,一個線程不能被多個線程等待,否則第一個接收到信號的線程成功返回,其余調用pthread_join的線程則返回錯誤代碼ESRCH。在這一節里,我們編寫了一個最簡單的線程,并掌握了最常用的三個函數pthread_create,pthread_join和pthread_exit。下面,我們來了解線程的一些常用屬性以及如何設置這些屬性。互斥鎖相關互斥鎖用來保證一段時間內只有一個線程在執行一段代碼。1) pthread_mutex_init 函數pthread_mutex_init用來生成一個互斥鎖。NULL參數表明使用默認屬性。如
22、果需要聲明特定屬性的互斥鎖,須調用函數 pthread_mutexattr_init。函數pthread_mutexattr_setpshared和函數 pthread_mutexattr_settype用來設置互斥鎖屬性。前一個函數設置屬性pshared,它有兩個取值, PTHREAD_PROCESS_PRIVATE和PTHREAD_PROCESS_SHARED。前者用來不同進程中的線程同步,后者用于同步本進程的不同線程。在上面的例子中,我們使用的是默認屬性PTHREAD_PROCESS_ PRIVATE。后者用來設置互斥鎖類型,可選的類型有PTHREAD_MUTEX_NORMAL、PTHR
23、EAD_MUTEX_ERRORCHECK、 PTHREAD_MUTEX_RECURSIVE和PTHREAD _MUTEX_DEFAULT。它們分別定義了不同的上鎖、解鎖機制,一般情況下,選用最后一個默認屬性。2) pthread_mutex_lock pthread_mutex_unlock pthread_delay_np pthread_mutex_lock聲明開始用互斥鎖上鎖,此后的代碼直至調用pthread_mutex_unlock為止,均被上鎖,即同一時間只能被一個線程調用執行。當一個線程執行到pthread_mutex_lock處時,如果該鎖此時被另一個線程使用,那此線程被阻塞,即
24、程序將等待到另一個線程釋放此互斥鎖。注意:1)需要說明的是,上面的兩處sleep不光是為了演示的需要,也是為了讓線程睡眠一段時間,讓線程釋放互斥鎖,等待另一個線程使用此鎖。2)請千萬要注意里頭的注釋comment1-5,如果沒有comment1和comment4,comment5,將導致在pthread_join的時候出現段錯誤,另外,上面的comment2和comment3是根源所在,所以千萬要記得寫全代碼。因為上面的線程可能沒有創建成功,導致下面不可能等到那個線程結束,而在用pthread_join的時候出現段錯誤(訪問了未知的內存區)。另外,在使用memset的時候,需要包含string
25、.h頭文件。實驗三1實驗內容與目的 熟悉有關文件的系統調用,學習文件系統的系統調用命令,提高對文件系統實現功能的理解和掌握。使用creat open read write 等系統調用用C語言編程實現復制文件。2注釋(1) Int creat(const char *pathname, mode_t mode);返回值:如果正確創建,返回文件的描述符;否則返回1;Pathname是要創建文件的路徑名。創建文件時,文件只能以只寫方式打開Mode 用來規定該文件的擁有者,小組用戶和其他用戶的訪問權限,要求用按位邏輯加對下列符號常量進行所需的組合(同open函數)。(2) int open(const
26、 char *pathname, int flags);int open(const char *pathname, int flags, mode_t mode);int close(int fd);open函數有兩個形式.其中pathname是我們要打開的文件名(包含路徑名稱,缺省是認為在當前路徑下面).flags可以去下面的一個值或者是幾個值的組合.O_RDONLY:以只讀的方式打開文件.O_WRONLY:以只寫的方式打開文件.O_RDWR:以讀寫的方式打開文件.O_APPEND:以追加的方式打開文件.O_CREAT:創建一個文件.O_EXEC:如果使用了O_CREAT而且文件已經存在,
27、就會發生一個錯誤.O_NOBLOCK:以非阻塞的方式打開一個文件.O_TRUNC:如果文件已經存在,則刪除文件的內容.前面三個標志只能使用任意的一個.如果使用了O_CREATE標志,那么我們要使用open的第二種形式.還要指定mode標志,用來表示文件的訪問權限.mode可以是以下情況的組合.-S_IRUSR 用戶可以讀 S_IWUSR 用戶可以寫S_IXUSR 用戶可以執行 S_IRWXU 用戶可以讀寫執行-S_IRGRP 組可以讀 S_IWGRP 組可以寫S_IXGRP 組可以執行 S_IRWXG 組可以讀寫執行-S_IROTH 其他人可以讀 S_IWOTH 其他人可以寫S_IXOTH 其
28、他人可以執行 S_IRWXO 其他人可以讀寫執行-S_ISUID 設置用戶執行ID S_ISGID 設置組的執行ID- 我們也可以用數字來代表各個位的標志.Linux總共用5個數字來表示文件的各種權限.00000.第一位表示設置用戶ID.第二位表示設置組ID,第三位表示用戶自己的權限位,第四位表示組的權限,最后一位表示其他人的權限. 每個數字可以取1(執行權限),2(寫權限),4(讀權限),0(什么也沒有)或者是這幾個值的和.比如我們要創建一個用戶讀寫執行,組沒有權限,其他人讀執行的文件.設置用戶ID位那么我們可以使用的模式是-1(設置用戶ID)0(組沒有設置)7(1+2+4)0(沒有權限,使
29、用缺省)5(1+4)即10705:open("temp",O_CREAT,10705); 如果我們打開文件成功,open會返回一個文件描述符.我們以后對文件的所有操作就可以對這個文件描述符進行操作了.當我們操作完成以后,我們要關閉文件了,只要調用close就可以了,其中fd是我們要關閉的文件描述符.(3)ssize_t read(int fd, void *buffer, size_t count);ssize_t write(int fd, const void *buffer, size_t count); fd是我們要進行讀寫操作的文件描述符,buffer是我們要寫入
30、文件內容或讀出文件內容的內存地址.count是我們要讀寫的字節數. 對于普通的文件read從指定的文件(fd)中讀取count字節到buffer緩沖區中(記住我們必須提供一個足夠大的緩沖區),同時返回count. 如果read讀到了文件的結尾或者被一個信號所中斷,返回值會小于count.如果是由信號中斷引起返回,而且沒有返回數據,read會返回-1,且設置errno為EINTR.當程序讀到了文件結尾的時候,read會返回0. write從buffer中寫count字節到文件fd中,成功時返回實際所寫的字節數.可能用到的頭文件#include <stdio.h>#include &l
31、t;sys/types.h>#include <unistd.h>#include <sys/stat.h>#include <fcntl.h>程序:#include <stdio.h> #include <sys/types.h>#include <unistd.h>#include <sys/stat.h>#include <fcntl.h>int main() const char *pathname=”s2.txt”; /* Pathname是要創建文件的路徑名*/ int buf10
32、24;int in,out,flag,n; /*定義函數*/ in=open(“s1.txt”,O_RDONLY,S_IRUSR); /*以只讀方式打開s1.txt,用戶可讀*/ out=creat(pathname,S_IWUER); /*創建文件s2.txt,用戶可寫*/if(in= =-1)printf(“open is errorn”); /*無s1.txt ,打開失敗*/if(out= =-1)printf(“creat is errorn”); /*無s2.txt,創建失敗*/while(flag=read(in,buf,1024)>0)n=write(out,buf,fla
33、g); /*寫入文件內容 */close(in);close(out);return 0;流程圖:實驗四 模擬內存管理程序(4學時)1、實驗目的了解簡單的固定大小內存分配方法,掌握分區存儲管理技術,了解在分區管理機制下所需的數據結構。2、實驗內容1)、將1024K內存按如下塊大小分成十個內存塊。內存塊號 內存塊大小 起始地址內存塊狀態1 512 10 NO2 256 522NO3 256 778NO4 128 1034NO5 128 1162NO6 128 1290NO7 32 1418NO8 32 1450NO9 16 1482NO10 16 1498NO其中,在內存狀態中用NO代表該內存塊
34、未被分配;用進程名代表該內存塊已被分配。2)、編制模擬內存管理程序,根據調入內存的進程大小分別采用最先適應法和最佳適應法分配內存塊。最佳適應法,如有一個12K的程序被運行時,它應該被分配到內存塊號9,若有200K的程序運行時,應將其調入內存塊號2。最先適應法,則是按內存塊號的順序,依次放入各進程名。有關編程請仔細閱讀后面的參考流程。3、實驗要求1)、要求通過鍵盤輸入若干進程名稱和程序所占內存空間的大小,把這些進程分配到內存表中,顯示內存分配情況。2)、編制程序可以循環輸入,輸入某進程結束或某進程添加進來、進程占用存儲空間的大小,并顯示內存分配情況。3)、當沒有區間存放程序時,應有提示。4)、所
35、編寫的程序,應有退出功能。5)、每添加、結束一個進程,應有輸出顯示,輸出顯示的格式如下:內存塊號 內存塊大小 起始地址進程名(內存狀態)1 512 10 A12 256 522NO3 256 778A24 128 1034A35 128 1162NO6 128 1290NO7 32 1418NO8 32 1450NO9 16 1482NO10 16 1498NO源程序:/*C*/程序所采用的數據結構、符號說明,及采用哪一種內存分配方法Struct memoryInt id; /內存塊號Int size; /內存塊大小Int start;/起始地址Char name4;/進程名(進程狀態),無進
36、程為NOStruct memorysInt count;/當前已分配內存塊的個數Struct memory m_memorys10;/內存塊數組寫出源程序清單,要求附加流程圖與注釋程序代碼:#include<stdio.h>#include<stdlib.h>#include<malloc.h>#include<string.h>struct memoryInt id; /內存塊號Int size; /內存塊大小Int start;/起始地址Char name4;/進程名(進程狀態),無進程為NO;struct memorysInt count;
37、/當前已分配內存塊的個數 Struct memory m_memorys10;/內存塊數組;struct memorys * initMemory()struct memorys * m = (struct memorys *)malloc(sizeof(struct memorys);int i;m->count = 0;m->m_memory0.id = 1; /初始化m->m_memory0.size = 512;m->m_memory0.start = 10;strcpy(m->m_,"NO");for(i=1;
38、i<10;i+)m->m_memoryi.id = i+1; if(i=1|i=2)m->m_memoryi.size = 256;else if(i=3|i=4|i=5)m->m_memoryi.size = 128;else if(i=6|i=7)m->m_memoryi.size = 32;elsem->m_memoryi.size = 16;m->m_memoryi.start = m->m_memoryi-1.start+m->m_memoryi-1.size;strcpy(m->m_,"N
39、O");return m;void showMenu(struct memorys* m) /輸出內存信息int i;printf("id size start staten");for(i=0;i<10;i+)printf("%2d %3d %4d %sn",m->m_memoryi.id,m->m_memoryi.size,m->m_memoryi.start,m->m_);printf("1.add processn"); /輸出選項printf("2.d
40、elete processn");printf("3.exitn");/*最佳適應法分配內存塊*/void bestAdapter(struct memorys * m,int size,char *s)if(m->count=10)printf("no room!n");return;int i;for(i=9;i>0;i-)if(strcmp(m->m_,"NO")=0&&m->m_memoryi.size>size)strcpy(m->m_me
41、,s); m->count+;return;void m_add(struct memorys * m) /增加選項printf("to add process!n");int size;char s4;printf("input size :");scanf("%d",&size);printf("input name :");scanf("%s",s);bestAdapter(m,size,s);void m_delete(struct memorys *
42、m) /刪除選項printf("to delete process!n");printf("input id :");int id;scanf("%d",&id);if(id>10|id<1)printf("input error!n");return;if(strcmp(m->m_,"NO")!=0)strcpy(m->m_,"NO");elseprintf("no dat
43、a to delete!n");return;int main()int i;struct memorys *memory = initMemory();while(true)showMenu(memory); /輸出菜單scanf("%d",&i); /輸入switch(i) /選項case 1:m_add(memory);break;case 2:m_delete(memory);break;case 3:exit(-1);break;default:printf("input error!n");break;return 0;/*
44、java*/ 最先適應法package test1;import java.util.*;public class Shiyan4_1 /用二維數組存儲數據static String mem = "1", "512", "10", "NO" , "2", "256", "522", "NO" , "3", "256", "778", "NO" , "
45、;4", "128", "1034", "NO" , "5", "128", "1162", "NO" , "6", "128", "1290", "NO" , "7", "32", "1418", "NO" , "8", "32", "1
46、450", "NO" , "9", "16", "1482", "NO" , "10", "16", "1498", "NO" ;private static Scanner sc;public static void print() /輸出原內存分配信息System.out.println("NoSizeAddrPID");for (int a = 0; a < 10; a+)
47、for (int b = 0; b < 4; b+) System.out.print(memab + "t");System.out.println(); /換行public static void main(String args) throws InterruptedException /拋出異常String pid;String psize;sc = new Scanner(System.in); print(); /調用輸出方法do System.out.println(); /換行System.out.print("Enter process I
48、D:"); pid = sc.next(); /輸入IDSystem.out.print("Enter process size:");psize = sc.next(); /輸入程序大小System.out.println(); /換行for (int a = 0; a <= 10; a+) if (a = 10) /最先適配算法System.out.println("No enough space for <" + pid + ">.");break; else if (mema3.equals(pid
49、) mema3 = "NO"System.out.println("Process <" + pid + "> has been killed.");break; else if (Integer.parseInt(mema1) > Integer.parseInt(psize) && mema3 = "NO")mema3 = pid;System.out.println("Memory block " + (a+1) + " has allocate
50、d for <" + pid + ">.");break;System.out.println();Thread.sleep(1000); /線程休眠print(); while (true);/ 最佳適應法package test1;import java.util.*;public class Shiyan4_2 /用二維數組存儲原信息static String mem = "1", "512", "10", "NO" , "2", "256", "522", "NO" , "3", "256", "778", "NO" , "4", "128", &
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 煙草設備智能制造與大數據分析考核試卷
- 鹽行業競爭戰略與發展方向考核試卷
- 小學四年級數學四則運算練習題50道
- 7-3寄存器傳輸語言
- 洛陽商業職業學院《實驗診斷E》2023-2024學年第二學期期末試卷
- 四川省遂寧蓬溪縣聯考2024-2025學年初三5月中考模擬試題英語試題試卷含答案
- 四川輕化工大學《智能微電網控制技術》2023-2024學年第二學期期末試卷
- 內蒙古呼和浩特市賽罕區2025屆初三3月月考語文試題含解析
- 江西省鷹潭市余江區2024-2025學年三下數學期末檢測試題含解析
- 江西省彭澤縣湖西中學2024-2025學年普通高中教育教學質量監測考試(1月)生物試題含解析
- 兒童生長發育的健康監測與指導
- 鋪貨協議合同
- 物資設備管理試題及答案
- 車間生產追溯管理制度
- 2025年4月12日衢州事業單位及市直遴選(選調)筆試真題及答案解析
- 2025年CFA特許金融分析師考試全真模擬試題與解析
- 非上市公司的期權激勵方案兩篇
- 福建省能源石化集團有限責任公司招聘筆試真題2024
- 專業稅務顧問服務合同范本
- 第8課《集字練習》課件-【知識精研】六年級上冊書法北師大版
- DB37-T 5312-2025 《建筑施工安全防護設施技術標準》
評論
0/150
提交評論