通用处理机调度演示程序操作系统设计报告.doc

上传人:精*** 文档编号:828535 上传时间:2023-09-06 格式:DOC 页数:28 大小:1.95MB
下载 相关 举报
通用处理机调度演示程序操作系统设计报告.doc_第1页
第1页 / 共28页
通用处理机调度演示程序操作系统设计报告.doc_第2页
第2页 / 共28页
通用处理机调度演示程序操作系统设计报告.doc_第3页
第3页 / 共28页
通用处理机调度演示程序操作系统设计报告.doc_第4页
第4页 / 共28页
通用处理机调度演示程序操作系统设计报告.doc_第5页
第5页 / 共28页
点击查看更多>>
资源描述

1、设计文档目录 一、 课程设计目的.3二、 需求分析课程设计内容与要求.3三、 系统分析与设计.33.1 系统分析.33.2 系统设计.5四、 系统测试与调试分析.134.1 系统测试.134.2 调试分析.15五、 用户手册.16六、 程序清单.19七、 体会与自我评价.28八、 参考文献.29九、 课程设计评价.29小组分工:张华建(201107070):界面布局的总体设计,静态优先权选择算法的设计,时间片轮转(RR)算法的设计实现,外部文件的信息读取,手动新建就绪队列的实现,就绪进程队列的实现(DataTable数据与GridView的绑定显示),动态表格Table刷新和实时显示颜色块的功

2、能实现,代码规范整合,Timer定时器的使用。周伟鑫(201107071):先来先服务调度(FCFS)算法,最短时间优先调度(SJF)算法,高响应比优先调度(HRN)算法的实现,各算法对应的数据计算,执行队列和已完成进城队列的信息处理,设计文档的编写。备注:一个系统本就是个统一的整体,不是说是哪个模块单独由某人实现,团队的合作本就是对于出现的问题进行共同探讨和解决,况且选择用.NET来做这次的课设项目本就是一次未知的挑战,我们不会用的功能都需要上网查询,只要是想解决的问题,总能找到方法的。一、 课程设计目的操作系统课程是当代计算机软件系统的核心,是计算机系统的基础和支撑,它管理和控制着计算机系

3、统中的所有软、硬件资源,可以说操作系统是计算机系统的灵魂。操作系统课程是计算机专业学生必须学习和掌握的基础课程, 是计算机应用人员深入了解和使用计算机的必备知识, 是进行系统软件开发的理论基础。操作系统是计算机系统的核心系统软件,它负责控制和管理整个系统的资源并组织用户协调使用这些资源,使计算机高效的工作。此次的课程设计所选的题目为“通用处理机调度演示”,所以通过此次课设能够更加理解操作系统中处理机的工作方式,同时在设计不同算法的过程中,也可以明确的知道各种调度算法的使用优劣,视不同的环境条件下,调用不同的算法可也达到比较想要的结果。通过这次的实际操作系统分析设计、编程调试,掌握系统软件的分析

4、方法和工程设计方法,可以提高运用操作系统知识解决实际问题的能力;锻炼实际的编程能力、创新能力及团队组织、协作开发软件的能力;还能提高调查研究、查阅技术文献、资料以及编写软件设计文档的能力。所以说,一次积极地课程设计可以锻炼我们学生的很多能力,当然初衷还是要方法切实以正确的态度来完成课程设计的前提,希望我们可以收获到自己的能力提升.二、 课程设计内容与要求 1、 课程设计内容:设计目的:在多道程序和多任务系统中,系统内同时处于就绪状态的进程可能有若干个,也就是能运行的进程数大于处理机个数,为了使系统中的进程有条不紊地工作,必须选用某种调度策略,在一定的时机选择一个进程占有处理机。要求学生设计一个

5、模拟处理机调度算法,以巩固和加深处理机调度的概念。2、 课程设计要求(多道、单处理机):(1)进程调度算法包括:时间片轮转算法、先来先服务算法、短作业优先算法、静态优先权优先调度算法、高响应比调度算法。(2)每一个进程有一个PCB,其内容可以根据具体情况设定。(3)进程数、进入内存时间、要求服务时间、作业大小、优先级等均可以在界面上设定。(4)可读取样例数据(要求存放在外部文件中)进行进程数、进入内存时间、时间片长度、作业大小、进程优先级的初始化。(5)可以在运行中显示各个进程的状态:就绪、执行(由于不要求设置互斥资源与进程间的同步关系,故只有两种状态)。(6)采用可视化界面,可在进程调度过程

