操作系统论文06300new_第1页
操作系统论文06300new_第2页
操作系统论文06300new_第3页
操作系统论文06300new_第4页
操作系统论文06300new_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、郑州轻工业学院课 程 设 计 任 务 书题目 非windows操作系统功能管理 专业、班级 计科08-1 学号 200707010117 姓名 金勋 主要内容、基本要求、主要参考资料等: 请选择一个在课程中没有讨论到的现代操作系统,如Apple Macintosh, IBM OS/400等,写一篇文章概述该系统如何进行设备管理、文件管理、进程管理和内存管理。不必给出对操作系统本身的严格分析。 完 成 期 限: 10课时 指导教师签名: 课程负责人签名: 2011年07月 01日目录一 摘要- 3 -二正文- 4 -2.1 Linux内存- 4 - 2.1.1 Linux操作系统内存管理- 4

2、- 2.1.2 Linux存储管理的基本框架- 4 - 2.1.3 Linux对虚拟内存的管理- 5 - 2.1.4 Linux对物理内存的管理- 6 - 2.1.5 缓存和刷新机制- 7 - 2.1.6 小结- 9 -2.2 进程调度- 10 - 2.2.1 Unix进程调度- 11 - 2.2.2 Linux的进程调度- 12 - 2.2.3 小结- 16 -四关键字- 16 -五参考文献- 16 -1 摘要1.1Linux支持虚拟内存, 就是使用磁盘作为RAM的扩展,使可用内存相应地有效扩大。核心把当前不用的内存块存到硬盘,腾出内存给其他目的。当原来的内容又要使用时,再读回内存。这对用户

3、全透明:运行于Linux的程序只看到大量的可用内存而不甘心哪部分在磁盘上。当然,读写硬盘比真的内存慢(慢千倍),所以程序运行较慢。用做虚拟内存的这部分硬盘叫对换空间。Linux可以使用文件系统中的普通文件或单独的分区作为对换空间。对换分区更快,但对换文件更易于改变大小(无须对硬盘重分区)。如果知道要多少对换空间,应该用对换分区;如果不能确认,可以先用对换文件,用一段时间后再根据所需空间建立对换分区。Linux允许同时使用多个对换分区和/或对换文件。即如果偶尔需要更多的对换空间,可以随时建立一个额外的对换文件。1.2以Linux ,Unix ,Windows操作系统为例,分析其进程调度策略,以期

4、对进程调度过程有更深层次的认识二正文2.1 Linux内存2.1.1 Linux操作系统内存管理Linux是一个遵循POSIX(Portable Operating System Interface)标准的操作系统,它继承了UNIX系统优秀的设计思想,拥有简练、容错强、高效而且稳定的内核。此外Linux还具备其他操作系统所不能比拟的优点。:完全免费;:内核源代码完全公开。Linux内核拥有一个功能完备的内存管理子系统,它增加了对NUMA(非均匀存储结构)体系结构的支持并且使用了基于区(ZONE)的物理内存管理方法,从而保持了物理上连续分布、而逻辑上统一的内存模式和传统的共享内存编程模型,使得系

5、统的性能得以极大的扩展。这样Linux不仅能够满足传统的桌面应用,而且还能满足高端服务器市场的需要。目前,Linux不仅在Internet服务器上表现出色,而且还可以胜任大型数据库系统的服务器。 2.1.2 Linux存储管理的基本框架 Linux内核采用虚拟页式存储管理,采用三次映射机制实现从线性地址到物理地址的映射。其中PGD为页面目录,PMD为中间目录,PT为页面表。具体的映射过程为:从CR3寄存器中找到PGD基地址;以线性地址的最高位段为下标,在PGD中找到指向PMD的指针;以线性地址的次位段为下标,在PMD中找到指向PT的指针;同理,在PT中找到指向页面的指针;线性地址的最后位段,为

