进程控制系统模拟文档

上传人:xuey****n398 文档编号:166039560 上传时间:2022-10-31 格式:DOC 页数:28 大小:196.50KB
收藏 版权申诉 举报 下载
进程控制系统模拟文档_第1页
第1页 / 共28页
进程控制系统模拟文档_第2页
第2页 / 共28页
进程控制系统模拟文档_第3页
第3页 / 共28页
资源描述:

《进程控制系统模拟文档》由会员分享,可在线阅读,更多相关《进程控制系统模拟文档(28页珍藏版)》请在装配图网上搜索。

1、*实践教学* 兰州理工大学计算机与通信学院2014年秋季学期操作系统原理课程设计题 目: 进程控制系统模拟专业班级: 计算机2班 姓 名: 原 龙 学 号: 12240207 指导教师: 庞淑侠 成 绩: _摘 要操作系统原理课程设计是为了让我们能对操作系统原理有更进一步的了解所开设的实践课程。这就要求我们在对课本主要内容熟练掌握的前提下,还能够运用这些内容来解决实际问题。 本次课设题目为进程控制系统模拟。进程的控制过程包括:创建进程、判断进程、换出进程、终止进程、杀死进程等,这些控制和管理功能是由操作系统中的原语来实现的。原语是在管态下执行、完成系统特定功能的程序段,而用于进程控制的原语包括

2、:创建原语、撤销原语、阻塞原语、唤醒原语、挂起原语和激活原语等。系统对进程的控制如不使用原语,就会造成其状态的不确定性,从而实现不了进程控制的功能。本课设将实现用一个fork()函数实现进程的创建,查看运行,再利用一个exec( )函数实现进程之间的替换,用一个wait()函数调整进程的运行顺序,直到杀死进程退出程序。主要算法采用了先来先服务,这样做的优点是进入队列的顺序决定优先级。课程设计可以提高我们的实践动手能力,能让我们把课本上的知识真正在实际应用中得到实现,进而把它变成自己的东西,达到学以致用的效果。同时,还可以加深对理论知识的印象。这也可以为我们以后的工作奠定良好的基础。 关键字:

3、进程控制 原语 进程创建 进程撤销前 言操作系统原理是计算机类专业的核心课程,也是其他诸多类专业的重要选修课,开设这门课可以为理解、应用和开发程序提供技术和方法支持,为后续课程的学习提供重要思想和方法基础,同时对于自己逻辑思维培养和程序设计思想体系的建立有着重要的影响。但是对于操作系统原理这门课仅仅通过课堂教学或自学获取理论知识是远远不够的,还必须加强实践,亲自上机输入、编辑、检查、修改、调试和运行各种典型算法。在大学学习时,知识是通过一门门独立的课程传授的,而实际问题之能够顺利地得到解决,不但需要多方面的知识,而且还需要善于对这些知识综合地加以运用。这次课设正是给我们了一次自己实践的机会。每

4、个进程用一个进程控制块( PCB)表示。进程控制块可以包含如下信息:进程名、优先数、到达时间、需要运行时间、已用CPU时间、进程状态等等。 进程的优先数及需要的运行时间可以事先人为地指定(也可以由随机数产生)。进程的到达时间为输入进程的时间。由于多道程序设计的操作系统都建立在进程的基础上,操作系统中引进进程的概念,理论角度讲是对正在运行的程序活动规律的抽象;从实现角度讲,则是一种数据结构,目的在于清楚地刻画系统的动态规律,有效管理计算机系统中程序的运行。目录摘 要2前 言3一、设计思想51.1基本原理51.2设计目的及要求51.3进程状态关系61.4进程控制61.5总体设计思路7二、各模块的伪

5、码算法82.1 进程控制块82.2 新建进程82.3 查看运行中的进程82.4 撤销进程9三、测试结果分析113.1开始界面演示113.2 新建功能界面113.3进程的查看演示123.4进程的调度情况123.5退出系统13设 计 总 结14参 考 文 献15致 谢16附录(部分程序源代码)17一、设计思想 1.1基本原理进程:进程是具有独立功能的可并发执行的程序在一个数据集合上的运行过程,在系统运行过程中是不断产生和消亡的。中断:中断是指处理机对系统中或系统外发生的异步事件的响应。进程管理:主要包括进程调度,进程的创建和撤销、进程的阻塞和唤醒,中断作用的实现。内核在引导并完成了基本的初始化以后