6、中随时暂停调度,查看当前进程的状态以及相应的阻塞队列。(7)有性能比较功能,可比较同一组数据在不同调度算法下的平均周转时间。(8)具有一定的数据容错性。三、 系统分析与设计1、系统分析通用处理机调度演示系统,需要模拟进程调度的五种算法:先来先服务调度算法,短作业优先调度算法,高响应比优先调度算法,时间片轮转调度算法,静态优先权优先调度算法,时间片轮转算法。每个作业包括多个进程,进程可以并发,每一个进程用一个进程类表示,进程类包含如下信息:PCB名称,进入内存时间,服务时间,状态标志,进程大小,内部PCB标志,进程的优先级。既可以用户自己输入相关进程,又可以读取外部文件,能够比较同一组数据在不同

7、调度算法下的平均周转时间和平均带权周转时间。因为多数信息需要在执行过程中进行数据处理和动态显示,要求直观而规范的呈现演示过程。在系统分析阶段,系统的逻辑结构应从以下三方面全面反映系统的功能与性能:(1)信息。在开始界面,用户可以自行选择进程就绪队列的产生方式,既可以自己创建,也可以读取外部文件。其中进程名称,优先级别,服务时间都是必不可少的,创建之初,会自动读取系统时间作为到达时间,当演示开始之时,会相应的读取系统时间作为开始时间,这些信息都会对运行过程中的响应比发生影响,为后面的信息提取做准备.(2)行为。根据要求,如果自己创建进程,也可自行输入进程名称,服务时间,优先级别等信息,点击“创建

8、新进程”按钮,可以提供动态表格的呈现与否,当未完成进程调度算法,在右下侧的区域,点击数据处理按键显示对应算法的平均周转时间和平均带权周转时间。因为采用的Timer计时器的设置,所以每一秒都会定时刷新界面,进而数据变动的模块都会不断的变化,更加直观的显示进程调度情况。(3)表示。用户可以自行演示,点击相应按钮执行操作,其中的RadioButtonList提供多种选择方式,可以根据自己的需要进行选择。同时,采用的.NET设计使界面更加新颖,Table单元格的实时刷新,可以直观的显示算法的调用过程中各个进程的状况,而且数据不断更新,可自行查阅.系统界面布局展示:WELCOME通用处理机调度演示程序登

9、录账号:登录密码:图3-1-1 开始界面调度算法选择执行进程表算法调度动态演示表样例导入退出程序创建新进程运行演示清除所有进程信息图3-1-2 操作主界面(1)就绪进程队列表已完成进程队列表显示数据 图3-1-3 操作主界面(2)2、系统设计:通用处理机调度演示程序时间片轮转调度静态优先权调度高响应比优先调度短作业优先调度先来先服务调度 图3-2-1 系统设计2.1、模块设计:(1)主程序模块:判断所选择的调度算法数据输入方式读取外部文件自己创建进程进程队列分类数据处理模块平均周转时间平均带权周转时间删除所有进程执行队列就绪队列完成队列 图3-2-2 主程序模块显示图(2)先来先服务调度模块流

10、程: 就绪进程队列显示进程信息根据到达时间将最早到达的进程导入到执行队列将执行完的进程信息,写入完成进程队列中就绪队列有记录?YN开始结束图 3-2-3 先来先服务调度算法处理模块(3)短作业优先调度: 就绪进程队列显示进程信息根据服务时间的长短,将最短的进程调入到执行队列将执行完的进程信息,写入完成进程队列中就绪队列有记录?YN开始结束3-2-4 短作业优先调度算法处理模块 (4)高响应比优先调度:就绪进程队列显示进程信息根据Timer 计时器的设定,计算当前状态下的响应比将执行完的进程信息,写入完成进程队列中就绪队列有记录?将最短的进程调入到执行队列YN开始结束 3-2-5 高响应比优先调