6、在此页中的偏移量,这样就完成了从线性地址到物理地址的映射过程。 32位的微机平台如Intel的X86采用段页式的两层映射机制,而64位的微处理器采用三级分页。对于传统的32位平台,Linux采用让PMD(中间目录)全0来消除中间目录域,这样就把Linux逻辑上的三层映射模型落实到X86结构物理上的二层映射,从而保证了Linux对多种硬件平台的支持。 2.1.3 Linux对虚拟内存的管理 虚拟内存不仅可以解决内存容量的问题,还可以提供以下附加的功能:大地址空间;进程保护;内存映射;灵活的物理内存分配;共享虚拟内存。Linux对虚拟内存的管理以进程为基础。32位的线性地址映射的4G的虚拟空间中,

7、从0XC0000000到0XFFFFFFFF的1G空间为所用进程所共享的内核空间,每个进程都有自己的3G用户空间。Linux的虚拟内存管理需要各种机制的支持,首先内存管理程序通过映射机制把用户程序的逻辑地址映射到物理地址,在用户程序运行时时如果发现程序中要用的虚拟地址没有对应的物理地址,就发出请页要求:如果有空闲的内存可供分配,就请求分配内存,并把正在使用的物理页记录在页缓存中,如果没有足够的内存分配,就调用交换机制,腾出一部分内存。另外在地址映射中要通过TLB(翻译后援存储器)来寻找物理页,交换机制中要用到交换缓存,并且把物理页内容交换到交换文件中也要修改页表来映射文件地址。一个进程的虚拟地

8、址映射靠三个数据结构来描述:mm_struct、vm_area_struct、page。其中mm_struct结构用来描述一个进程的虚拟内存;vm_area_struct描述一个进程的虚拟地址区域,在这个区域中的所有页面具有相同的访问权限和一些属性;page描述一个具体的物理页面。 当进程通过系统调用动态分配内存时,Linux首先分配一个vm_area_struct结构,并链接到进程的虚拟内存链表,当后续指令访问这一内存区域时,产生缺页异常。系统处理时,通过分析缺页原因、操作权限之后,如果页面在交换文件中,则进入do_page_fault()中恢复映射的代码,重新建立映射关系。如果因为页面不再

9、内存中,则Linux会分配新的物理页,并建立映射关系。 当物理内存出现不足时,就需要换出一些页面。Linux采用LRU(Least Recently Used最近最少使用)页面置换算法选择需要从系统中换出的页面。系统中每个页面都有一个“age”属性,这个属性会在页面被访问的时候改变。Linux根据这个属性选择要回收的页面,同时为了避免页面“抖动”(即刚释放的页面又被访问),将页面的换出和内存页面的释放分两步来做,而在真正释放的时候仅仅只写回“脏”页面。这一任务由交换守护进程kswapd完成。free_pages_high,free_pages_low是衡量系统中现有空闲页的标准,当系统中空闲页

10、的数量少于free_pages_high,甚至少于free_pages_low时,kswapd进程会采用三种方法来减少系统正在使用的物理页的数量。调用shrink_mmap()减少buffer cache和page cache的大小;调用shm_swap()将system V共享内存页交换到物理内存;调用swap_out()交换或丢弃页。 2.1.4 Linux对物理内存的管理 Linux2.4内核加入了对NUMA的支持,如果系统是NUMA结构的处理机系统,则物理内存被划分为三个层次来管理:存储节点(Node),管理区(Zone),页面(Page)。处理器的本地内存组成的区域叫做一个节点(No

11、de),它通过pglist_data数据结构来描述。各个节点的物理内存根据不同的作用又分为ZONE_DMA、ZONE_NORMAL、ZONE_HIGH,ZONE_DMA面积小,且专供DMA使用,ZONE_NORMAL则供大多数的程序使用,对于ZONE_HIGH仅仅只有页面缓存以及用户进程能够使用该区域的空间。每个管理区对应一个free_area数组来组织空闲页面队列,该数组的每一项描述某一种页块的信息,第一个元素描述大小为1页的内存块的信息,第二个元素描述大小为2 页的内存块的信息,依此类推,所描述的页块大小以 2 的倍数增加。free_area 数组的定义如下: Typedef struct

