




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、实验二 进程管理一、实验目的(1) 加深对进程概念的理解,明确进程和程序的区别。(2) 深入了解操作系统如何组织进程和创建进程。(3) 进一步认识如何实现处理器调度。二、实验预备知识(1) 进程的概念(2) PCB。(3) 进程的组织方式。(4) 进程的创建。(5) 进程的调度。三、实验内容1. 观察Windows2000/XP中的进程和线程熟悉Windows2000/XP中任务管理器的使用,通过任务管理器识别操作系统中的进程和线程的相关信息;掌握利用spy+.exe来察看Windows中各个任务的更详细信息。具体实验步骤如下:(1) 启动操作系统自带的任务管理器:方法:直接按组合键Ctrl+
2、Alt+Del,或者是在点击任务条上的“开始”“运行”,并输入“taskmgr.exe”。如下图所示:(2) 调整任务管理器的“查看”中的相关设置,显示关于进程的以下各项信息,并完成下表(填满即可):表一:统计进程的各项主要信息序号进程名称进程ID线程数量占用内存优先级占CPU时间虚拟内存12345678(3) 从桌面启动办公软件“Word”,在任务管理器中找到该软件的登记,并将其结束掉。再从任务管理器中分别找到下列程序:winlogon.exe、lsass.exe、csrss.exe、smss.exe,试着结束它们,观察到的反应是 ,原因是 。(4) 在任务管理器中找到进程“explorer
3、.exe”,将之结束掉,并将桌面上你打开的所有窗口最小化,看看你的计算机系统起来什么样的变化 、得到的结论是 (说出explorer.exe进程的作用)。5、运行“spy+.exe”应用软件,点击按钮“”,切换到进程显示栏上,查看进程“explorer.exe”的各项信息,并填写下表:表二:统计线程的各项信息进程:explorer.exe 中的各个线程序号进程ID线程ID基本优先级当前优先级CPU时间上下文开关12345678910111213146、注意某些线程前有“”,如图所示:,说明二者之间的差异是 。2. 利用API在Windows下创建进程学习使用在Windows 2000/XP中利
4、用API创建进程的方法;学习了解创建进程函数CreateProcess及其特性;设计测试程序,通过在命令行中加载相应的测试程序生成的命令文件,去按照命令文件中指定的程序路径打开相应的程序去执行。1)相关知识介绍在创建一个线程时,Windows会做大量的工作-创建一个新的地址空间,为进程分配资源以及创建一个基线程。CreateProcess函数的原型如下:CreateProcess(LPCTSTR lpApplicationName,/pointer to name of executable moudleLPTSTR cmdLine,/pointer to command line strin
5、gLPSECURITY_ATTRIBUTES lpProcessAttributes,/pointer to process security attributesLPSECURITY_ATTRIBUTES lpThreadAttributes,/pointer to theread security attributesBOOL bInheritHandle ,/handle inheritance flagDWORD dwCreationFlag,/various creation flagsLPVOID lpEnviroment,/Enviroment variableLPCTSTR l
6、pCurrentDirectory, /Child's current directoryLPSTARTUPINFO lpStartupInfo, /pointer to StartupInfoLPPROCESS_INFORMATION lpProcessInformation /pointer to PROCESS_INFORMATION )创建进程的函数为CreateProcess,该函数比较复杂共有十个参数。 BOOL CreateProcess( LPCTSTR lpApplicationName, /执行程序文件名 LPTSTR lpCommandLine, /参数行 LPS
7、ECURITY_ATTRIBUTES lpProcessAttributes, /进程安全参数 LPSECURITY_ATTRIBUTES lpThreadAttributes, /线程安全参数 BOOL bInheritHandles, / 继承标记 DWORD dwCreationFlags, / 创建标记 LPVOID lpEnvironment, / 环境变量 LPCTSTR lpCurrentDirectory, /运行该子进程的初始目录 LPSTARTUPINFO lpStartupInfo, /创建该子进程的相关参数 LPPROCESS_INFORMATION lpProcess
8、Information /创建后用于被创建子进程的信息 ); 虽然有很多参数,不过在现阶段的实验级别,大多数参数只要用默认值即可。 lpApplicationName:为执行程序的文件名,如果在创建进程时要使用参数,则该参数可以为NULL。 lpCommandLine:为参数行,如果无参数可以为NULL,在有参数传递给进程时如下设置:lpApplicationName=NULL;lpCommandLine=para,例如lpCommandLine="c:windowsnotepad.exe c:autoexec.bat"。 lpProcessAttributes,lpThr
9、eadAttributes:分别描述了创建的进程和线程安全属性,如果使用NULL表示使用默认的安全描述。 bInheritHandles:表示当前进程中的打开的句柄是否能够被创建的子进程所继承。 dwCreationFlags:表示创建标记,通过该标记可以设置进程的创建状态和优先级别。常用的有下面的标记: CREATE_NEW_CONSOLE:为子进程创建一个新的控制台。 CREATE_SUSPENDED:子进程在创建时为挂起状态。 HIGH_PRIORITY_CLASS/NORMAL_PRIORITY_CLASS:高/普通优先级别。 lpEnvironment:表示子进程所使用的环境变量,如
10、果为NULL,则表示与当前进程使用相同的环境变量。 lpCurrentDirectory:表示子进程运行的初始目录。 lpStartupInfo:用于在创建子进程时设置各种属性。该结构定义如下: typedef struct _STARTUPINFO / si DWORD cb; /结构长度 LPTSTR lpReserved; /保留 LPTSTR lpDesktop; /保留 LPTSTR lpTitle; /如果为控制台进程则为显示的标题 DWORD dwX; /窗口位置 DWORD dwY; /窗口位置 DWORD dwXSize; /窗口大小 DWORD dwYSize; /窗口大小
11、 DWORD dwXCountChars; /控制台窗口字符号宽度 DWORD dwYCountChars; /控制台窗口字符号高度 DWORD dwFillAttribute; /控制台窗口填充模式 DWORD dwFlags; /创建标记 WORD wShowWindow; /窗口显示标记如同ShowWindow中的标记 WORD cbReserved2; / LPBYTE lpReserved2; / HANDLE hStdInput; /标准输入句柄 HANDLE hStdOutput; /标准输出句柄 HANDLE hStdError; /标准错误句柄 STARTUPINFO, *L
12、PSTARTUPINFO; 如果要使结构中相关的分量起作用,必须正确的设置dwFlags。例如:dwFlags包含STARTF_USESIZE表示dwXSize和dwYSize有效,包含STARTF_USEPOSITION表示dwX和dwY有效。 lpProcessInformation:用来在进程创建后接收相关信息,该结构由系统填写。 typedef struct _PROCESS_INFORMATION / pi HANDLE hProcess; /进程句柄 HANDLE hThread; /进程的主线程句柄 DWORD dwProcessId; /进程ID DWORD dwThreadI
13、d; /进程的主线程ID PROCESS_INFORMATION;2)实验准备要实验的Windows下的多线程实验,应做如下准备:a) 在新建中选”Win32 Console Application”的An empty projectb) 选”工程”的”设置”选项,在”设置”中选择“C/C+”标签,在”Project Option”中,将”MLd”参数改成“MTd”(如图1)。图1 选项以上两步对实验成功至关重要,否则,即是代码无误,在连接时同样会出现问题。3)Windows下进程的创建Windows的进程和线程模型被描述成“多进程,基于单进程的多线程”。在创建一个线程时,Windows会做大
14、量的工作-创建一个新的地址空间,为进程分配资源以及创建一个基线程。在Windows下,当使用CreateProcess去执行相应的功能时,只要去改变cmdLine中的内容即可,其它的参数使用默认值,具体见代码1:代码1执行的功能是从命令行中启动这个名叫的launch的测试程序,在launch后面应加上保存有需要打开程序路径的文件名:如在命令行中键入: >launch set.txt而set.txt中的内容为:C:WINDOWSSYSTEM32CALC.EXEC:WINDOWSSYSTEM32NOTEPAD.EXE NEW.TXTC:WINDOWSSYSTEM32CHARMAP.EXE路径
15、的前半部分为”C:WINDOWS”,这当然要视你的Windows系统的类型以及系统盘的存放位置而定。如果是NT或2000的机器,则应使用WINNT./*测试程序1: 示例如何使用进程的launch程序,通过在命令行中加载相应的命令文件,去按照命令文件中指定的程序路径打开相应的程序去执行*/测试程序(仅供参考)#include <windows.h>#include <stdio.h>#include <string.h>#define MAX_LINE_LEN 80int main(int argc,char* argv)/local variablesFI
16、LE* fid;char cmdLineMAX_LINE_LEN;/CreateProcess parametersLPSECURITY_ATTRIBUTES processA=NULL;/DefaultLPSECURITY_ATTRIBUTES threadA=NULL;/DefaultBOOL shareRights=TRUE;/DefaultDWORD creationMask=CREATE_NEW_CONSOLE;/Window per process.LPVOID enviroment=NULL;/DefaultLPSTR curDir=NULL;/DefaultSTARTUPINF
17、O startInfo;/ResultPROCESS_INFORMATION procInfo;/Result/1.Read the command line parametersif(argc!=2)fprintf(stderr,"Usage:lanch<launch_set_filename>n");exit(0);/2.Open a file that coutain a set of commandsfid=fopen(argv1,"r");/3.For every command in the launch filewhile(fg
18、ets(cmdLine,MAX_LINE_LEN,fid)!=NULL)/ Read a command from the fileif(cmdLinestrlen(cmdLine)-1='n')cmdLinestrlen(cmdLine)-1='0'/Remove NEWLINE/Create a new process to execute the commandZeroMemory(&startInfo,sizeof(startInfo);startInfo.cb=sizeof(startInfo);if(!CreateProcess(NULL,/
19、File name of executablecmdLine,/command lineprocessA,/Process inherited securitythreadA, /Thread inherited securityshareRights,/Rights propagationcreationMask,/various creation flagsenviroment,/Enviroment variablecurDir, /Child's current directory&startInfo,&procInfo )/endof iffprintf(st
20、derr,"CreatProcess failed on error %dn",GetLastError();ExitProcess(0); /Terminate after all commands have finished.return 0;通过上面这段极其简洁的代码,完成了看似有些难度的任务,让我们充分感受到采用一些高级的编程手段所带来的便捷与高效。3. 在上述实验2的基础上利用Windows提供的与进程相关的API函数,编写程序,实现创建进程、运行指定程序和终止进程(如创建写字板或者画图进程及终止该进程)。要求:有交互界面(命令方式或图形界面方式,推荐使用图形界面
21、的交互),如:输入1创建进程,提示输入指定程序的路径创建对应的进程,并输出显示进程的相关信息;输入2关闭该进程;输入0退出程序。 注:与进程和线程相关的Windows API (1) CancelWaitableTimer 这个函数用于取消一个可以等待下去的计时器操作 (2) CallNamedPipe 这个函数由一个希望通过管道通信的一个客户进程调用 (3) ConnectNamedPipe 指示一台服务器等待下去,直至客户机同一个命名管道连接 (4) CreateEvent 创建一个事件对象 (5) CreateMailslot 创建一个邮路。返回的句柄由邮路服务器使用(收件人) (6)
22、CreateMutex 创建一个互斥体(MUTEX) (7) CreateNamedPipe 创建一个命名管道。返回的句柄由管道的服务器端使用 (8) CreatePipe 创建一个匿名管道 (9) CreateProcess 创建一个新进程(比如执行一个程序) (10) CreateSemaphore 创建一个新的信号机 (11) CreateWaitableTimer 创建一个可等待的计时器对象 (12) DisconnectNamedPipe 断开一个客户与一个命名管道的连接 (13) DuplicateHandle 在指出一个现有系统对象当前句柄的情况下,为那个对象创建一个新句柄 (1
23、4) ExitProcess 中止一个进程 (15) FindCloseChangeNotification 关闭一个改动通知对象 (16) FindExecutable 查找与一个指定文件关联在一起的程序的文件名 (17) FindFirstChangeNotification 创建一个文件通知对象。该对象用于监视文件系统发生的变化 (18) FindNextChangeNotification 重设一个文件改变通知对象,令其继续监视下一次变化 (19) FreeLibrary 释放指定的动态链接库 (20) GetCurrentProcess 获取当前进程的一个伪句柄 (21) GetCu
24、rrentProcessId 获取当前进程一个唯一的标识符 (22) GetCurrentThread 获取当前线程的一个伪句柄 (23) GetCurrentThreadId 获取当前线程一个唯一的线程标识符 (24) GetExitCodeProces 获取一个已中断进程的退出代码 (25) GetExitCodeThread 获取一个已中止线程的退出代码 (26) GetHandleInformation 获取与一个系统对象句柄有关的信息 (27) GetMailslotInfo 获取与一个邮路有关的信息 (28) GetModuleFileName 获取一个已装载模板的完整路径名称 (
25、29) GetModuleHandle 获取一个应用程序或动态链接库的模块句柄 (30) GetPriorityClass 获取特定进程的优先级别 (31) GetProcessShutdownParameters 调查系统关闭时一个指定的进程相对于其它进程的关闭早迟情况 (32) GetProcessTimes 获取与一个进程的经过时间有关的信息 (33) GetProcessWorkingSetSize 了解一个应用程序在运行过程中实际向它交付了多大容量的内存 (34) GetSartupInfo 获取一个进程的启动信息 (35) GetThreadPriority 获取特定线程的优先级别
26、 (36) GetTheardTimes 获取与一个线程的经过时间有关的信息 (37) GetWindowThreadProcessId 获取与指定窗口关联在一起的一个进程和线程标识符 (38) LoadLibrary 载入指定的动态链接库,并将它映射到当前进程使用的地址空间 (39) LoadLibraryEx 装载指定的动态链接库,并为当前进程把它映射到地址空间 (40) LoadModule 载入一个Windows应用程序,并在指定的环境中运行 (41) MsgWaitForMultipleObjects 等侯单个对象或一系列对象发出信号。如返回条件已经满足,则立即返回 (42) Set
27、PriorityClass 设置一个进程的优先级别 (43) SetProcessShutdownParameters 在系统关闭期间,为指定进程设置他相对于其它程序的关闭顺序 (44) SetProcessWorkingSetSize 设置操作系统实际划分给进程使用的内存容量 (45) SetThreadPriority 设定线程的优先级别 (46) ShellExecute 查找与指定文件关联在一起的程序的文件名 (47) TerminateProcess 结束一个进程 (48) WinExec 运行指定的程序5.进程调度模拟编写程序完成单处理机系统中的进程调度,要求采用先来先服务算法、最
28、短CPU运行期优先调度算法、优先级调度算法、多级反馈队列轮转算法。实验具体包括:首先确定进程控制块的内容和进程控制块的组织方式;然后完成进程创建原语和进程调度原语;最后编写主函数对所做工作进行测试。1)实验提示与讲解这个实验主要需要考虑三个问题:如何组织进程、如何创建进程和如何实现处理器调度。考虑如何组织进程,首先就要设定进程控制块的内容。进程控制块PCB记录各个进程执行时的情况。不同的操作系统,进程控制块记录的信息内容不一样。操作系统功能越强,软件也越庞大,进程控制块记录的内容也就越多。这里的实验只是用了必不可少的信息。一般操作系统中,无论进程控制块中信息量多少,信息都可以大致分为以下四类:
29、标识信息每个进程都要有一个唯一的标识符,用来标识进程的存在和区别于其他进程。这个标识符是必不可少的,可以用符号或编号实现,它必须是操作系统分配的。在后面给出的参考程序中,采用编号方式,也就是为每个进程依次分配一个不相同的正整数。说明信息用于记录进程的基本情况,例如进程的状态、等待原因、进程程序存放的位置、进程数据存放位置等等。实验中,因为进程没有数据和程序,仅使用进程控制块模拟进程,所以这部分内容仅包括进程状态。现场信息现场信息记录各个寄存器的内容。当进程由于某种原因让出处理器时,需要将现场信息记录在进程控制块中,当进行进程调度时,从选中进程的进程控制块中读取现场信息进行现场恢复。现场信息就是
30、处理器的相关寄存器内容,包括通用寄存器、程序计数器和程序状态字等。在实验中,可选取几个寄存器作为代表。用大写的全局变量AX、BX、CX、DX模拟通用寄存器、大写的全局变量PC模拟程序计数器、大写的全局变量PSW模拟程序状态字。管理信息管理信息记录进程管理和调度的信息。例如进程优先数、进程队列指针等。实验中,仅包括队列指针。因此,可将进程控制块结构定义如下:struct pcb int name; /进程标识符 int status; /进程状态 int AX,BX,CX,DX; /进程现场信息,通用寄存器内容 int PC; /进程现场信息,程序计数器内容 int PSW; /进程现场信息,程
31、序状态字内容 int next; /下一个进程控制块的位置 确定进程控制块内容后,要考虑的就是如何将进程控制块组织在一起。多道程序设计系统中,往往同时创建多个进程。在单处理器的情况下,每次只能有一个进程处于运行态、其他的进程处于就绪状态或等待状态。为了便于管理,通常把处于相同状态的进程的进程控制块链接在一起。单处理器系统中,正在运行的进程只有一个。因此,单处理器系统中进程控制块分成一个正在运行进程的进程控制块、就绪进程的进程控制块组织成的就绪队列和等待进程的进程控制块组成的等待队列。由于实验模拟的是进程调度,没有对等待队列的操作,所以实验中只有一个指向正在运行进程的进程控制块指针和一个就绪进程
32、的进程控制块队列指针。操作系统的实现中,系统往往在主存中划分出一个连续的专门区域存放系统的进程控制块,实验中应该用数组模拟这个专门的进程控制块区域,定义如下:#define n 10 /假定系统允许进程个数为10struct pcb pcbarean; /模拟进程控制块区域的数组这样,进程控制块的链表实际上是数据结构中使用的静态链表。进程控制块的链接方式可以采用单向和双向链表,实验中,进程控制块队列采用单向不循环静态链表。为了管理空闲进程控制块,还应该将空闲进程控制块链接成一个队列。实验示例程序中采用时间片轮转调度算法,这种算法是将进程控制块按照进入就绪队列的先后次序排成队列。关于就绪队列的操
33、作就是从队头摘下一个进程控制块和从队尾挂入一个进程控制块。因此为就绪队列定义两个指针,一个头指针,指向就绪队列的第一个进程控制块;一个尾指针,指向就绪队列的最后一个进程控制块。实验中指向运行进程的进程控制块指针、就绪队列指针和空闲进程控制块队列指针定义如下:int run; /定义指向正在运行进程的进程控制块的指针struct int head; int tail; ready; /定义指向就绪队列的头指针head和尾指针tailint pfree; /定义指向空闲进程控制块队列的指针以上是如何组织进程,下面考虑如何创建进程。进程创建是一个原语,因此在实验中应该用一个函数实现,进程创建的过程应
34、该包括:申请进程控制块:进程控制块的数量是有限的,如果没有空闲进程控制块,则进程不能创建,如果申请成功才可以执行第二步;申请资源:除了进程控制块外,还需要有必要的资源才能创建进程,如果申请资源不成功,则不能创建进程,并且归还已申请的进程控制块;如果申请成功,则执行第三步,实验无法申请资源,所以模拟程序忽略了申请资源这一步;填写进程控制块:将该进程信息写入进程控制块内,实验中只有进程标识符、进程状态可以填写(模拟进程创建时,需输入进程标识符,进程标识符本应系统建立,并且是唯一的,输入时注意不要冲突),刚创建的进程应该为就绪态,然后转去执行第四步;挂入就绪队列:如果原来的就绪队列不为空,则将该进程
35、控制块挂入就绪队列尾部,并修改就绪队列尾部指针;如果原来就绪队列为空,则将就绪队列的头指针、尾指针均指向该进程控制块,进程创建完成。 进程创建流程图如图1所示。NYYN开始空闲进程控制块队列为空?取空闲进程控制块队列的第一个i=pfreepfree后移:pfree=pcbareapfree.next填写该进程控制块的内容:=name;pcbareai.status=aready;初始化进程控制块内的现场信息;就绪队列为空?挂入就绪队列:pcbareaready.tail.next=i;ready.tail=i;pcbareaready.tail.next=-1;结束进
36、程创建失败挂入就绪队列:ready.head=i;ready.tail=i;pcbareaready.tail.next=-1;图1 进程创建流程图多道程序设计的系统中,处于就绪状态的进程往往有多个,它们都要求占用处理器,可是单处理器系统的处理器只有一个,进程调度就是解决这个处理器竞争问题的。进程调度的任务就是按照某种算法从就绪进程队列中选择一个进程,让它占有处理器。因此,进程调度程序就应该包括两部分,一部分是在进程就绪队列中选择一个进程,并将其进程控制块从进程就绪队列中摘下来,另一部分工作就是分配处理器给选中的进程,也就是将指向正在运行进程的进程控制块指针指向该进程的进程控制块,并将该进程的
37、进程控制块信息写入处理器的各个寄存器中。实验参考程序中采用时间片轮转调度算法,这种算法让就绪进程按就绪的先后次序排成队列,每次总是选择就绪队列中的第一个进程占有处理器,但是规定只能使用一个“时间片”。采用时间片轮转调度算法的进程调度流程图如图2所示。NYYN开始就绪队列为空?就绪队列头指针赋给i:i= ready.head就绪队列头指针后移:ready.head =pcbareaready.head.next就绪队列队尾指针置为空:ready.tail=-1就绪队列为空?设置相对时钟寄存器:TIME=时间片无进程可以调度修改进程控制块状态:pcbareai.status=running图2 进
38、程调度流程图恢复该进程现场信息:AX=ax;BX=bx;CX=cx;DX=dx;PC=pc;PSW=psw;修改指向运行进程的指针:run=i完成上述功能后,编写主函数进行测试:首先建立一个就绪队列,手工输入信息建立几个进程;然后进行进程调度;最后将指向正在运行进程的指针指向的进程控制块内容输出,察看结果。2)参考程序 #include “stdio.h”#define running 1 / 用running表示进程处于运行态#define aready 2 / 用aready表示进程处于就绪态#define blocking 3 / 用blocking表示进程处于阻塞态#define so
39、metime 5 / 用sometime表示时间片大小#define n 10 /假定系统允许进程个数为nstruct int name; /进程标识符 int status; /进程状态 int ax,bx,cx,dx /进程现场信息,通用寄存器内容 int pc /进程现场信息,程序计数器内容 int psw; /进程现场信息,程序状态字内容 int next; /下一个进程控制块的位置pcbarean; /模拟进程控制块区域的数组int PSW, AX,BX,CX,DX , PC ,TIME /模拟寄存器int run; /定义指向正在运行进程的进程控制块的指针struct int head; int tail;ready; /定义就绪队列的头指针head和尾指针tailint pfree; /定义指向空闲进程控制块队列的指针scheduling( ) /进程调度函数 int i; if (ready.head=-1) /空闲进程控制块队列为空,退出 prin
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年广东体育职业技术学院高职单招(数学)历年真题考点含答案解析
- 2025年川南幼儿师范高等专科学校高职单招职业适应性测试历年(2019-2024年)真题考点试卷含答案解析
- 2025年山东艺术设计职业学院高职单招高职单招英语2016-2024历年频考点试题含答案解析
- 2025年山东电子职业技术学院高职单招职业技能测试近5年常考版参考题库含答案解析
- 2025年安康职业技术学院高职单招高职单招英语2016-2024历年频考点试题含答案解析
- 2025年天津工艺美术职业学院高职单招高职单招英语2016-2024历年频考点试题含答案解析
- 精神障碍治疗护理
- Excel知识课件教学课件
- CAD与CAM基本知识课件
- 苏美风景如画
- 醉里乾坤大壶中日月长-初中语文九年级第六单元名著导读《水浒传》整本书阅读精读研讨课 公开课一等奖创新教学设计
- 小学综合实践活动《我的问卷我设计-综合实践方法指导课》课件
- DL∕T 5767-2018 电网技术改造工程工程量清单计价规范
- 03D201-4 10kV及以下变压器室布置及变配电所常用设备构件安装
- 基于plc的步进电机控制系统设计
- 卫生统计学题库+答案
- 帕金森病-课件
- MOOC 通信原理-南京邮电大学 中国大学慕课答案
- 烟道改造居民同意协议书
- 2023年《房屋建筑学》考试复习题库大全(含答案)
- 征地拆迁培训班课件
评论
0/150
提交评论