6、,就有了系统的第一个进程,即初始化进程,实际上是内核线程。除此之外所有的其它进程和线程都是由这个原始的进程或其子孙进程所创建。通过用主函数建立一个主菜单,然后再编写各个子函数分别实现主函数的功能,从而达到实现创建进程,查看进程,换出进程,杀死进程,结束进程等功能,在整个过程中主要用到了公共参数和私有参数以及函数调用等技术。1.2设计目的及要求通过该题目的设计过程,可以初步掌握进程控制系统的原理、软件开发方法并提高解决实际问题的能力。也能提高同学们的实践动手能力,在实践过程中加深理解和熟练掌握课本中所学的各种操作,学会如何把所学的知识用于解决实际问题,以达到学以致用的效果。了解Windows X

7、P的操作接口及系统调用方式,熟悉Windows XP常用操作的实现过程,练习并掌握Visual C+开发环境。利用Windows SDK(System Development Kit)提供的API(应用程序接口)编程模拟实现进程控制系统,要求用fork( )创建一个进程,再调用exec( )用新的程序替换该子进程的内容,利用wait( )来控制进程执行顺序。核心要求用fork( )创建一个进程,再调用exec( )用新的程序替换该子进程的内容,利用wait( )来控制进程执行顺序。现设计为以下内容:1、分析设计要求,给出解决方案(要说明设计实现所用的原理、采用的数据结构)。2、设计合适的测试用

8、例,对得到的运行结果要有分析。3、设计中遇到的问题,设计的心得体会。1.3进程状态之间的关系进程的三个状态之间的转换如图1-3所示:运行状态就绪状态阻塞状态进程调度落选等待事件已经发生发生等待事件图1-3 进程的三种基本状态及其转换1.4 进程控制建立四个函数模拟进程创建、撤销、阻塞和唤醒四个原语。进程创建fork()进程创建的主要工作是:第一步,申请空白进程控制块;第二步,初始化进程控制块;第三步,将进程链入就绪队列。进程撤销destory()进程撤销的主要工作是:第一步,回收进程所占内存资源;第二步,回收进程控制块;第三步,在屏幕上显示进程执行结果,进程撤销进程阻塞block()进程阻塞的

9、主要工作是:第一步,保存运行进程的CPU现场;第二步,修改进程状态;第三步,将进程链入对应的阻塞队列,然后转向进程调度。进程的唤醒进程唤醒的主要工作是将进程由阻塞队列中摘下,修改进程状态为就绪,然后链入就绪队列。1.5 总体设计思路主 函 数创建模块查看模块换出模块杀死模块通信模块退出模块 进程的总体设计主要模块如图1-5所示:图1-5 总体设计模块二、各模块的伪码算法2.1 进程控制块定义一个ProcessType为进程控制块,内设置进程标示符pid、进程的优先级、进程的大小以及进程的信息。还包括struct ProcessType Ready20;/就绪数组。struct ProcessT

10、ype Hung20; /挂起数组;struct ProcessType Cpu; /运行进程。int Number1=0,Number2=0,First=0; /Number1是就绪队列中的进程的个数; /Number2是挂起队列中的进程个数; /First是判断是否是第一次输入进程。2.2新建进程 开始通过fork()函数新建个进程,并设置就绪队列的最大长度为10;并包括进程的三个参数 Number120Number120noyesnoFirst=0进程已满进程已满First+First=0yesInputInput2.3查看运行中的进程新建一个RUN函数用于查看正在运行的状态,函数如下:

11、Run()输出结果;将优先级高的进程调入CPU执行定义数组;就绪数组第一个数;for(i=0;iNumber1;i+)if(strcmp(p,Readyi.Priority)0)把Readyi.Priority所指向的由NULL结束的字符串复制到p所指的数组中。for(i=0;i20;i+)查看进程;for(i;iNumber1-1;i+)修改结果;将结果调入队列;2.4撤销进程用一个skill()函数来实现进程的销毁,详细设计如下:Void();定义数组;显示输出结果;for(i=0;iNumber2;i+)将进程挂起;for(i=0;iNumber1;i+)就绪进程;输入;for(i;iN

12、umber2;i+)将结果递增1;Number2-;for(i;iNumber1;i+)将结果递增1;Number1的值-1;else continue;if(strcmp(p,Cpu.Pid)=0)重新赋值;for(i=0;iNumber1-1;i+)将调入的结果递增1;Number1的值-1;三、测试结果分析3.1开始界面演示开始界面如图3-1所示:图3-13.2 新建功能界面 图3-23.3进程的查看演示图3-33.4进程的调度情况图3-43.5退出系统图3-5设 计 总 结通过这次课程设计,增强了自己C+的编程能力,也加深了对操作系统原理这门课程中进程控制管理模块的理解。但还是有些不足

13、之处,例如未能很好的实现进程的协调控制,界面不美观,若能通过图形化界面显示则效果会更好。我争取在以后的学习过程中以这次课程设计的不足为经验,进一步强化学习自己的编程能力和对问题的分析和解决能力。两个星期程序设计课程,虽然时间有点短,但我也收获不少,这次试验,加深了我对进程概念及进程管理的理解;比较熟悉进程管理中主要数据结构的设计及进程调度算法、进程控制机构、同步机构及通讯机构的实施。也让我认识到自己的不足,操作系统的有些知识,我知道的还不多,没有掌握好,还需要多多学学,不断提升自己的能力。在设计过程中的思考和讨论,使我对现有知识能够运用计算机来解决现实生活中的实际问题确立了信心,对模块化程序设

14、计思想有了比较清晰的印象,为今后的程序设计奠定了一定的心理和技术上的准备。在这样一次又一次的砺炼中,我得到的不仅仅是知识,更多的是自身能力的提高。经过这次课设我学到了很多。这次课程设计加强了我对计算机操作系统的认识,对我个人而言是对所学课程内容掌握情况的一次自我验证。通过此次课程设计加深理解了什么是进程控制,熟悉了Windows 7支持的进程的控制方式。练习并掌握了Windows SDK(System Development Kit)提供的API编辑器来编译C程序,学会了利用API编译、调试C程序。更重要的是通过此次课程设计使我懂得了三思而后行,学到了严谨的学习态度、永不放弃的精神,也增加了去

15、面对更大挑战的信心和勇气,同时也培养了把学到的知识用于解决实际问题,培养了我的独立动手能力。参 考 文 献1 汤子瀛,哲凤屏.计算机操作系统.西安电子科技大学学出版社.2 王清,李光明.计算机操作系统.冶金工业出版社.3 孙钟秀等.操作系统教程.高等教育出版社4 曾明.Linux操作系统应用教程.陕西科学技术出版社. 5 张丽芬,刘利雄.操作系统实验教程.清华大学出版社.6 孟静.操作系统教程原理和实例分析.高等教育出版社7 周长林.计算机操作系统教程.高等教育出版社8 张尧学.计算机操作系统教程.清华大学出版社9 任满杰.操作系统原理实用教程.电子工业出版社致 谢经过近两周的上机实践,本次操

16、作系统原理的课程设计圆满完成了,这次课程设计培养了我全面思考问题的能力,从而加快了解决问题的速度、提高了的工作效率,以及锻炼了在短时间内解决问题的顽强意志。在编写程序的过程中,我得到了庞淑侠老师、王旭阳老师、李晓旭老师的的耐心指导,在老师的指导下,我的能力得到了提高,同时养成了科学、严谨的作风和习惯,为此我要诚恳的感谢三位老师。同时还要感谢孙源同学在一些问题上对我的指点以及牛长平同学在一些问题上跟我的共同探讨。,没他们的帮助可能有很多问题我个人不能进行很好的解决。在此我对他们所有人的帮助表示衷心的感谢。另外通过本次课程设计,我深刻体会到在遇到问题时要沉着冷静,不要盲目去做,须知“磨刀不误砍柴工