12、 free_area_struct Struct list_head free_list; Unsigned int *map; free_area_t; list_head是一个双向指针结构,在这里用于将物理页块结构mem_map_t 连结成一个双向链表,而map则是记录这种页块组分配情况的位图,例如,位图的第N位为1,表明第N个页块是空闲的。页分配代码使用向量表free_area来分配和回收物理页。系统初始化时,free_area数组也被赋了初值。也就是说,系统中所有可用的空闲物理页块都已经被加到了free_area数组中。 Linux使用Buddy最先匹配算法来进行页面的分配和回收,并且

13、必须按2的幂次方进行分配。比如要分配大小为2k的空闲块,如果系统中有足够的空闲块,页面分配代码首先在free_area中查找相应大小的空闲块,如果找到则分配。如果没有则查找下一尺寸(2倍于请求大小)的页面块,继续这一过程直到找到可以分配的页面,按要求分配之后,将剩余的空闲块仍然按照2的幂次方划分后链入适当的空闲块中。与分配算法相反,页面回收时总是试图将相邻的空闲页面组合成更大尺寸的空闲块。这里先给出“伙伴”要满足的三个条件:两个块大小相同;两个块物理地址连续;两个块从同一大块中分离出来。在用户释放内存时,判断“伙伴”是否是空闲块。若否,则只要将释放的空闲块简单的插入相应的free_area中。

14、若是,则需要在free_area中删除其伙伴关系,然后再判断合并后的空闲块的伙伴关系,依次重复,直到归并后的空闲块没有伙伴关系或合并到最大块时将其插入到free_area中。 2.1.5 缓存和刷新机制 与存取(真正的)内存相比,从磁盘读是很慢的 另外,在相对短的一端时间里,多次读硬盘相同的部分是很常见的。例如,你可能先读了一封电子邮件,然后回复时又将它读入编辑器,然后复制它到一个文件夹时又用邮件程序读它。或者,考虑命令ls 可能被系统上的很多用户多么频繁地使用。只从磁盘读一次信息,并保持在硬盘中,知道不再需要,除了第一次读,其他都会较快。这就叫磁盘缓存disk buffering,用于此目的

15、的内存叫buffer cache。 不幸的是,由于内存是有限且缺乏的资源,buffer cache一般不会足够大(大到能够装下所有人可能用到的数据)。当cache满时,最长时间不用的数据将被丢弃,内存释放给最新的数据。 磁盘缓冲也用于写操作。要写的数据经常马上又被读(例如一个源代码文件保存到文件中后又被编译器读出),所以将要写的数据放在缓冲里是个好主意。另外,只将数据放如cache而不马上写到磁盘,写操作的程序执行速度更快。写操作然后可以在后台完成,而不降低其他程序的速度。 许多操作系统有buffer caches (即使名称不同),但并非都根据上述原理。有些是透写write-through:

16、 数据马上写到磁盘(当然也同时写到cache) 不马上写的cache叫回写write-back。回写比透写更有效,但也更容易出错:如果系统崩溃,或电源突然掉电,或软盘在cache回写前被取出,那么cache中改变的数据将丢失。这可能意味着文件系统is not in full working order, 可能由于未写数据包含了系统记录信息的重要的变化。 因此,千万不要不经过正常的关闭过程直接关闭电源, 或没有unmount就取出软盘(如果是mount的),或什么程序还在用着软盘,或软盘灯还在闪。 sync 命令刷新缓冲,即强制将所有未写数据写回磁盘,如果要确保所有数据安全回写,可以用它。传统的

17、UNIX系统中,有个update 程序在后台运行,它每30秒运行一次 sync ,所以通常无须使用sync 。 Linux有一个另外的守侯程序bdflush ,它克服了sync 有时因磁盘I/O负荷太重(因为频繁的操作)而导致有时系统突然呆住的问题。 Linux下,bdflush 由update 启动。一般无须考虑它,但如果bdflush 偶尔因为什么原因死了,核心会给出警告,此时应该手工启动它(/sbin/update )。 cache并不真正缓冲文件,而是块,就是磁盘I/O的最小单元(Linux下,一般是1kB)。这样,所有的目录、超级块、其他文件系统记录数据和无文件系统磁盘都可以被缓冲。