11、度算法处理模块(5)静态优先权调度就绪进程队列显示进程信息根据优先权的大小,将最大优先级别的进程调入到执行队列将执行完的进程信息,写入完成进程队列中就绪队列有记录?NY开始结束 3-2-6 静态优先权优先调度算法处理模块(6)时间片轮转调度算法就绪进程队列显示进程信息根据时间片大小,判断执行时间将执行队列的进程信息,写入就绪进程队列的最后一行时间片用完前,执行进程所用时间=服务时间?就绪队列有记录?Y将执行队列的进程信息,写入已完成队列中NYN开始结束 3-2-7 时间片轮转调度算法处理模块2.2、数据结构说明:(1)、进程实体的属性设置:属性值类型表示意义举例取值NameString 进程名

12、称AProrityInt 优先级别4NeedTimeInt服务时间20ArrivalTimeDate到达时间10:14:00StartTimeDate开始时间10:14:07FinishTimeDate完成时间10:14:20RpDouble响应比23.043TurnOverDouble周转时间时间24.44TurnOver2Double带权周转时间5.03(2)、方法/函数的设计:函数名称返回类型功能说明参数说明protected void DataTableCreate();Void 初始化,DataTable的建立方法,包括就绪队列表和完成队列表无protected void Ready

13、PcbOsCreate(string Createtype)Void新建就绪进程的实现方法建表的类型protected void FinishedPcbOsCreate()Void新建完成进程队列的实现方法无protected void RunningPcbOsCreate() Void执行进程的创建方法无protected void Btn_DelPcb_Click(object sender, EventArgs e)Void【删除所有进程】按钮,点击事件无protected void Timer1_Tick(object sender, EventArgs e)VoidTimer 定时器

14、的功能与关联代码无protected void Btn_Import_Click(object sender, EventArgs e)Void样例导入按钮的点击事件无protected void Tab_Show_Create()Void动态演示的建表方法 Tab_Show 的建立无protected string readFile(string path)String#region 文本信息的读取外部文件的绝对路径protected void RefreshRp()Double进程响应比,每一秒都在进行的刷新方法23.043protected void RunningPSel()Doubl

15、e根据所选择的算法,分情况讨论,得到正在运行的进程信息24.44protected void countWaiting() Double判断当前正在运行和等待运行的进程总数5.03(3).补充:我们所使用的数据结构概念是队列,即用在执行进程,就绪进程和完成进程的队列处理,采用遍历算法,选取符合条件的进程信息转移到相应位置,具体转移过程可参考流程判断.2.3、算法流程图:子程序算法(1) 先来先服务算法,根据流程判断得到运行队列的方法新进程到达?点击“运行演示”按钮将新进程加入到就绪队列最后一行YN有进程执行中?Y该进程执行完?将就绪进程队列中的第一行记录,提取到执行进程队列。此行记录删除。Y将

16、执行队列的信息写入完成进程队列中N就绪队列有记录?YN点击“显示平均周转时间和带权平均周转时间”按钮,显示该算法的数据结果重新执行算法?Y结束N开始 图3-2-1 先来先服务执行队列算法 (2)短作业优先算法主要是遍历最短服务时间的进程,根据流程判断设计如下流程,可得到执行队列。【注:】因为最高响应比调度算法和静态优先权算法与短作业优先调度算法只是在判断从就绪队列调用哪一个进程的方法不一样,原理相同,只需要根据其算法遍历查询符合条件的进程然后写入执行队列就好,在此没有必要在写雷同的流程。新进程到达?点击“运行演示”按钮将新进程加入到就绪队列最后一行YN有进程执行中?Y该进程执行完?遍历就绪进程

17、队列,判断得到服务时间最小的进程,提取到执行进程队列。此行记录删除。Y将执行队列的信息写入完成进程队列中N就绪队列有记录?YN点击“显示平均周转时间和带权平均周转时间”按钮,显示该算法的数据结果重新执行算法?Y结束N开始图3-2-2 先来先服务执行队列算法(3)时间片轮转算法先按运行时间给进程排队,冒泡排序(先来先服务算法中已经写过)。获得总服务时间,在图2.3.2中已经写过。进行排队,得到进程队列。将新进程加入到就绪队列最后一行YN有进程执行中?Y时间片执行完?N点击“显示平均周转时间和带权平均周转时间”按钮,显示该算法的数据结果重新执行算法?Y结束N新进程到达?遍历就绪进程队列,提取第一行