17、”。首先对问题进行全面的分析,勾勒出大致思路,然后根据思路决定解决问题的大致方向,制定相应的解决方案, 进而逐步解决问题。附录(部分程序源代码)#include #include #include #include struct ProcessType/进程控制块char Pid10;/进程标识符char Priority10;/进程优先级char Size10;/进程大小char Message10;/进程的信息;struct ProcessType Ready20;/就绪数组。struct ProcessType Hung20; /挂起数组;struct ProcessType Cpu;

18、/运行进程。int Number1=0,Number2=0,First=0; /Number1是就绪队列中的进程的个数; /Number2是挂起队列中的进程个数; /First是判断是否是第一次输入进程。/*/新建进程的函数;void fork()if(Number120)printf(n就绪进程已满,请先删除或挂起进程n);elseif(First=0)printf(n);printf(n这是你第一次输入进程信息,它将直接调入CPU运行!n);printf(n请输入新进程的Pidn);scanf(%s,&Cpu.Pid);printf(n请输入新进程的优先级n);scanf(%s,&Cpu.

19、Priority);printf(请输入新进程的大小n);scanf(%s,&Cpu.Size);First+;elseprintf(n请输入新进程的Pidn);scanf(%s,&ReadyNumber1.Pid);printf(请输入新进程的优先级n);scanf(%s,&ReadyNumber1.Priority);printf(请输入新进程的大小n);scanf(%s,&ReadyNumber1.Size);Number1+;/*/查看正在运行的进程;void Run()printf(n现在正在运行的进程的资料如下:n);printf(PID码为:%sn优先级为:%sn大小为:%s,C

20、pu.Pid,Cpu.Priority,Cpu.Size);void ChangeA()/将优先级高的进程调入CPU执行char i,m10,t10;char n10,p10;strcpy(p,Ready0.Priority);/就绪数组第一个数for(i=0;iNumber1;i+)if(strcmp(p,Readyi.Priority)0)/*strcmp(char *str1, char *str2) : 按照各个字符(ascii)比较字符串str1和str2,当str1str2时,返回值str2时,返回值0 */strcpy(p,Readyi.Priority); /把Readyi.P