18、 cache的效果决定于其大小。太小的cache几乎无用;它只能cache很少的数据,而可能在被重用前就被清除了。大小有赖于有多少数据被读写,相同的数据的存取频度。唯一的方法是实验。 如果cache是固定大小,那么不应该太大,否则,会由于空闲内存空间太小而使用swap(也很慢)。为了最有效地使用真实内存,Linux自动使用所有空闲内存作为buffer cache,当程序需要更多内存时,自动减少cache。 Linux下,对cache使用无须做任何工作,它完全是自动的。除了要正常关闭系统和取出软盘,无须关心cache。为了更好的发挥系统性能,Linux采用了一系列和内存管理相关的高速缓存机制:

19、缓冲区高速缓存:包含了从设备中读取的数据块或写入设备的数据块。缓冲区高速缓存由设备标示号和块索引,因此可以快速找到数据块。如果数据可以在缓冲区中高速缓存中找到,则不需要从物理块设备上读取,从而加快了访问速度。 页高速缓存:这一高速缓存用来加速对磁盘上的映像和数据访问,它用来缓存某个文件的逻辑内容,并通过文件VFS索引节点和偏移量访问。当页从磁盘读到物理内存时,就缓存在页高速缓存。 交换高速缓存:用于多个近程共享的页面被换出到交换区的情况。当页面交换到交换文件之后,如果有进程再次访问,它会被重新调入内存。 2.1.6 小结 Linux是近年来应用的比较多的一个操作系统,广泛应用于各个行业。而且由

20、于全世界计算机爱好者的支持,Linux也成为世界上发展最快的操作系统。在Linux2.6内核中,对存储管理子系统进行了一系列的改进,提高了系统的可扩展性,包含了对大型服务器如NUMA服务器和Intel服务器的良好支持。此外,Linux2.6还提供了对无MMU的支持。可见Linux正在不断的加强对高端服务器领域以及嵌入式领域的支持。 Linux在其发展过程中不断的在完善和优化内存管理单元的功能和性能。针对具体领域,我们可以根据自己的需要定制Linux内核。而内存管理单元作为Linux操作系统的核心部分,在整个系统的运行过程中发挥着举足轻重的作用。 2.2 进程调度2.2.1 Unix进程调度 进

21、程是程序的执行系统中活动的实体. 在UNIX系统中进程被定义为映像的执行. 映像是计算机的执行环境,它包括各种寄存器及存储器的值、打开文件的状态及现行目录等等.进程映像的组成部分:寄存器、进程控制块proc结构和user 结构、进程数据区ppda (共享正文段(由text 结构控制) 、数据段和栈段( 含用户栈和核心栈) ) . 对于一个进程的映像来说,proc 结构、进程页表、text 结构是常驻内存的,而user 结构、正文段、数据段是非常驻内存部分. 它们在用户虚拟空间形成一个整体,一起换进换出. 在Unix操作系统中,所以的程序,不论是用户级上还是在内核级上执行的,都出现在某个进程的现

22、场内,所有的用户程序都在它们自己的进程现场中运行。当这些用户进程通过系统调用请求内核服务的时候,实现该系统调用的内核代码继续在请求进程的现场内执行,这就能让内核方便的访问进程的所有状态及其他地址空间。它还提供了一种代表用户程序记录内核执行的当前状态的方式。例如,如果需要挂起一次系统调用的执行来等待I/O操作完成,那么内核有关系统调用处理的状态就要保存在进程中。 因为系统的所有活动,无论是用户级上的还是内核级上的,都发生在某个进程的现场内,所有UNIX内核只调度需要执行的进程。当使用传统的分时调度策略的时候,在用户级执行的进程不会被分入时间内执行。只有当前的内核进程明确允许的情况下,才能切换到在

