




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 操作系统课程设计报告院(系): 计算机工程学院 专业: 计算机科学与技术专业 学生姓名: 班级:计算073 学号: 题目: 仿真模拟银行家算法对死锁的避免 起迄日期: 2010-7-6至2010-7-16 设计地点: 2号实验楼402 指 导 教 师: 20092010年度 第 2 学期完成日期: 2010 年 7 月 16 日一、 课程设计目的操作系统是一门重要的专业基础课,是涉及较多硬件知识的计算机系统软件课程。在计算机软硬件课程的设置上,它起着承上启下的作用。操作系统对计算机系统资源实施管理,是所有其他软件与计算机硬件的唯一接口,所有用户在使用计算机时都要得到操作系统提供的服务。操作系
2、统课程设计的主要任务是研究计算机操作系统的基本原理和算法,掌握操作系统的进程管理、存储管理、文件管理和设备管理的基本原理与主要算法。目的是使学生掌握常用操作系统(如DOS、Windows或Linux)的一般管理方法,了解它是如何组织和运作的,对操作系统的核心概念和算法有一个透彻的理解,并对系统运行的机制有一个全面的掌握,从而充分理解系统调用与程序设计之间的关系。二、 课程设计内容 仿真模拟银行家算法对死锁的避免。对于进程死锁的避免问题,分为两种状态:安全状态和非安全状态。在避免死锁的方法中,允许进程动态地申请资源分配之前,应先计算此次资源分配的安全性。若此次分配不会导致系统进入不安全状态,则将
3、资源分配给进程;否则,令进程等待。所谓安全状态是指系统能按某种进程顺序,来为每个进程pi分配所需的资源,直至满足每个进程对资源的最大需求,使每个进程都可顺利地完成。如果系统无法找到这样一个序列,则系统处于不安全状态。只要系统处于安全状态,系统便可避免进入死锁状态。因此避免死锁的实质在于:系统在进行资源分配时,如何使系统不进入不安全状态。银行家算法就是一种最有代表性的避免死锁的算法。三、 系统分析与设计1、系统分析系统分析的主要任务是将在系统详细调查中所得到的文档资料集中到一起,对组织内部整体管理状况和信息处理过程进行分析。目的是将用户的需求及其解决方法确定下来,这些需要确定的结果包括:开发者关
4、于现有组织管理状况的了解;用户对信息系统功能的需求;数据和业务流程;管理功能和管理数据指标体系;新系统拟改动和新增的管理模型等等。系统分析所确定的内容是今后系统设计、系统实现的基础。根据银行家算法,设计这个银行家算法的模拟系统。算法中涉及到进程的个数,资源的种类。进程当前占有的资源保存在数组allocation中,需要的资源数目need数组中。用户添加进程数目,并且设置每个进程对于每一类资源的占有情况和需要情况,还可以设置每一类资源的库存容量。根据算法,找出安全序列,如果不存在安全序列的话,会显示安全序列不存在。2、系统设计程序是利用java语言编写的,直接调用java中的GUI接口进行界面的
5、设计。设计出两个窗口,一个主窗口,一个执行算法并且将结果显示的对话框。涉及到java中的JFrame 、JPanel、JDialog主要是这三个。其中面板类用到了最多的。下面将这两个窗口的任务叙述如下:1、对于主窗口,包括添加进程的功能、设置每个进程的Allocation的数目、设置Available的数值。可以设置每个进程的Request的情况。(1)添加进程的功能。利用了一个JtextField 输入进程的名字。利用JcomboBox选择各个给进程所需要的资源的最大数目。利用按钮添加监听器实现添加功能。如果进程名字没有添加的话,默认是:进程+序号。(2)设置Allocation。与上面的基
6、本相同。利用了一个JtextField 输入进程的名字。利用JcomboBox选择各个给进程所占有的各类资源的数目。利用按钮添加监听器实现添加功能。如果没有见输入进程的名字,功能不能执行。根据算法,所占有的各类的资源的数目不能超过给进程所需要的各类资源的最大数目。否则不会执行。(3)设置Request。功能执行的时候,用JtextField 输入进程的名字。利用JcomboBox选择各个给进程所申请的各类资源的数目。利用按钮添加监听器实现添加功能。如果没有见输入进程的名字,功能不能执行。根据算法,所申请的各类的资源的数目不能超过给进程所需要的数目,即不能超过Need中的数目。如果满足的话,还必
7、须检查是否超过了Available中的数目。只有这两个条件同时满足了,才能够继续执行。2、对于另一个窗口,主要是通过内部类来实现的。这个窗口相当于主窗口中的一个变量。这个窗口实现了算法和显示结果。(1)显示Request后的各个变量的结果。利用Jlist控件将结果显示。因为使用的是内部类,所以可以自由调用外部的变量。(2)显示执行算法后的结果。同样也是利用Jlist控件将结果显示。执行算法的时候,先将数据的字符串形式转化为数字形式。然后根据银行家算法执行,查找到安全序列。将结果显示。3、设计的过程,填入了两个实例。一个是正确的存在安全序列的实例。一个是不存在安全序列的实例。3、模块设计:程序的
8、设计主要有两个模块,分别是设置数值和检查安全性序列模块。对于设置数值模块,主要有添加进程、清空进程、进程申请资源(即,Request资源)。对于检查安全性序列就是执行银行家算法。程序运行的时候,先是设置数据,通过点击添加进程、设置Allocation和Request的值来设置数据。在点击“执行算法”,弹出对话框显示申请资源后的结果。在点击对话框中的执行算法按钮进行查找安全序列。其中涉及的数据结构和模块调用图如下:1、对于设置数值模块(包括添加进程、清空进程、申请资源)用到的数据结构是一个类:public class MyJlist extends JFrame implements Actio
9、nListenerprivate JTextField current_text=new JTextField();/添加到标签(当前进程资源非配情况:)之后,添加到容器panel1的中间private JList threadName_list;/显示添加的进程名字private JList max_resource1_list;/显示各个进程所用到的资源1的最大数量private String max_resource1_list_num=new String10;/存储各个进程所用到的资源1的最大数量private JList max_resource2_list;/显示各个进程所用到的
10、资源2的最大数量private String max_resource2_list_num=new String10;/存储各个进程所用到的资源2的最大数量private JList max_resource3_list;/显示各个进程所用到的资源3的最大数量private String max_resource3_list_num=new String10;/存储各个进程所用到的资源3的最大数量private JList allocation_resource1_list;/显示各个进程所占有的资源1的数量private String allocation_resource1_list_nu
11、m=new String10;/存储各个进程所占有的资源1的数量private JList allocation_resource2_list;/显示各个进程所占有的资源2的数量private String allocation_resource2_list_num=new String10;/存储各个进程所占有的资源2的数量private JList allocation_resource3_list;/显示各个进程所占有的资源3的数量private String allocation_resource3_list_num=new String10;/存储各个进程所占有的资源3的数量priv
12、ate JList need_resource1_list;/显示各个进程所需要的资源1的数量private String need_resource1_list_num=new String10;/存储各个进程所需要的资源1的数量private JList need_resource2_list;/显示各个进程所需要的资源2的数量private String need_resource2_list_num=new String10;/存储各个进程所需要的资源2的数量private JList need_resource3_list;/显示各个进程所需要的资源3的数量private Strin
13、g need_resource3_list_num=new String10;/存储各个进程所需要的资源3的数量private JList available_resource1_list;/显示资源1的库存数量private String available_resource1_list_num=new String10;/存储资源1的库存数量private JList available_resource2_list;/显示资源2的库存数量private String available_resource2_list_num=new String5;/存储资源2的库存数量private J
14、List available_resource3_list;/显示资源3的库存数量private String available_resource3_list_num=new String7;/存储资源3的库存数量private JTextField add_ThreadName;/添加的进程的名字private String name_num_add_ThreadName=new String10;/存储所要添加的进程的名字2、对于执行银行家算法的所用到的数据结构是一个内部类:class ComputeDialog extends JDialog implements ActionList
15、ener/银行家算法所用的变量private int work=new int103;private int need=new int103;private int allocation=new int103;/以下是显示申请资源后进程和资源中类的情况private JList threadName0_list;private JList max0_resource1_list;private JList max0_resource2_list;private JList max0_resource3_list;private JList need0_resource1_list;privat
16、e JList need0_resource2_list;private JList need0_resource3_list;private JList allocation0_resource1_list;private JList allocation0_resource2_list;private JList allocation0_resource3_list;private JList available0_resource1_list;private JList available0_resource2_list;private JList available0_resource
17、3_list;/以下显示利用银行家算法执行后的各个进程和资源的结果private JList threadName1_list;private JList max1_resource1_list;private String max1_resource1_list_num=new Stringnum_add_ThreadName;private JList max1_resource2_list;private String max1_resource2_list_num=new Stringnum_add_ThreadName;private JList max1_resource3_lis
18、t;private String max1_resource3_list_num=new Stringnum_add_ThreadName;private JList need1_resource1_list;private String need1_resource1_list_num=new Stringnum_add_ThreadName;private JList need1_resource2_list;private String need1_resource2_list_num=new Stringnum_add_ThreadName;private JList need1_re
19、source3_list;private String need1_resource3_list_num=new Stringnum_add_ThreadName;private JList allocation1_resource1_list;private String allocation1_resource1_list_num=new Stringnum_add_ThreadName;private JList allocation1_resource2_list;private String allocation1_resource2_list_num=new Stringnum_a
20、dd_ThreadName;private JList allocation1_resource3_list;private String allocation1_resource3_list_num=new Stringnum_add_ThreadName;private JList available1_resource1_list;private String available1_resource1_list_num=new Stringnum_add_ThreadName;private JList available1_resource2_list;private String a
21、vailable1_resource2_list_num=new Stringnum_add_ThreadName;private JList available1_resource3_list;private String available1_resource3_list_num=new Stringnum_add_ThreadName;private JList finish_list;private String finish=new Stringnum_add_ThreadName;private JTextField safe_arry;/显示安全序列3、整个程序主要就是两部分,在
22、主窗口部分由添加进程、清空进程、进程实例、申请资源、设置进程当前资源的占有情况、设置资源的库存情况、执行算法。 主窗口添加进程清空进程选择进程申请资源设置当前各个资源的拥有量执行算法弹出窗体显示申请资源后的结果执行银行家算法4、数据结构说明:程序分为两个模块,其中第一个模块涉及到添加进程、清空进程、设置Allocation、申请资源等等。第二个模块涉及到将申请资源的结果显示、执行银行家算法。对于这两个模块的实现主要通过两个类来实现的。(1)第一个模块是类public class MyJlist来实现的,因为用的编程语言是JAVA,所以程序对于各种功能是显示是通过给按钮添加事件监听器来实现的,即
23、add_button.addActionListener(this);/用来实现添加进程allocation_button.addActionListener(this);/用来设置对应进程的当前各类资源的占有情况request_button.addActionListener(this);/用来实现进程对资源的申请available_button.addActionListener(this);/用来设置当前各类资源的当前的数clear_button.addActionListener(this);/清空各个进程的记录example1_button.addActionListener(thi
24、s);/实例1example2_button.addActionListener(this);/实例2check_safe_arry.addActionListener(this);/执行算法,弹出对话框(2)第二个模块的实现通过一个内部类:class ComputeDialog extends JDialog implements ActionListener,与第一模块类似,该模块的功能的实现也是通过按钮添加事件监听器来实现的。check_safe_button.addActionListener(this);/实现银行算法,查找到安全序列。查/不到的时候,显示安全序列不存在。safe_a
25、rry.setText(安全序列不存在!);/安全序列不存在的时候,设置为此文本对于模块在程序中的作用,第一个模块是主体,第二个模块是在第一个模块的基础上实现的。5、算法流程图:1、第一个模块中涉及添加、清空、设置Allocation、设置Available。(1)主程序初始化。开始num_add_ThreadName=0;各个进程的max中资源赋值为空各个进程的Allocation中资源赋值为空各个进程的need中资源赋值为空设置Available中的数值初始化结束(2)添加功能添加开始获取控件数值,并赋值。显示添加的进程及其资源其情况结束(3)清空功能清空开始执行初始化清空结束(4)设置A
26、llocation开始获取进程的名字根据进程的名字,修改对应的资源情况进程存在?是填写进程名字否结束(5)设置Available。开始获取控件的数值修改数值结束(6)设置Request开始获取进程的名字进程存在?是填写进程名字否结束Request=need&Request=Available满足进程需求否是2、第二模块主要是实现银行家算法:loop控制循环次数,超过指定次数,说明没有安全序列开始work=available;i=0;i进程数?finishi=false;i+;是否i=0;loop=0;i=进程数?loop+;i=-1;是loop进程?数?是i+;finishi=false?&n
27、eedwork否worki=worki+allocationifinishi=truei+结束是否否四、模块调试与系统测试1、模块调试l 输入的形式和输入值的范围程序的输入过程主要在主窗体中,对于进程名,可以使用任意字符,但是对于进程的名字不能重复。如果没有填写进程的名字,程序默认这个进程的名字是:进程+当前的进程数目。所添加的进程数目不能超过10个进程。对于进程共享的资源,一共有三类,但是每一类的资源总数不能超过10个。资源的最大剩余量是10。l 输出的形式数据的显示在主窗口中和子窗口中都可以显示。将所有数据填写好后,单击按钮,会在主窗口中显示出所显示的数据。点击“执行算法”按钮就会弹出一个
28、对话框,显示数据。对话框中点击按钮“检查安全性”,执行银行家算法,将结果显示在对话框中。l 程序所能达到的功能程序功能:1、添加进程及其最大资源。点击添加按钮进行添加,添加的进程的名字不能重复。2、给每一个进程的Allocation进行修改。点击Allocation按钮,会显示当前修改的进程中的资源情况。3、清空所有记录。点击“清空”按钮,一切都会初始化。4、提供了两个实例。点击按钮“实例1”,显示实例1的所有进程及其资源的分布情况。同样的点击“实例2”。4、修改Available的数值。点击按钮“Available”,显示修改当前各个资源的剩余量。2、系统测试测试的数据依照课本上的例子来写:
29、资源进程MaxAllocationNeedAvailable1类 2类 3类1类 2类 3类1类 2类 3类1类 2类 3类p07 5 30 1 07 4 33 3 2p13 2 22 0 01 2 2p19 0 23 0 26 0 0p32 2 22 1 10 1 1p44 3 30 0 24 3 1操作过程及其结果如下:操作步骤数据输入操作过程预期结果实际结果结论1输入进程名字;选取各类资源对应的数目点击添加按钮结果显示在列表框中结果显示在列表框中程序正确执行2在Request中写上进程名p1选取资源为1,0,2点击按钮Request进程的p1的相应数值改变进程的p1的相应数值改变程序正确
30、执行3在Available中写资源为3,3,2点击按钮Available列表中相应的数值改变列表中相应的数值改变程序正确执行4点击执行算法按钮显示假定分配对话框显示假定分配对话框程序正确运行5点击检查安全性按钮得到安全序列安全序列输出并显示程序正确执行6在Request中写上进程名p4选取资源为3,3,0点击按钮Request弹出对话框,提示不能分配资源弹出对话框,提示不能分配资源程序正确执行7在Request中写上进程名p0选取资源为0,2,0点击按钮Request进程的p0的相应数值改变进程的p0的相应数值改变程序正确执行8点击执行算法按钮显示假定分配对话框显示假定分配对话框程序正确执行9
31、点击检查安全性按钮安全序列不存在显示安全序列不存在程序正确执行10关闭对话框相应的数值恢复为假定分配之前的数据相应的数值恢复为假定分配之前的数据程序正确执行3、调试分析:(1)程序测试的时候,发现在执行了银行家算法后,只要进程超过3个很容易死机。即使不超过3个也会死机。经过对按钮事件处理的书写仔细检查,才发现程序中控制循环从0开始的变量i的数值有问题。当一次循环结束后,再进行下一轮循环的时候,i的数值为1,越过了0,以至于程序死机。将其修改为-1之后,就没有问题了。(2)对java中的控件的使用非常麻烦,在使用控件Jlist的时候,直接添加到容器中,程序运行的时候会改变大小。后来从网上查询到了
32、控件的正确使用方法,就是将控件添加到JscrollPane中,在将JscrollPane添加到容器中。(3)对于Jcombobox的使用也是非常的麻烦,程序中有有一个清空功能,使用了之后必须将控件的数据都要清掉。于是使用了控件的removeallitem()函数,但是一旦调用这个函数的时候,程序中的图形的布局就要发生变化。通过查资料得知,对于控件Jcombobox的使用,如果使用函数去掉它的所有数据,会造成整个图形的布局变化,这是不可避免的。因为我使用的容器的布局管理器是使用的BorderLayout而不是FlowLayout。最后,我只能换为JtxtField这个文本编辑控件。(4)对于程序
33、中的变量的赋值,特别是对于那些没有固定长度的变量赋值是个困难问题。开始的时候,我为每一个资源的数目都定义了一个计数变量。但是这样的做的结果就是程序出错,最后我改用了一个变量,那就是程序中的进程数目的变量。这样将变量统一了之后,程序的运行不会出错了而且还会简洁了变量。五、用户手册1.、本程序的运行环境是MyEclipse环境,使用的编程语言是Java语言,操作系统是Windows Xp操作系统。2、程序无需安装,只需要安装了MyEclipse即可。3、程序使用之前,在MyEclipse中建立一个Java工程,在工程中建立一个MyJlist类,将代码粘贴到其中,直接运行即可。点击编译器中运行按钮,
34、程序中出现如下情况:(1)程序运行:从截图中可以看出,目前系统的进程数目是0,即没有进程。当前各个控件的情况是空,这是一个初始化状态。当前程序中有三类资源,默认数值为10、5、7(2)在标签“添加进程:”所对应的这一列中进行添加进程。在“进程名:”右面的编辑框中输入进程的名字,如p1。在往下,选择每一类资源的该进程所用到的资源的最大数目。如可以选择进程所需要的三类资源的数目都为5。这样方便一些。设置完之后,直接点击下面的按钮“添加”即可。这样进程p1就直接添加到了系统中。此时后,“目前系统中的进程数目为:”后面显示为1。具体的操作如下图所示:依照以上的过程,再添加一些进程到系统中。(3)在标签
35、“Allocation”所对应的这一列中,是用来设置每个进程的当前所占有的资源的数目的。同样的,在标签“选择进程:”标签后面的文本框中填写所要设置的进程的名字。在往下,选择资源的进程的所占有的数量,例如可以设置进程p1当前拥有的三类资源的数目为1,2,3。过程如下图所示:同样,根据上述过程,设置其他的进程的数值。(4)在标签“Request”这一类是用来设置某一个进程是否申请了资源的,进程在执行的过程可以申请资源。例如进程p1可以申请资源的数目为Request(2,2,2)。结果如下图所示:(5)在标签“Available”这一列,设置当前三类资源的剩余数目。可设置为(2,2,2)(6)点击“
36、清空”按钮,结果与程序开始运行的结果是一样的。点击实例1,实例2按钮会出现两个实例。点击执行算法按钮,会出现如下对话框,接着点击对话框中的“检查安全性”按钮就可求出安全序列。六、程序清单程序主要用到了一个类及其内部类:public class MyJlist extends JFrame implements ActionListenerprivate JTextField current_text=new JTextField();/添加到标签(当前进程资源非配情况:)之后,添加到容器panel1的中间/以下变量是为了防止找不到安全序列后,为了恢复进程在没有审请资源的时候的情况private
37、 String request1;/ 申请资源1的数量private String request2;/ 申请资源2的数量private String request3;/ 申请资源3的数量private String available1;/满足申请后的资源1的剩余量private String available2;/满足申请后的资源2的剩余量private String available3;/满足申请后的资源3的剩余量private String need1;/满足申请资源后,资源1的当前需要量private String need2; /满足申请资源后,资源2的当前需要量privat
38、e String need3; /满足申请资源后,资源3的当前需要量private int convert=0;/控制进程中只能有一个进程申请资源private int requestThread;/存储申请资源进程的索引数值,便于恢复进程的情况/以下所有变量都是为了图形的显示private String max_resource1_list_num=new String10;private String max_resource2_list_num=new String10;private String max_resource3_list_num=new String10;private
39、String allocation_resource1_list_num=new String10;private String allocation_resource2_list_num=new String10;private String allocation_resource3_list_num=new String10;private String need_resource1_list_num=new String10;private String need_resource2_list_num=new String10;private String need_resource3_
40、list_num=new String10;private String available_resource1_list_num=new String10;private String available_resource2_list_num=new String5;private String available_resource3_list_num=new String7;private JTextField add_ThreadName;/添加进程的名字文本框private String name_num_add_ThreadName=new String10;private stat
41、ic int num_add_ThreadName;/添加的进程的数目/填写要填写的进程资源的进程的名字private static int index;/存储要修改进程的索引private JButton allocation_button;/Allocaion按钮private JTextField request_thread_name;/申请资源的进程的名字private JButton request_button;/Request按钮private JTextField available_resource1_text;/填写要修改的资源1的剩余数量private JTextFie
42、ld available_resource2_text;private JTextField available_resource3_text;private JButton available_button;/Available按钮private JButton clear_button;/清空按钮private JButton example1_button;/实例1按钮private JButton example2_button;/实例2按钮private JButton check_safe_arry;/执行算法按钮public MyJlist()add_button.addActi
43、onListener(this);/添加按钮添加事件监听器allocation_button.addActionListener(this); /Allocation按钮添加事件监听器request_button.addActionListener(this); /Reques按钮添加事件监听器available_button.addActionListener(this); / Available按钮添加事件监听器clear_button.addActionListener(this); /清空按钮添加事件监听器example1_button.addActionListener(this);
44、 /实例1按钮添加事件监听器example2_button.addActionListener(this); /实例2按钮添加事件监听器check_safe_arry.addActionListener(this); /执行算法按钮添加事件监听器public void actionPerformed(ActionEvent e)/实现功能boolean bool_add=false;String str_add;boolean bool_allocation=false;boolean bool_request=false;if(e.getSource()=add_button)/实现添加进程
45、功能convert=0;if(num_add_ThreadName10)/最多添加10个进程if(add_ThreadName.getText().length()=0)/进程名字为空的处理name_num_add_ThreadNamenum_add_ThreadName=new String(进程+num_add_ThreadName);str_add=new String(进程+num_add_ThreadName);elsename_num_add_ThreadNamenum_add_ThreadName=new String(add_ThreadName.getText();/获取进程
46、名str_add=new String(add_ThreadName.getText();for(int i=0;inum_add_ThreadName;i+)/判断进程名是否重复if(name_num_add_ThreadNamei.equalsIgnoreCase(str_add)bool_add=true;JOptionPane.showMessageDialog(this, 进程名字 已存在!请重新填写。);break;elsebool_add=false;if(!bool_add)/*添加进程并且显示出来*/num_add_ThreadName+;/进程数增加this.repaint
47、();/重画图形elseJOptionPane.showMessageDialog(this, 最多添加10个进程!);if(e.getSource()=allocation_button)convert=0;String middle=new String(String.valueOf(allocation_thread_name.getText();/判断进程的名字是否存在for(int i=0;inum_add_ThreadName;i+)if(name_num_add_ThreadNamei.equalsIgnoreCase(middle)bool_allocation=true;br
48、eak; elsebool_allocation=false;if(bool_allocation)/获取进程的索引数值 for(int i=0;inum_add_ThreadName+1;i+) if(middle.equalsIgnoreCase(name_num_add_ThreadNamei)index=i;break;/根据索引修改对应的进程的数值if(Integer.parseInt(String.valueOf(allocation_resource_combobox1.getSelectedItem()=Integer.parseInt(max_resource1_list_n
49、umindex)&(Integer.parseInt(String.valueOf(allocation_resource_combobox2.getSelectedItem()=Integer.parseInt(max_resource2_list_numindex)&(Integer.parseInt(String.valueOf(allocation_resource_combobox3.getSelectedItem()=Integer.parseInt(max_resource3_list_numindex)/*设置修改后的数值,并且显示在图形中*/this.repaint();/进
50、程申请资源if(e.getSource()=request_button)/存储数值,便于恢复available1=available_resource1_list_num0;available2=available_resource2_list_num0;available3=available_resource3_list_num0;String middle=new String(String.valueOf(request_thread_name.getText();/查找进程名字是否存在for(int i=0;inum_add_ThreadName;i+)if(name_num_ad
51、d_ThreadNamei.equalsIgnoreCase(middle)bool_request=true;break;elsebool_request=false;if(bool_request)/获取进程的索引数值 for(int i=0;inum_add_ThreadName+1;i+)if(middle.equalsIgnoreCase(name_num_add_ThreadNamei)index=i; requestThread=index; /存取数值,便于恢复request1=String.valueOf(allocation_resource1_list_numindexrequest2=String.valueOf(allocation_resource2_list_numindex);request3=String.valueOf(allocation_resource3_list_numindex);need1=String.valueOf(need_resource1_list_numindex);need2=String.valueOf(need
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2020-2025年教师资格之中学物理学科知识与教学能力过关检测试卷B卷附答案
- Brand KPIs for milk:Rude Health in the United Kingdom-英文培训课件2025
- 口腔药品知识培训课件
- 小学生科普通信课件
- 2025年电子竞技赛事赞助策略:品牌合作共赢路径与市场前景
- 2025年新初二英语人教新版尖子生专题复习《阅读理解》
- 小学生硬笔书法长横课件
- 2025年康复医疗服务连锁化运营模式下的区域市场布局与品牌建设策略报告
- 云南建筑设计管理办法
- 企业超限超载管理办法
- T-GDNAS 043-2024 成人静脉中等长度导管置管技术
- DB21T 3496-2021 机电类特种设备检验记录编写指南
- 天猫店铺运营规划方案
- 电气工程及其自动化基础知识单选题100道及答案解析
- 罗茨风机培训资料
- 肿瘤相关静脉血栓栓塞症预防与治疗指南解读
- 会议管理制度例行会议
- (高清版)DB42∕T 2133-2023 建筑施工侧埋式悬挑脚手架技术规程
- 城区供暖规划设计的重要性
- 高频地波雷达现场比测试验规范
- 异地就医备案的个人承诺书
评论
0/150
提交评论