18、的数据,写入到执行进程队列。此行记录删除。Y时间片执行完?已用时间 服务时间?Y就绪队列有记录?取出执行队列的数据写入到就绪队列的最后一行取出执行队列的数据写入到完成进程队列中YNNY点击“运行演示”按钮开始图3-2-3 时间片轮转算法(2)四、系统测试与调试分析1、系统测试测试说明测试名称通用处理机调度演示程序测试目的测试通用处理机的五种调度方法测试技术功能测试测试方法黑盒测试测试用例测试内容先来先服务算法测试步骤采用样例3进行测试,测试数据0|A|4|11:17:29|7(0为行索引,A为进程名,4,为优先级别,11:17:29为进程到达的系统时间,7为服务时间)1|B|1|11:17:3

19、0|52|C|7|11:17:32|153|D|7|11:18:35|74|E|8|11:18:49|195|F|1|11:18:59|86|G|3|11:19:20|12预期结果调度顺序:ABCDEFG测试结果与预期相同测试用例测试内容测试短作业优先调度算法测试步骤采用样例3进行测试测试数据0|A|4|11:17:29|7(0为行索引,A为进程名,4,为优先级别,11:17:29为进程到达的系统时间,7为服务时间)1|B|1|11:17:30|52|C|7|11:17:32|153|D|7|11:18:35|74|E|8|11:18:49|195|F|1|11:18:59|86|G|3|11

20、:19:20|12预期结果调度顺序:BDAFGCE测试结果与预期相同测试用例测试内容高响应比调度算法测试步骤测试者自己创建进程数据,进行测试测试数据0|A|2|11:31:05|4(0为行索引,A为进程名,4,为优先级别,11:17:29为进程到达的系统时间,7为服务时间)1|D|5|11:31:25|52|F|4|11:31:45|33|B|3|11:31:11|74|E|2|11:31:33|85|C|4|11:31:17|126|G|4|11:31:57|11预期结果调度顺序难以预测,准确的说是根据当前时刻进行响应比的计算,然后当上一个进程完成,继而得到最高响应比的进程,可以根据页面中的

21、响应比观察,判断出下一时刻进程的调用关系.提示:高响应比算法会根据当前时间而使调用顺序不同。测试结果测试用例测试内容测试静态优先权优先调度算法的正确性测试步骤采用样例3进行测试测试数据0|A|4|11:17:29|7(0为行索引,A为进程名,4,为优先级别,11:17:29为进程到达的系统时间,7为服务时间)1|B|1|11:17:30|52|C|7|11:17:32|153|D|7|11:18:35|74|E|8|11:18:49|195|F|1|11:18:59|86|G|3|11:19:20|12预期结果调度顺序:EDCAGFB测试结果与预期相同测试用例测试内容测试时间片轮转调度算法的正

22、确性测试步骤采用样例3进行测试,进行测试,时间片为3测试数据0|A|4|11:17:29|7(0为行索引,A为进程名,4,为优先级别,11:17:29为进程到达的系统时间,7为服务时间)1|B|1|11:17:30|52|C|7|11:17:32|153|D|7|11:18:35|74|E|8|11:18:49|195|F|1|11:18:59|86|G|3|11:19:20|12预期结果调度顺序:ABCDEFGABCDEFGACDEFGCEGCE测试结果与预期结果相同2、调试分析:选择了使用.NET来做这次的操作系统课设,也就意味着会遇到各种大大小的阻碍,毕竟之前没有太多尝试,而在这次的课设

23、中,遇到的主要困难和解决如下:(1)、SQL Server 的数据库与GridView连接不需要太多代码就可以完成,为了不要频繁调用数据库,我改用了DataTable 来存储就绪、执行、完成队列,查了很多资料,需要每次修改后绑定数据源,GridView也必须设置相同的字段(2)、因为需要动态的显示进程运行状况,所以设计之初就考虑到使用Timer计时器,书本上介绍比较简单,难就难在将哪些控件置于UpdatePanel中,哪些放在我外面,设计过程中也可以发现,会出现很多麻烦,我把需要每秒动态的数据都关联的Timer,而系统初始化的数据不要牵扯,可根据信息重新布置就好。(3)、设计算法时,最难得是对