23、内核执行的另一个进程。 UNIX进程调度机制问量 在传统Unix中进程优先级的设置是通过nice和set priority完成的;但不幸的是,速两种系统调用无法使用最高优先级的进程得以立即进行,这是因为在循环调度(时间片调度)机制下当进程的时闻片用完后不论扰先级如何都让出CPU另外,由于它是非抢占式内核,优先级高的进程不能立即打断当前正在运行的进程,获得CPU资源这对一些要求进程立即抢占CPU,并且一次运行完成的实时应用是不能满足要求的 UNIX系统是一个多用户分时系统,其分时性是通过对用户进程频繁的调度来实现的,系统的调度程序分成两部分,即处理机调度程序( swtch) 和进程对换程序(sc

24、hed) . 在这里我涉及的是处理机调度程序.在如下几种情况下会调用处理机调度程序: (1) 若一个进程已到达它不能超过的某个点,这时它就要调用“sleep”,而“sleep”则调用“swtch”; (2) 一个在核心态下运行的进程,当它将要转入用户态之前,会测试变量“runrun”,如果其值非0 ,则意味着更高优先权的进程已为运行准备就绪. 此时核心态进程也将调用“swtch”.UNIX进程调度策略是基于动态优先数,优先数的设置有如下特点: swtch 由“trap”、“sleep”、“expand”、“exit”、“stop”、“xalloc”调用. 它是一个非常特殊的过程,分为三段执行,

25、涉及3 个核心态进程.第一阶段属于当前进程的部分,若当前进程不是进程0 ,则调用savu 过程将当前进程的环境变量保存在u. u- rsav. 调用retu 过程恢复进程0 的环境变量.第二阶段属于进程0 ,首先清runrun 标志,该标志指示一个较当前进程具有更高优先权的进程已为运行准备就绪.swtch通过do循环寻找最高优先权进程(重新计算各进程的优先级) . 若找到了满足条件的就绪进程,则将其从就绪队列中取出,并将该进程的优先级设置为当前的优先级curpri.第三阶段属于被选中的进程. 该进程已成为当前进程开始运行,根据该进程的SSWAP 标志是否设置,调用aretu 过程从u. u-s

26、sav 中恢复进程的环境变量(r5 和r6) .程序发现某进程优先级高于当前运行进程的优先级时,就要设置该标志,而在中断陷入处理程序结束之前,检查该标志是否设置,若已设置则调用swtch()程序进行调度,另外,在时钟中断处理中每隔1 秒也将runrun 标志设置一次,并通过软件中断方式,执行swtch() 程序,这是为了增加调度机会,保证良好的分时性.Swtch 程序调用了savu、retu、idle、aretu 等过程。savu 程序的作用:这是一个汇编语言过程,它将r5 和r6 的值存放到一个数组中,该数组的地址作为一个参数传递至savu ;retu 程序的作用:汇编语言过程,它复位第七个

27、核心态段地址寄存器,然后从“u. u- rsa”最新可存取副本中复位r6 和r5 ;aretu 程序的作用:汇编语言过程,它从作为参数传递过来的地址重装r5 和r6 ;idle 程序的作用:汇编语言过程,让处理机空转等待.swtch 程序功能强大而其程序代码简洁精练(共71行代码,其中注释语句等有30 行,有效代码是41行) ,这也是整个UNIX系统代码的突出的特点.Unix系统是多用户,多任务的操作系统,它通过向进程提供与机器无关的抽象服务,从而在Unix实现之间提供了高度的程序的可移植性。程序的执行被限制在保持程序当前状态的进程内,这些状态包括虚拟地址空间,程序的变量值以及硬件状态。内核给

28、每个进程提供了一个环境让这个环境显得好像该进程是系统中正在执行的唯一进程那样。这主要是赋予每个进程自己的虚拟地址空间来实现的。系统调用可以创建新进程,改变进程正在执行的程序,以及终止进程,还可以使用其他许多系统调用,其中包括动态分配未初始化数据的系统调用。 2.2.2 Linux的进程调度 传统Unix操作系统的调度算法必须实现几个互相冲突的目标:进程响应时间尽可能快,后台作业的吞吐量尽可能高,进程的饥饿现象尽可能避免,低优先级和高优先级进程的需要尽可能调和等等。决定什么时候以怎样的方式选择一个新进程运行的这组规则就是所谓的调度策略(scheduling policy)。 Linux的进程调度