21、riority所指向的由NULL结束的字符串复制到p所指的数组中。for(i=0;i20;i+)if(strcmp(p,Readyi.Priority)=0) /用法同上strcpy(m,Cpu.Size); /用法同上,以下所有关于这两个函数的用法都同上面所解释的strcpy(Cpu.Size,Readyi.Size);strcpy(n,Cpu.Pid);strcpy(Cpu.Pid,Readyi.Pid);strcpy(t,Cpu.Priority);strcpy(Cpu.Priority,Readyi.Priority);break;else continue;for(i;iNumber

22、1-1;i+)strcpy(Readyi.Size,Readyi+1.Size);strcpy(Readyi.Pid,Readyi+1.Pid);strcpy(Readyi.Priority,Readyi+1.Priority);strcpy(Readyi.Size,m);strcpy(Readyi.Pid,n);strcpy(Readyi.Priority,t);/*/手动将进程挂起void ChangeB()int i;char p10;printf(n请输入想要挂起的进程的PID码:n(在以下中选:);for(i=0;iNumber1;i+)printf(就绪%s ,Readyi.Pid

23、);printf()n);scanf(%s,&p);for(i=0;iNumber1;i+)if(strcmp(p,Readyi.Pid)=0)strcpy(HungNumber2.Size,Readyi.Size);strcpy(HungNumber2.Pid,Readyi.Pid);strcpy(HungNumber2.Priority,Readyi.Priority);Number2+;break;else continue;for(i;iNumber1;i+)strcpy(Readyi.Size,Readyi+1.Size);strcpy(Readyi.Pid,Readyi+1.Pid

24、);strcpy(Readyi.Priority,Readyi+1.Priority);Number1-;/*/将挂起的进程按先进先出的方式调入就绪队列void ChangeC()int i;strcpy(ReadyNumber1.Size,Hung0.Size);strcpy(ReadyNumber1.Pid,Hung0.Pid);strcpy(ReadyNumber1.Priority,Hung0.Priority);Number1+;for(i=0;iNumber2;i+)strcpy(Hungi.Size,Hungi+1.Size);strcpy(Hungi.Pid,Hungi+1.P

25、id);strcpy(Hungi.Priority,Hungi+1.Priority);Number2-;for(i=0;iNumber1;i+)printf(就绪队列为:nPID码为:%s;n优先级为:%s;n大小为:%sn,Readyi.Pid,Readyi.Priority,Readyi.Size);/*/手动将就绪进程调入CPU执行void ChangeD()char i,m10,t10;char p10;char n10;printf(n请输入想要运行的进程的PID码:n(在以下中选:);for(i=0;iNumber1;i+)printf(就绪%s ,Readyi.Pid);pri

26、ntf()n);scanf(%s,&p);for(i=0;iNumber1;i+)if(strcmp(p,Readyi.Pid)=0)strcpy(m,Cpu.Size);strcpy(Cpu.Size,Readyi.Size);strcpy(Readyi.Size,m);strcpy(n,Cpu.Pid);strcpy(Cpu.Pid,Readyi.Pid);strcpy(Readyi.Pid,n);strcpy(t,Cpu.Priority);strcpy(Cpu.Priority,Readyi.Priority);strcpy(Readyi.Priority,t);break;else

27、continue;/*/手动将挂起的进程调入就绪队列void ChangeE()int i;char p10;printf(n请输入想要调入就绪的进程的PID码:n(在以下中选:);for(i=0;iNumber2;i+)printf(挂起%s ,Hungi.Pid);printf()n);scanf(%s,&p);for(i=0;iNumber2;i+)if(strcmp(p,Hungi.Pid)=0)strcpy(ReadyNumber1.Size,Hungi.Size);strcpy(ReadyNumber1.Pid,Hungi.Pid);strcpy(ReadyNumber1.Prio

28、rity,Hungi.Priority);break;else continue;Number1+;for(i;iNumber2;i+)strcpy(Hungi.Size,Hungi+1.Size);strcpy(Hungi.Pid,Hungi+1.Pid);strcpy(Hungi.Priority,Hungi+1.Priority);Number2-;for(i=0;iNumber1;i+)printf(就绪队列为:nPID码为:%s;n优先级为:%s;n大小为:%sn,Readyi.Pid,Readyi.Priority,Readyi.Size);/*/换入换出实现函数void Chan

29、ge()int a;printf(n请你选择需要的交换方式:n);printf(1.将优先级高的进程调入CPU执行.n);printf(2.手动将进程挂起.n);printf(3.将挂起的进程按先进先出的方式调入就绪队列.n);printf(4.手动将就绪进程调入CPU执行.n);printf(5.手动将挂起的进程调入就绪队列.n);scanf(%d,&a);switch(a)case 1:ChangeA();break;case 2:ChangeB();break;case 3:ChangeC();break;case 4:ChangeD();break;case 5:ChangeE();b

30、reak;default:break;/*/杀死进程void Kill()char i;char p10;printf(n请输入想要杀死的进程的PID码:n(在以下中选:);printf(运行%s ,Cpu.Pid);for(i=0;iNumber2;i+)printf(挂起%s ,Hungi.Pid);for(i=0;iNumber1;i+)printf(就绪%s ,Readyi.Pid);printf()n);scanf(%s,&p);for(i=0;iNumber2;i+)if(strcmp(p,Hungi.Pid)=0)for(i;iNumber2;i+)strcpy(Hungi.Si

31、ze,Hungi+1.Size);strcpy(Hungi.Pid,Hungi+1.Pid);strcpy(Hungi.Priority,Hungi+1.Priority);Number2-;break;else continue;for(i=0;iNumber1;i+)if(strcmp(p,Readyi.Pid)=0)for(i;iNumber1;i+)strcpy(Readyi.Size,Readyi+1.Size);strcpy(Readyi.Pid,Readyi+1.Pid);strcpy(Readyi.Priority,Readyi+1.Priority);Number1-;bre

32、ak;else continue;if(strcmp(p,Cpu.Pid)=0)strcpy(Cpu.Size,Ready0.Size);strcpy(Cpu.Pid,Ready0.Pid);strcpy(Cpu.Priority,Ready0.Priority);for(i=0;iNumber1-1;i+)strcpy(Readyi.Size,Readyi+1.Size);strcpy(Readyi.Pid,Readyi+1.Pid);strcpy(Readyi.Priority,Readyi+1.Priority);Number1-;void ShareMemory() /共享存储器通信i