24、时间片轮转算法的判断条件,需要读取时间片长度,然后以此为依据设置执行进程的运转情况,当运行完时间片后,如果运行完成,直接写入完成进程队列,反之要重新写进就绪进程队列的最后一行,等待下一次的时间片服务。(4)、出现的大问题 多为自己的知识面不够,逻辑判断不够全面,所以导致很多的失误,而小问题不断地调试过程,比如控件无响应、运行崩溃、字段索引有误、数组越出、控件显隐失败等等,可根据程序的错误提示来解决,不会的就百度,主要是过程麻烦五、用户手册1、本程序使用的平台是Micro Visual Studio2010,下载网址:2、 安装方法:下载完毕后,打开软件安装程序(Setup),根据屏幕提示,就可

25、以安装成功。3、 用户手册:(1)打开Micro Visual Studio2010 软件,点击“文件”,然后选择“新建网站”打开后的界面如下,然后在下面的“Web位置”中输入所建网站名称,并且记住这个位置,点击确定即可,然后关闭软件窗口就好。图5-1 新建网站提示界面(2)然后打开将本次课程设计中的项目,并将其文件夹中的如下所有文件复制下来,然后保存到之前新建网站的文件夹中,显示结果如下(新建文件夹中原本只有一个web.config 文件,直接覆盖就好)图5-2 复制文件提示界面(2) 先把文件夹中的“OsDemo”文件夹拷到E盘下。然后在Micro Visual Studio2010 软件

26、窗口中选择“文件”中的“打开项目”,并选取所安装软件的Projects目录下的新建的那个网站文件夹,点击.sln文件即可,如下所示:图5-3寻找打开连接的提示界面(3)在打开的下图中,点击那个绿色三角形或者从“调试”菜单里选择“启动调试”。图 5-3-2 提示界面(4)先进入程序首页(图5-4),需要输入的登录账号为“os”,登录密码为“123456”,点击“登录”,进而打开主页(图5-5). 图5-4 系统登录界面图 5-5 操作界面4、 由于操作界面设计的比较大,上图仅是显示了一部分,在最上端可以选择要使用的算法,其中先来先服务算法、短作业优先算法、高响应比优先算法、静态优先权优先算法,不

27、需要设置时间片大小,只有时间片轮转算法需要设置时间片大小,界面初始化为1,在此演示一下读取外部文件信息的操作步骤:(1) .点击“选择文件”按钮,然后找到之前放入E盘的“OsDemo”文件夹,选取其中一个文件,显示 (图5-6) ,然后可直接点击“样例导入”按钮,此时件文本中的信息显示在就绪进程列表中 (图 5-7) 图 5-6 读取外部文件图5-7 显示就绪进程队列信息(2) .此时有两种选择,可以显示动态表,也可以隐藏,即从右上角的的单选列表选择就好,在此我选择“Yes”,因为初始化默认选择的是“先来先服务算法”,当然也可以选择其他算法,相应点击算法就好,运行过程中,点击“暂停演示”按钮,

28、此时显示的情况为(图 5-8),(图5-9),即对应显示了某个时刻的各队列信息。 图5-8 运行动态界面1图 5-9 运行动态界面2(3) .所有进程都进行完后,可以点击右下角的“显示平均周转时间和平均带权周转时间”按钮,从而对应的显示此运行算法的计算信息(图 5-10) 图 5-10 所有进程完成后的数据处理显示界面5. 其中的前四个算法是同样的操作过程,对于时间片轮转算法,运行之前首先设置时间片大小,此处显示一下,在导入其中一个文本的时间片轮转算法运行截图,可以参考(图 5-11)图 5-11 时间片轮转算法下的运行截图6. 当然设计就提供了进程创建的功能,如果想自己创建进程信息,可以点击

29、“删除所有进程信息”按钮,然后依次在右侧选择输入进程的名称,优先级,服务时间即可,然后点击“创建新进程”按钮,即可在就绪进程队列里显示刚创建完的进程信息,值得提醒的是,为了真实表现实际情况,创建之时就会读取系统时间作为进程的“到达时间”,所以不需要自己输入。接下来的操作跟前几步操作一样 图 5-12 手动创建进程结果截图六、程序清单1、读取外部文件,从而导入进程信息的算法,即样例导入按钮的点击事件protected void Btn_Import_Click(object sender, EventArgs e) #region 样例导入按钮的点击事件 if (FileUpload1.HasF

30、ile) string fileName = FileUpload1.FileName; String filePath = E:OsDemo + fileName;/获取文本路径 string osDemoContent = readFile(filePath);string pcbString = osDemoContent.Split(new string rn , StringSplitOptions.RemoveEmptyEntries); /从中得到子串,去掉间隔符rn(都是表示回车) dtReadyP = (DataTable)this.ViewStatedtReadyP; fo