29、是基于分时技术(time-sharing)。允许多个进程“并发”运行就意味着CPU 的时间被粗略地分成“片”,给每个可运行进程分配一片。 当然,单处理器在任何给定的时刻只能运行一个进程。当一个并发执行的进程其时间片或时限(quantum)到期时还没有终止,进程切换就可以发生。分时依赖于定时中断,因此,对进程是透明的。为保证CPU 分时,不需要在程序中插入额外的代码。 调度策略也是基于依照优先级排队的进程。有时用复杂的算法求出进程当前的优先级,但最后的结果是相同的:每个进程都与一个值相关联,这个值表示把进程如何适当地分配给CPU。在Linux 中,进程的优先级是动态的。调度程序跟踪进程做了些什么

30、,并周期性地调整它们的优先级。在这种方式下,在较长的时间间隔内没有使用CPU的进程,通过动态地增加它们的优先级来提升它们。相应地,对于已经在CPU上运行了较长时间的进程,通过减少它们的优先级来处罚它们。每个进程在创建之初有一个基本的优先级,执行期间调度系统会动态调整它的优先级,交互性高的任务会获得一个高的动态优先级,而交互性低的任务获得一个低的动态优先级。 当谈及有关调度问题时,传统上把进程分类为“I/O 范围(I/O-bound)”或“CPU范围(CPU-bound)”。前者频繁地使用I/O 设备,并花费很多时间等待I/O操作的完成;而后者是需要大量CPU 时间的数值计算应用程序。Linux

31、操作系统支持多进程,进程控制块PCB(Process Control Block)是系统中最为重要的数据结构之一。用来存放进程所必需的各种信息,PCB用结构taskstruct来表示,包括进程的类型、进程状态、优先级、时钟信息等。Linux系统中,进程调度操作由schedule()函数执行,这是一个只在内核态运行的函数,函数代码为所有进程共享。 Linux进程调度时机 Linux的进程调度时机与现代操作系统中的调度时机基本一致,为了判断是否可以执行内核的进程调度程序来调度进程,Linux中设置了进程调度标志needresched,当标志为1时,可执行调度程序通常,Linux调度时机分以下两种情

32、况:(1)主动调度:指显式调用schedule()函数明确释放CPU,引起新一轮调度一般发生在当前进程状态改变,如:进程终止、进程睡眠、进程对某些信号处理过程中等(2)被动调度:指不显示调用schedule()函数,只是PCB中的need_resched进程调度标志,该域置位为1将引起新的进程调度,而每当中断处理和系统调用返回时,核心调度程序都会主动查询needresched的状态(若置位,则主动调用schedule()函数。一般发生在新的进程产生时、某个进程优先级改变时、某个进程等待的资源可用被唤醒时、当前进程时间片用完等Linux进程调度策略 一般来说,不同用途的操作系统的调度策略是不同的

33、,Linux进程调度是将优先级调度、时间片轮转法调度、先进先出调度综合起来应用Linux系统中。不同类型的进程调度策略也不一样。 1与进程调度相关的数据结构 每个进程都是一个动态的个体,其生命周期依次定义的数据结构为:TASKRUNNING,TASKINTERRUPTIBLE。TASKUNINTERRUPTIBLE,TASKZOMBIE和TASKSTOPPED,一个进程在其生存期间,状态会发生多次变化。与其数据结构相对应的即是Linux进程的状态,分别是:运行态、等待态、暂停态和僵死态。 2进程状态及其转换过程的描述 进程创建时的状态为不可打断睡眠,在dofork()结束前被父进程唤醒后。变为

34、执行状态,处于执行状态的进程被移到runqueue就绪任务队列中等待调度。适当时候由schedule0按调度算法选中,获得CPU,若采用轮转法,即时,由时钟中断触发timerinterrupt(),其内部调用schedule(),引起新一轮调度,当前进程的状态仍处于执行状态,因而把当前进程挂蛰Jruilqueue队尾。获得CPU且正在运行的进程若申请不到某资源。则调用sleepon()或interruptiblesleepon()睡眠,其taskstruct进程控制块挂到相应资源的waitqueue等待队列如果调用sleepon()。则其状态变为不可打断睡眠,如果调用interruptiblesleepon(),则其状态变为可打断睡眠,Sleepon()或interruptiblesleepon()将调用schedule()函数把睡眠进程释放。 3.进程分类和相应的进程调度策略Linux系统中,为了高效地调度进程,将进程分威两类:实时进程和普通进程(又

温馨提示

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

评论

0/150

提交评论