欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    2022年电子科大-计算机-操作系统实验报告-2014级 .docx

    • 资源ID:64044595       资源大小:602.53KB        全文页数:31页
    • 资源格式: DOCX        下载积分:4.3金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要4.3金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    2022年电子科大-计算机-操作系统实验报告-2014级 .docx

    精选学习资料 - - - - - - - - - 电 子 科 技 大 学实验报告同学:郫县 LBJ 学号:试验地点:主楼 A2-413 指导老师:温顺可爱的刘杰彦 试验时间: 2022 年 4 月 22 日上午一、试验室名称:电脑学院主楼机房 二、试验项目名称:进程与资源治理 试验分工: 郫县 LBJ 进程治理设计 郫县小胖子 资源治理设计郫县威斯布鲁克 三、试验学时: 2 四、试验原理:进程调度与时钟中断设计此处的试验原理在指导书上特别丰富,因此不照搬过来,主要写出所要使用到学问点,具体实现过程中的原理分析见报告第八部分“ 试验步骤” 处;(一) 总体设计 系统总体架构如图 1 所示,最右边部分为进程与资源治理器,属于操作系统 内核的功能;要求能够设计与实现一个简洁的进程与资源治理器,具有如下功能: multi_unit 资源的治理;完成 完成进程创建、撤销和进程调度;完成多单元 资源的申请和释放;完成错误检测和定时器中断功能;图 1 系统总体结构(二) Test shell 设计 应具有的功能:名师归纳总结 - - - - - - -第 1 页,共 18 页精选学习资料 - - - - - - - - - 1、从终端或者测试文件读取命令;2、将用户需求转换成调度内核函数即调度进程和资源治理器;3、在终端或输出文件中显示结果:如当前运行的进程、错误信息等;(三) 进程治理设计 1、进程状态与操作 2、进程掌握块结构 PCB 3、主要函数:创建进程、撤销进程(四) 资源治理设计 1、主要数据结构 RCB 2、恳求资源 3、释放资源五进程调度与时钟中断设计关键:使用基于优先级的抢占式调度策略,算法;参考课上 ppt :五、试验目的:在同一优先级内使用时间片轮转设计和实现进程与资源治理,并完成 Test shell 的编写,以建立系统的进程治理、调度、资源治理和安排的学问体系,从而加深对操作系统进程调度和资源治理功能的宏观懂得和微观实现技术的把握;六、试验内容:设计与实现一个简洁的进程与资源治理器,要求具有如下功能: 完成进程创名师归纳总结 建、撤销和进程调度;完成多单元 multi_unit资源的治理;完成资源的申请第 2 页,共 18 页- - - - - - -精选学习资料 - - - - - - - - - 和释放;完成错误检测和定时器中断功能;通过编写测试脚本 test shell来完成对进程与资源治理器的测试;七、试验环境设备、元器件:Windows 7、Visual Studio 2022 八、试验步骤:(一) 系统功能需求分析:(二) 总体框架设计:1、 具体原理和总体工作流程分析:第一,通过 test shell从测试文件中读入各种命令;然后,对命令进行分析,将用户的需求转换成调度内核函数,也就是说,通 过调度进程和资源治理器,实现创建进程、撤销进程、进程调度、对资源进行管理、申请和释放资源、 检测错误和定时器中断等功能,进程进行调度和对资源进行治理的过程;从而模拟一个操作系统对最终,在终端或者输出文件中, 把一系列操作后的结果显示出来,包括当前运行的进程、错误信息等;2、 相关方法和算法:(1) C 语言中的结构 struct ,用来实现 PCB、RCB等(2) C 语言中的指针、链表操作,用来实现将PCB和 RCB加入队列尾部、从队列中删除、转移至堵塞队列等操作,以及进程的调度执行等;本 试验中我们采纳的带头结点的链表来实现各种操作;(3) 基于优先级的调度算法、时间片轮转调度算法、抢占式调度算法的综 合应用;3、 模块调用关系:本试验中,我们组共编写了三个头文件 pcb.h 、和四个源文件 、pcb.c 、进程治理设计模块、 资源 test_shell_data.c,因此可以分为主函数设计模块、治理设计模块和 test shell 设计模块;在主函数模块中, 需要调用其他三个模块, 如创建进程、 展现父子子进程等 操作,需要调用进程治理设计模块;调度算法的执行、展现各种队列等,需要调名师归纳总结 用 test shell设计模块;第 3 页,共 18 页- - - - - - -精选学习资料 - - - - - - - - - 在进程治理设计模块中, 像销毁 PCB等操作, 需要执行对 RCB的释放, 就需 调用 test shell 设计模块;在资源治理设计模块中,供应一些最小的操作,不调用其他模块;在 test shell 设计模块中,设计到对资源和进程的各种操作,需要调用资 源治理设计模块和进程治理设计模块;(三) 进程治理设计模块具体设计本部分我负责实现我们的方案是在在进程治理设计模块中,和操作,具体包括:实现关于进程的各种最基础的结构实现 PCB结构体、 PCB链表、 PCB子节点链表;实现对 PCB链表的初始化、对子节点链表的初始化、新建 PCB、对 PCB链表中进行删除、插入、移除不 free 、从等待和堵塞队列中猎取 PCB得知、打印当前 PCB父节点、打印当前 PCB父节点、 打印当前 PCB子节点链表、 插入子队列的尾部、从子队列尾部删除;1、 进程状态与操作(1) 进程状态共 ready/running/blocked 三种状态 , 通过结构 struct 实现,代码如下:struct int running ;int blocked ;int ready ; PCB_STATUS ; / 定义 pcb 状态的三种情形(2) 进程操作:在本次试验中, 将会读进程进行以下操作, 结合这些操作的具体内容和所学学问,很简洁考虑到通过链表来实现这些操作;创建 create: none -> ready 撤销 destroy: running/ready/blocked -> none 恳求资源 Request: running -> blocked 当资源没有时,进程堵塞 释放资源 Release: blocked -> ready 因申请资源而堵塞的进程被唤醒 时钟中断 Time_out: running -> ready 调度: ready -> running / running ->ready 2、 主要数据结构实现:名师归纳总结 - - - - - - -第 4 页,共 18 页精选学习资料 - - - - - - - - - 1进程掌握块结构 PCB 进程掌握块 PCB是进程存在的唯独标识, 并且常驻内存, 进程掌握块中有许多信息,在本次试验中,依据我们的需求,所设计的进程掌握块结构如下:结合试验指导书,我们通过结构struct实现进程掌握块结构PCB,包含以下信息:PID name Other_resources /: resource which is occupied Status: Type & List/ type: ready, block, running ., /List: RLReady list or BLblock list Creation_tree: Parent/Children Priority: 0, 1, 2 Init, User, System 主要代码及注释如下:struct PCB /pcb 结构体char name 64 ; /Pname unsigned int pid ; /Pid struct RCB_LIST * rcb_list ; /Other resources struct PCB_LIST * parent_pcb ; / 父进程struct CHILD_PCB_LIST * child_pcb ; / 子进程int state ; /Type&List int priority ; /0,1,2 ;(3) 实现一个 PCB的链表,便利后面的操作:struct PCB_LIST ;/pcb链表;struct PCB pcb* next_pcbstruct PCB_LIST ;(4) 实现 PCB的子节点链表:struct CHILD_PCB_LIST /pcb子节点链表;struct PCB_LIST* node;struct CHILD_PCB_LIST* next_node;名师归纳总结 - - - - - - -第 5 页,共 18 页精选学习资料 - - - - - - - - - 3、 主要操作设计实现过程(1) 初始化 PCB链表添加了头结点 : void init_pcb_list struct PCB_LIST * listif* listreturn;struct PCB_LIST * p = struct PCB_LIST* malloc sizeof structPCB_LIST ; p-> next_pcb = NULL ; struct PCB ; memset p ,NULL ,sizeof* list = p ;(2) 初始化子节点链表:void init_child_pcb_list struct CHILD_PCB_LIST * listif* listreturn;struct CHILD_PCB_LIST * p = structCHILD_PCB_LIST * malloc sizeof struct CHILD_PCB_LIST ; p-> next_node = NULL ; memset p , NULL , sizeof struct CHILD_PCB_LIST ;* list = p ;(3) 创建一个新的 PCB: structPCB_LIST * create_pcb char *name ,unsignedintpid ,intstate,unsignedint priority, struct PCB_LIST* parent_pcbstruct PCB pcb; strcpy pcb . name , name , strlen name ; pcb. pid = pid; pcb. rcb_list =NULL ; pcb. state = state; pcb. priority = priority; pcb. parent_pcb = parent_pcb; pcb. child_pcb = NULL ;struct PCB_LIST* pcb_node = structPCB_LIST * malloc sizeof struct PCB_LIST; pcb_node-> pcb = pcb; pcb_node-> next_pcb =NULL ;return pcb_node;(4) 从 PCB链表中进行删除 : 名师归纳总结 void destory_from_pcb_list struct PCB_LIST* list,char* name 第 6 页,共 18 页- - - - - - -精选学习资料 - - - - - - - - - struct PCB_LIST* pr_temp,* temp ; pr_temp = temp = list;int ret = 1 ;while temp if. strcmp name , temp-> pcb . name && ret release_resource= temp temp ; pr_temp = list; ret = 0 ;if. strcmp name , temp-> pcb . name pr_temp-> next_pcb = temp-> next_pcb; free temp ;return; pr_temp = temp; temp = temp-> next_pcb5插入 pcb 链表:void insert_into_pcb_list struct PCB_LIST* list,structPCB_LIST * node if.*list list;,* temp ; init_pcb_liststruct PCB_LIST * pr_temp pr_temp = temp = * list;while temp pr_temp = temp; temp = temp-> next_pcb pr_temp-> next_pcb = node;(5) 从 PCB链表中移除,并不释放该PCB占用的空间:,char* name void delete_from_pcb_list struct PCB_LIST* list名师归纳总结 struct PCB_LIST* pr_temp,* temp ;第 7 页,共 18 页 pr_temp = temp = list;- - - - - - -精选学习资料 - - - - - - - - - while temp if. strcmp name , temp-> pcb . name pr_temp;-> next_pcb = temp-> next_pcb;return pr_temp = temp; temp = temp-> next_pcb(6) 从等待和堵塞队列中猎取 PCB的地址:struct PCB_LIST * get_pcb char * name struct PCB_LIST * temp ;for int i = 2 ; i >= 0; i- temp = READY_LIST i -> next_pcb ;while temp if . strcmp temp -> pcb . name , name return temp; temp = temp-> next_pcb;if BLOCKED_LIST temp = BLOCKED_LIST-> next_pcb ;while temp if . strcmp temp -> pcb . name , name return temp; temp = temp-> next_pcb;return NULL ;(7) 打印当前 PCB的父节点void show_pcb_parent struct PCB_LIST* node printf "%s parent node is %s n", node-> pcb . name ,node -> pcb . parent_pcb-> pcb . name ;(8) 打印当前 PCB的子节点链表名师归纳总结 - - - - - - -第 8 页,共 18 页精选学习资料 - - - - - - - - - void show_pcb_child struct PCB_LIST* node printf "%s child is ", node-> pcb . name ;struct CHILD_PCB_LIST* temp = node-> pcb . child_pcbif temp temp = temp-> next_node;while temp printf " -> |%s|", temp-> node -> pcb . name ; temp = temp-> next_node; printf "n"(9) 插入子队列的尾部voidinsert_into_child_pcb_list structCHILD_PCB_LIST*list, structPCB_LIST * node if.*list list;,* temp ; init_child_pcb_liststruct CHILD_PCB_LIST * pr_temp pr_temp = temp = * list;while temp pr_temp = temp; temp = temp-> next_nodestruct CHILD_PCB_LIST * p = struct CHILD_PCB_LIST;CHILD_PCB_LIST* malloc sizeof struct p-> node = node; p-> next_node =NULL ; pr_temp-> next_node = p ;(10) 从子队列尾部进行删除void delete_from_child_pcb_list struct CHILD_PCB_LIST* list,char* name struct CHILD_PCB_LIST* pr_temp,* temp ;if. listreturn; pr_temp = list; temp = pr_temp-> next_node;while temp 名师归纳总结 - - - - - - -第 9 页,共 18 页精选学习资料 - - - - - - - - - if. strcmp name , temp-> node -> pcb . name pr_temp;-> next_node = temp-> next_node;return pr_temp = temp; temp = temp-> next_node (四) 其他模块设计组内其他人设计1、 Test shell 设计 Test shell 将调度我们设计的进程与资源治理器,从而完成测试,具有以 下功能:1从终端或者测试文件读取命令;2将用户需求转换成调度内核函数即调度进程和资源治理器;3在终端或输出文件中显示结果:如当前运行的进程、错误信息等;2、 资源治理设计 与进程治理设计的思路和流程相像,第一是设计好各类数据结构,包括 RCB结构体、 RCB等待队列链表、系统RCB结构体、系统 RCB链表、 RCB链表;之后是实现好各类与 RCB有关的基础操作,包括初始化前面设计的各种链表、新建 RCB,以及对链表进行插入、删除、移除等操作,仍有显示 RCB队列的操作;3、 试验进程调度与时钟中断设计核心思想即时间片轮转调度算法、设计到对前面各模块的调用;九、试验数据及结果分析:将试验指导书中给出的测试命令,出到屏幕,如以下图所示:优先级调度算法、 抢占式算法的综合应用,程序从该文件读取命令, 并将执行结果输上图结果与试验指导书中给出的预期输出结果是一样的,说明试验胜利;名师归纳总结 具体的结果分析: 为了更易于观看, 我们可以注释掉读文件的操作,让程序第 10 页,共 18 页- - - - - - -精选学习资料 - - - - - - - - - 从键盘输入读取命令,每步命令的说明及相关执行结果截图如下:cr x 1 / 创建优先级为 1 的进程 x,应显示“* the x is running”cr p 1 / 创建优先级为 1 的进程 p,应显示“* the x is running”cr q 1 / 创建优先级为 1 的进程 q,应显示“* the x is running”cr r 1 / 创建优先级为 1 的进程 r ,应显示“* the x is running”经过以上四条指令,就绪队列中优先级 1 的队列中应依次为 x、p、q、r ,可用资源数应当都是总的资源数, 执行结果、就绪队列、资源队列情形见以下图:to /一个时间片终止,应去执行p,显示“* the p is running”同时, x 进程 PCB将进入优先级为0 的就绪队列,如以下图:req 2 1 /为当前进程x 申请 1 个 R2资源,显示不变输出显示不变,但是可用资源数目会发生变化,如以下图:to / 一个时间片终止,应去执行 q,显示“* the q is running ”req R3 3 / 为当前进程 q 申请 3 个 R3资源,显示不变过程中截图如下,可用资源数目进一步减小:to / 一个时间片终止,应去执行 r ,显示“* the r is running”req R4 3 / 为当前进程 x 申请 3 个 R4资源,显示不变to / 一个时间片终止, 应去执行优先级为 0 的就绪队列中的第一个进程x,显示“* the x is running”to 指令后截图如下,包括此时就绪队列的情形,全部进程的 PCB都在优先级为 0 的就绪队列中:to /一个时间片终止,应去执行p,显示“* the p is running” ,x移到优先级0 就绪队列的结尾新的优先级为 0 的就绪队列截图如下:下面的两条指令分别为当前进程申请资源,申请不到足够的资源,相应进程就会进入堵塞队列;req R3 1 /p 申请 1 个 R3,但 R3已经全部给了 q,因此 p 被堵塞,进入堵塞队列,当前转去执行原先在 p 后的 q 进程,显示“* the q is running”显示及堵塞队列如下:名师归纳总结 req R4 2 /q申请 2 个 R4,但 R4已经只剩下1 个,因此 q 被堵塞, 进入堵塞队列,第 11 页,共 18 页当前转去执行原先在q 后的 r 进程,显示“* the r is running”- - - - - - -精选学习资料 - - - - - - - - - req R2 2 /r申请 2 个 R2,但 R2已经只剩下1 个,因此 r 被堵塞, 进入堵塞队列,当前转去执行原先在r 后的 x 进程,显示“* the x is running”以上两步过后,堵塞队列及就绪队列截图如下:to /一个时间片终止,就绪队列中只有x,因此仍旧执行x,显示“* the x is running ”de q / 撤销 q 进程,将释放 q 进程占用的 3 个 R3资源,前面由于申请不到 R3 资源而被堵塞的 p 进程将重新回到就绪队列,位于 x 的后面,显示不变to / 一个时间片终止,应去执行 p,显示“* the p is running”to / 一个时间片终止,应去执行 x,显示“* the x is running”经过以上四条指令,就绪队列中优先级 0 的队列中应依次为 x、p,堵塞队列中应当只有 r ,如以下图:至此,具体的每步分析完毕,试验胜利;十、试验结论:本次试验过程中, 我组成员分工明确, 在娴熟把握课堂学问的基础上,使用c 语言模拟了操作系统对进程和资源的治理,胜利地实现了基于优先级和时间片轮转的抢占式调度算法,试验结果与预期相同,很好地完成了本次试验 十一、总结及心得体会:(1) 链表、指针的把握和应用特别重要;(2) 将总的任务划分成各个模块, 实现各个模块后再总体实现, 可以提高效率;(3) 在程序中增加一些出错处理的提示信息,有利于提高调试过程的效率;十二、对本试验过程及方法、手段的改良建议:可以增加难度更大的功能,如模拟进程中断后,返回断点连续执行等;报告评分:指导老师签字:名师归纳总结 - - - - - - -第 12 页,共 18 页精选学习资料 - - - - - - - - - 电 子 科 技 大 学实验报告同学:郫县 LBJ 学号:指导老师:温顺可爱的刘杰彦试验地点:主楼A2-413 试验时间: 2022 年 6 月 2 日一、 试验室名称:电脑学院主楼机房二、 试验项目名称:内存地址转化试验三、 试验学时: 2 四、 试验原理:(一) 规律地址到线性地址的转换1、 规律地址、段标识符、索引号、线性地址等概念;GDT、LDT、T1 字段、段描述符、 Base 字段、2、 GDTR、LDTR等相关寄存器学问;以上两条在试验指导书中很具体,篇幅较长,不做粘贴了3、 规律地址到线性地址的转换过程从规律地址到线性地址的转换过程,如以下图所示以 T1=1 为例,此时从段挑选符中别离出段描述符和 T1 字段, T1=1,说明段描述符存放在 LDT 中;1从 GDTR 中获得 GDT 的地址,从 LDTR 中获得 LDT 在 GDT 中的偏移量,查找 GDT,从中猎取 LDT 的起始地址;2从 DS 中的高 13 位猎取 DS 段在 LDT 中索引位置,查找 LDT ,猎取 DS段的段描述符,从而猎取 DS 段的基地址;3依据 DS 段的基地址段内偏移量,猎取所需单元的线性地址;名师归纳总结 - - - - - - -第 13 页,共 18 页精选学习资料 - - - - - - - - - 、(二) 线性地址到物理地址的转换1、 物理地址的概念;不做粘贴了2、 将线性地址转换成物理地址的步骤:1 、由于页目录表的地址放在CPU的 cr3 寄存器中,因此第一从cr3 中取出进程的页目录表地址 操作系统负责在调度进程的时候,应寄存器;已经把这个地址装入对2 、依据线性地址前十位,在页目录表中,找到对应的索引项,由于引入了 二级治理模式,页目录中的项,不是页的地址,而是一个页表的起始地址;3 、查找页表, 依据线性地址的中间十位, 在页表中找到数据页的起始地址;4 、将页的起始地址与页内偏移量即线性地址中最终 终我们想要的物理地址;五、 试验目的:1把握电脑的寻址过程2把握页式地址地址转换过程3把握电脑各种寄存器的用法六、 试验内容:12 位相加,得到最本试验运行一个设置了全局变量的循环程序,通过查看段寄存器,LDT表,GDT表等信息,经过一系列段、页地址转换,找到程序中该全局变量的物理地址;七、 试验器材设备、元器件:电脑、 Linux 内核 +Bochs 虚拟机八、 试验步骤:名师归纳总结 - - - - - - -第 14 页,共 18 页精选学习资料 - - - - - - - - - 1、 点击 bochs.exe 安装 bochs;2、 拷贝bootimage-0.11-hd、diska.img、hdc-0.11-new.img、mybochsrc-hd.bxrc至安装目录;3、 在安装目录中找到bochsdbg.exe 程序,并运行;4、 在弹出的界面中,点击“Load” 加载配置文件“mybochsrc-hd.bxrc ” ;随后,点击“Start ” 启动 Bochs 虚拟机;5、 虚拟机启动后,显现两个窗口,一个为Bochs 掌握窗口 Console,另一个为 Linux 操作系统运行窗口主显示窗口 Display ;6、 在掌握窗口输入“c” 后回车,加载 Linux 操作系统;7、 在 Linux 操作系统中,使用 vi 工具编写 mytest2.c 源文件;随后执行“gcc -o mytest2 mytest2.c” 命令编译并生成“mytest2 ” 可执行文件;试验中所使用的 C语言代码如下:#include <stdio.h> int j =0x123456;int main printf "the address of j is 0x%xn",&j ;while j ; printf "program terminated normally.n"return0 ;8、 在 Linux 操作系统中,运行“./mytest2 ” 可执行文件,结果如下:名师归纳总结 - - - - - - -第 15 页,共 18 页精选学习资料 - - - - - - - - - 由此可以看出,在“会被执行;while j ” 处进入死循环,程序的其次条输出语句不9、 先关闭 bochs 和虚拟机,再,挑选 debugger,点击 start ,在 console 界面输入 c 后回车,在 display界面中再次输入 ./mytest2 ,运行之前写好分程序,再回到 console 界面进行 Ctrl+c 操作:10、在掌握窗口中输入 sreg 命令,查看段的具体信息;依据 ds 段的信息是可以确定索引号为标蓝的13 位,即索引号为02H,TI 为标红的 1 位,对应TI=1,因此可知段描述符放在LDT 中,并且为 LDT表的第三项;0x0017=0000 0000 0001 0 111B 11、查看 LDTR寄存器,其中存放了 LDT在 GDT的位置,可知索引号为标蓝的13 位,即索引为 0DH,表示 LDT起始地址存放在 GDT的第 14 项;0x0068=0000 0000 0110 1 000B 12、查看 GDTR寄存器,其中存放了GDT在内存中的起始地址5CB8H:13、由上图可知, GDT在内存中的起始地址为5CB8H,由于每一个段描述符由8 个字节组成,就 LDT的首地址为:GDTR+0x0D*8 = 0x5CB8 + 0x0D*8 = 0x5D20 名师归纳总结 执行 xp /2w 0x5cb8+0x0d*8 ,查看 GDT中对应的表项,得到LDT段描述符:第 16 页,共 18 页- - - - -

    注意事项

    本文(2022年电子科大-计算机-操作系统实验报告-2014级 .docx)为本站会员(C****o)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

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

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开