31、r (int i = 0; i pcbString.Length; i+) DataRow drReadyP = dtReadyP.NewRow(); string grandsonString = pcbStringi.Split(|);/去掉“|” /为各个变量赋值 drReadyPname = grandsonString1; drReadyPstate = 等待中.; drReadyPpriority = Convert.ToInt32(grandsonString2); drReadyParrivalTime = grandsonString3; drReadyPneedTime =

32、 Convert.ToInt32(grandsonString4); drReadyPranTime = 0; dtReadyP.Rows.Add(drReadyP); dtReadyP.AcceptChanges(); GV_Ready.DataSource = dtReadyP; GV_Ready.DataBind(); GV_Ready.Rows0.Visible = false; else Page.ClientScript.RegisterClientScriptBlock(this.GetType(), success, alert(请选择文件!);, true); #endreg

33、ion /读取外部文件,得到文本名称的方法:protected string readFile(string path) #region 文本信息的读取 FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read); StreamReader sr = new StreamReader(fs, Encoding.Default); string demoContent = sr.ReadToEnd(); sr.Close(); return demoContent; #endregion2、“显示平均周转时间和平均带权

34、周转时间”按钮的点击功能。即进程的信息处理,对应显示各算法的平均周转时间和平均带权周转时间:protected void Btn_Data_Click(object sender, EventArgs e) dtFinishP = (DataTable)this.ViewStatedtFinishP; DataTable dtNew = dtFinishP.Copy(); /变量声明 double TurnOverTime1 = 0; double TurnOverTime2 = 0; int count = 0; int count2 = 0; /遍历TurnOver(周转时间)字段,获得总

35、的时间,进而求得平均周转时间 for (int i = 0; i dtNew.Rows.Count; i+) if (!dtNew.RowsiturnOver.ToString().Equals()/查询条件 /进行操作 int TagTurnOver = Int32.Parse(dtNew.RowsiturnOver.ToString(); TurnOverTime1 += TagTurnOver; count+; /遍历TurnOver2(带权周转时间)字段,获得总的时间,进而求得平均带权周转时间 for (int i = 0; i dtNew.Rows.Count; i+) if (!d

36、tNew.RowsiturnOver2.ToString().Equals()/查询条件 /进行操作 double TagTurnOver = double.Parse(dtNew.RowsiturnOver2.ToString(); TurnOverTime2 += TagTurnOver; count2+; /osTurnOver平均周转时间 /osTurnOver2平均带权周转时间 string osTurnOver = (TurnOverTime1 / count).ToString(); string osTurnOver2 = (TurnOverTime2 / count2).To

37、String(); #region 不同的调度算法下 对应数据的 位置 switch (selectType) case 1: TextBox5.Text = osTurnOver; TextBox6.Text = osTurnOver2; break; case 2: TextBox7.Text = osTurnOver; TextBox8.Text = osTurnOver2; break; case 3: TextBox9.Text = osTurnOver; TextBox10.Text = osTurnOver2; break; case 4: TextBox13.Text = os

38、TurnOver; TextBox14.Text = osTurnOver2; break; case 5: TextBox11.Text = osTurnOver; TextBox12.Text = osTurnOver2; break; #endregion 3、新建就绪进程的实现方法DataTable,主要为PCB的创建.protected void ReadyPcbOsCreate(string Createtype) #region 非 RR 算法下的 就绪进程的创建 if (Createtype.Equals(普通) dtReadyP = (DataTable)this.ViewStatedtReadyP; DataRow drReadyP = dtReadyP.NewRow(); drReadyPname = DropDownList4.SelectedValue.ToString(); drReadyPstate = 等待中.;

展开阅读全文
相关资源
相关搜索
资源标签

当前位置:首页 > 技术资料 > 研究报告

版权声明:以上文章中所选用的图片及文字来源于网络以及用户投稿,由于未联系到知识产权人或未发现有关知识产权的登记,如有知识产权人并不愿意我们使用,如有侵权请立即联系:2622162128@qq.com ,我们立即下架或删除。

Copyright© 2022-2024 www.wodocx.com ,All Rights Reserved |陕ICP备19002583号-1 

陕公网安备 61072602000132号     违法和不良信息举报:0916-4228922