33、nt i,operate;char p10;char sha120=Hello!;/共享存储区分区该数据是用来给其他进程读的char sha210; /共享存储区分区,用来提供给其他进程的写操作printf(n共享存储区已有数据为:);printf(%s,sha1);printf(nn1.为向共享存储区里读数据,.为向共享存储区里写数据n);printf(n请选择操作:);scanf(%d,&operate);printf(n请输入共享存储器通信的进程的Pid码:);scanf(%s,&p);if(operate=1)printf(读取数据为:);printf(%s, sha1);elsepr

34、intf(请写入数据:);gets(sha2);gets(sha2);printf(您向共享存储区中写入的数据是:);puts(sha2);printf(此时共享存储区中的数据为:);strcat(sha1,sha2);printf(%s,sha1);for (i = 0;i Number2;i+)if (strcmp(p, Hungi.Pid) = 0)for (i;i Number2;i+)strcpy(Hungi.Message, sha2);break;else continue;for (i = 0;i Number1;i+)if (strcmp(p, Readyi.Pid) = 0

35、)for (i;i Number1;i+)strcpy(Readyi.Message, sha2);break;else continue;if (strcmp(p, Cpu.Pid) = 0)strcpy(Cpu.Message, sha2);/*/消息传递通信void MsgPass() int i;char p10, q10;char buffer20; /分配内存存放消息的缓冲区,数组的大小可以更大,由于动态数组控制/起来比较麻烦,就采用预存大空间来分配了printf(n请输入发送消息的进程Pid:);scanf(%s, &q);printf(n请输入Send的消息内容:);scanf

36、(%s,&buffer);printf(n此时消息缓冲队列中的内容为:);printf(%s,buffer);printf(nn请输入接收消息的进程Pid:);scanf(%s, &p);printf(n接收进程从消息缓冲区中Receive的消息内容是:);printf(%s,buffer);for (i = 0;i Number2;i+)if (strcmp(p, Hungi.Pid) = 0)for (i;i Number2;i+)strcpy(Hungi.Message, buffer);break;else continue;for (i = 0;i Number1;i+)if (st

37、rcmp(p, Readyi.Pid) = 0)for (i;i Number1;i+)strcpy(Readyi.Message, buffer);break;else continue;if (strcmp(p, Cpu.Pid) = 0)strcpy(Cpu.Message, buffer);/直接通信void ZJTX()int i;char a5, b5;char buffer20; /分配内存存放消息的缓冲区,数组的大小可以更大,由于动态数组控制/起来比较麻烦,就采用预存大空间来分配了for (i=1;i=5;i+)ai=bi ;printf(n请输入发送消息进程的Pid:);sc

38、anf(%s, &b);printf(n请输入Send的消息内容:);scanf(%s,&buffer);printf(n此时消息缓冲队列中的内容为:);printf(%s,buffer);printf(nn请输入接收消息的进程Pid:);scanf(%s, &a);printf(n接收进程从消息缓冲区中Receive的消息内容是:);printf(%s,buffer);void main()/主实现函数。int n;char a;n=1;while(n=1)/system(cls); /清屏函数会清除上一次的输入数据,那么创建的进程会被清屏,/那后面的操作就没法继续,需要重来了,所以删除了该

39、函数printf(n*);printf(n* *);printf(n* 进程控制系统模拟演示 *);printf(n* *);printf(n* 1.创建新的进程 *);printf(n* *);printf(n* 2.查看运行进程 *);printf(n* *);printf(n* 3.调度某个进程 *);printf(n* *);printf(n* 4.杀死某个进程 *);printf(n* *);printf(n* 5.退出演示系统 *);printf(n* *);printf(n*);printf(n请选择你将要进行的操作:);a=getche(); /特别强调这个吸收回车的函数在VS2005中会有警告,因为在VS2005/中,它是不安全的,所以要写成a=_getche();但在VC+6.0则不用改写.switch(a)case1:fork();break;case2:Run();break;case3:Change();break;case4:Kill();break;case5:exit(0);default:printf(n);printf(n);printf(n-输入有错,请重新输入!-n);break;printf(n=n);

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!