固定分区存储管理

合集下载

分区存储管理

分区存储管理
分区存储管理
1、单用户连续分区存储管理
单一连续分区:把内存储器分为两个区,一个分区固定分配给操 作系统使用,另一个分配给用户使用,称作“用户区” 系统特点:1、系统总是把整个用户区分配给一个用户使用 2、内存用户区又被分为“使用区”和“空闲区”两部分 3、当作业被调度时就获得全部空间 4、作业运行完后,全部主存空间又恢复成空闲(以上所指 的全部主存空间是全部用户区空间) 对于连续区分配而言,虽然这种管理方案不需要专门的硬件,但是应 有硬件保护机构,以确保用户程序不至于偶然或无意地干扰系统区中 的信息 使用界限寄存器的方法。界限寄存器中存放用户程序的起始地址 和终止地址,作业运行时,检查访问指令或数据的地址,若不在界限 寄存器所框住的范围内,则发生越界中断。

区 1 2 3 4

起 始 地 址 20KB 28KB 60KB 124KB
长 8KB 32KB 64KB

使 用 标 志 作业1 作业6 0 作业2
132KB
地址重定位与存储保护
在采用固定分区存储管理这种存储管理方式时,应该对程序实行静态 重定位。不仅要防止用户程序对操作系统形成的侵扰,也要防止用户程序 与用户程序之间形成的侵扰。因此必须在CPU中设置一对专用的寄存器,用 于存储保护。
3、可变分区存储管理
内存的分配:内存不是预先划分好的,而是当作业装入时,根据作业的需求和内 存空间的使用情况来决定是否分配。若有足够的空间,则按需要分割与作业相对 地址空间同样大小分区给该进程;否则令其等待主存空间
最先适应算法
最佳适应算法
最坏ቤተ መጻሕፍቲ ባይዱ应算法
2、固定分区存储管理
“固定分区”存储管理的基本思想:预先把内存储器中可供分配的 用户区事先划分成若干个连续的分区,每个分区的尺寸可以相同, 也可以不同。划分后,内存储器中分区的个数以及每个分区的位置、 尺寸保持不变。每个分区中只允许装入一个作业运行。

3.1 固定分区存储管理

3.1 固定分区存储管理

六安职业技术学院教案2008~2009学年度第 1 学期编号__8__信息工程系计算机教研室任课教师曹维祥课程名称操作系统授课班级:应0701、02,维0701,软0701 授课日期:10.27~11.2课型:理论课课时安排:2课时教学内容:3.1 固定分区存储管理3.2 可变分区存储管理教学目标:1.掌握绝对地址、相对地址等概念2.理解地址重定位的作用及静态和动态重定位的异同3.掌握外部碎片、内部碎片的概念4. 掌握单一连续分区、固定分区、可变分区存储管理教学重点:1.绝对地址、相对地址等概念2.地址重定位的作用3. 外部碎片、内部碎片的概念4.单一连续分区、固定分区、可变分区存储管理教学难点:1.绝对地址、相对地址等概念2.地址重定位的作用教学方法:讲授教学用具:无教学过程:[复习]存储管理的功能[导入新课][新课]一、基本概念1.存储器的层次三级存储器结构(粗分):(1)寄存器――当前要执行的指令或要处理的数据(2)内存――正在运行的程序和相关数据(3)外存――“资料”长期保存CPU不能直接去存取外存上的信息,外存上的程序或数据必须先移到内存中,才能被CPU访问。

内存是一个大型的,由字节构成的一维数组,每一个单元都有自己的地址。

注:存储管理主要是对内存的管理、分配,涉及到的外存,也是对内存管理的支持。

2.地址重定位(1)物理地址(绝对地址)内存单元唯一的、真实的地址,CPU最终依据物理地址区分(存取)各单元。

(2)逻辑地址(相对地址)程序中相对本程序的“0”(开始)编址所产生的地址。

(3)地址空间地址集合物理地址空间――存储空间逻辑地址空间――地址空间(4)地址重定位相对地址转换为绝对地址的过程,称为地址重定位。

(5)为什么要地址重定位?多道程序下,编写程序时无法事先知道内存区域中哪一部分是空闲的,哪一部分已被占用,也就无法在程序中直接使用物理地址,但程序不可避免的要使用地址。

这之间有个矛盾,解决方法是编写(编译)程序时,使用相对地址,而在程序执行时(或者执行之前)将相对地址转换成绝对地址。

计算机操作系统第四章-存储器管理

计算机操作系统第四章-存储器管理

第四章存储器管理第0节存储管理概述一、存储器的层次结构1、在现代计算机系统中,存储器是信息处理的来源与归宿,占据重要位置。

但是,在现有技术条件下,任何一种存储装置,都无法从速度、容量、是否需要电源维持等多方面,同时满足用户的需求。

实际上它们组成了一个速度由快到慢,容量由小到大的存储装置层次。

2、各种存储器•寄存器、高速缓存Cache:少量的、非常快速、昂贵、需要电源维持、CPU可直接访问;•内存RAM:若干(千)兆字节、中等速度、中等价格、需要电源维持、CPU可直接访问;•磁盘高速缓存:存在于主存中;•磁盘:数千兆或数万兆字节、低速、价廉、不需要电源维持、CPU 不可直接访问;由操作系统协调这些存储器的使用。

二、存储管理的目的1、尽可能地方便用户;提高主存储器的使用效率,使主存储器在成本、速度和规模之间获得较好的权衡。

(注意cpu和主存储器,这两类资源管理的区别)2、存储管理的主要功能:•地址重定位•主存空间的分配与回收•主存空间的保护和共享•主存空间的扩充三、逻辑地址与物理地址1、逻辑地址(相对地址,虚地址):用户源程序经过编译/汇编、链接后,程序内每条指令、每个数据等信息,都会生成自己的地址。

●一个用户程序的所有逻辑地址组成这个程序的逻辑地址空间(也称地址空间)。

这个空间是以0为基址、线性或多维编址的。

2、物理地址(绝对地址,实地址):是一个实际内存单元(字节)的地址。

●计算机内所有内存单元的物理地址组成系统的物理地址空间,它是从0开始的、是一维的;●将用户程序被装进内存,一个程序所占有的所有内存单元的物理地址组成该程序的物理地址空间(也称存储空间)。

四、地址映射(变换、重定位)当程序被装进内存时,通常每个信息的逻辑地址和它的物理地址是不一致的,需要把逻辑地址转换为对应的物理地址----地址映射;地址映射分静态和动态两种方式。

1、静态地址重定位是程序装入时集中一次进行的地址变换计算。

物理地址= 重定位的首地址+ 逻辑地址•优点:简单,不需要硬件支持;•缺点:一个作业必须占据连续的存储空间;装入内存的作业一般不再移动;不能实现虚拟存储。

第3章习题解答

第3章习题解答

第3章(大本)习题解答一、填空1.将作业相对地址空间的相对地址转换成内存中的绝对地址的过程称为 地址重定位 。

2.使用覆盖与对换技术的主要目的是 提高内存的利用率 。

3.存储管理中,对存储空间的浪费是以 内部碎片 和 外部碎片 两种形式表现出来的。

4.地址重定位可分为 静态重定位 和 动态重定位 两种。

5.在可变分区存储管理中采用最佳适应算法时,最好按 尺寸 法来组织空闲分区链表。

6.在分页式存储管理的页表里,主要应该包含 页号 和 块号 两个信息。

7.静态重定位在程序 装入 时进行,动态重定位在程序 执行 时进行。

8.在分页式存储管理中,如果页面置换算法选择不当,则会使系统出现 抖动 现象。

9.在请求分页式存储管理中采用先进先出(FIFO )页面淘汰算法时,增加分配给作业的块数时, 缺页中断 的次数有可能会增加。

10.在请求分页式存储管理中,页面淘汰是由于 缺页 引起的。

11.在段页式存储管理中,每个用户作业有一个 段 表,每段都有一个 页 表。

二、选择1.虚拟存储器的最大容量是由 B 决定的。

A .内、外存容量之和B .计算机系统的地址结构C .作业的相对地址空间D .作业的绝对地址空间2.采用先进先出页面淘汰算法的系统中,一进程在内存占3块(开始为空),页面访问序列为1、2、3、4、1、2、5、1、2、3、4、5、6。

运行时会产生 D 次缺页中断。

A .7B .8C .9D .10 从图3-1中的“缺页计数”栏里可以看出应该选择D 。

1 2 3 4 1 2 5 1 2 3 4 5 6页面走向→ 3个内存块→缺页计数→图3-1 选择题2配图3.系统出现“抖动”现象的主要原因是由于 A 引起的。

A .置换算法选择不当B .交换的信息量太大C .内存容量不足D .采用页式存储管理策略 4.实现虚拟存储器的目的是 D 。

A .进行存储保护B .允许程序浮动C .允许程序移动D .扩充主存容量5.作业在执行中发生了缺页中断,那么经中断处理后,应返回执行B 指令。

分区管理的分配策略

分区管理的分配策略

分区管理的分配策略分区管理是计算机操作系统中的重要概念,它将计算机的存储空间划分为若干个逻辑分区,以便更有效地管理和利用存储资源。

分区管理的分配策略是指在进行存储资源分配时,系统采取的具体方法和规则。

本文将介绍几种常见的分配策略,并探讨它们的优缺点。

一、连续分配策略连续分配策略是最简单、最常见的分配策略之一。

它将存储空间划分为若干个连续的分区,每个分区大小相等或不等。

当有新的作业需要分配存储空间时,系统会按照作业所需大小选择合适的分区进行分配。

如果找不到合适大小的连续分区,则会出现外部碎片。

连续分配策略的优点是实现简单,但缺点是容易产生碎片,降低存储空间的利用率。

二、非连续分配策略非连续分配策略是为了解决连续分配策略中的碎片问题而提出的。

它将存储空间分为多个不连续的分区,每个分区大小可以不同。

非连续分配策略采用链表的方式记录每个分区的使用情况,当有新的作业需要分配存储空间时,系统会在链表中找到合适大小的空闲分区进行分配。

非连续分配策略的优点是解决了碎片问题,但缺点是实现复杂,分配效率较低。

三、固定分区分配策略固定分区分配策略是将存储空间分为若干个固定大小的分区。

每个分区大小固定,不会发生变化。

当有新的作业需要分配存储空间时,系统会选择合适大小的空闲分区进行分配。

固定分区分配策略的优点是简单易实现,但缺点是会出现内部碎片,降低存储空间的利用率。

四、动态分区分配策略动态分区分配策略是为了解决固定分区分配策略中的内部碎片问题而提出的。

它将存储空间分为若干个大小不等的动态分区,每个分区可以根据作业的需求进行调整。

当有新的作业需要分配存储空间时,系统会选择合适大小的空闲分区进行分配,并根据作业的大小调整分区的大小。

动态分区分配策略的优点是解决了内部碎片问题,但缺点是实现复杂,分配效率较低。

五、基于页的分配策略基于页的分配策略是在分区管理中引入了页面的概念。

它将存储空间划分为若干个固定大小的页面,每个页面大小相等。

操作系统存储管理实验报告

操作系统存储管理实验报告

操作系统存储管理实验报告一、实验目的操作系统的存储管理是计算机系统中非常重要的组成部分,它直接影响着系统的性能和资源利用率。

本次实验的目的在于深入理解操作系统中存储管理的基本原理和方法,通过实际操作和观察,掌握存储分配、回收、地址转换等关键技术,并对不同存储管理策略的性能进行分析和比较。

二、实验环境本次实验在 Windows 10 操作系统下进行,使用 Visual Studio 2019 作为编程环境,编程语言为 C++。

三、实验内容(一)固定分区存储管理1、原理固定分区存储管理将内存空间划分为若干个固定大小的分区,每个分区只能装入一道作业。

分区的大小可以相等,也可以不等。

2、实现创建一个固定大小的内存空间数组,模拟内存分区。

为每个分区设置状态标志(已分配或空闲),并实现作业的分配和回收算法。

3、实验结果与分析通过输入不同大小的作业请求,观察内存的分配和回收情况。

分析固定分区存储管理的优缺点,如内存利用率低、存在内部碎片等。

(二)可变分区存储管理1、原理可变分区存储管理根据作业的实际需求动态地划分内存空间,分区的大小和数量是可变的。

2、实现使用链表或数组来管理内存空间,记录每个分区的起始地址、大小和状态。

实现首次适应、最佳适应和最坏适应等分配算法,以及分区的合并和回收算法。

3、实验结果与分析比较不同分配算法的性能,如分配时间、内存利用率等。

观察内存碎片的产生和处理情况,分析可变分区存储管理的优缺点。

(三)页式存储管理1、原理页式存储管理将内存空间和作业都划分为固定大小的页,通过页表将逻辑地址转换为物理地址。

2、实现设计页表结构,实现逻辑地址到物理地址的转换算法。

模拟页面的调入和调出过程,处理缺页中断。

3、实验结果与分析测量页式存储管理的页面置换算法(如先进先出、最近最少使用等)的命中率,分析其对系统性能的影响。

探讨页大小的选择对存储管理的影响。

(四)段式存储管理1、原理段式存储管理将作业按照逻辑结构划分为若干个段,每个段有自己的名字和长度。

[操作系统]第3章 存储管理

[操作系统]第3章  存储管理

3.3.2 可变分区管理
1. 可变分区概念 可变分区/动态分区,与固定分区有三点不同: 1)分区的建立时刻 可变分区:在系统运行过程中,在作业装入时动态建立 固定分区:系统初启时建立。 2)分区的大小 可变分区:根据作业对内存的需求量而分配。 固定分区:事先设定,固定不变。 3)分区的个数 可变分区:变化不定。 固定分区:固定不变。
第3章 存储管理 章
本章研究的主要目的: 第一、要使主存得到充分、有效的利用; 第二、为用户提供方便的使用环境。
第3章 存储管理 章
3.1 3.2 3.3 3.4 3.5 3.6 3.7 3.8 概述 地址映射 分区管理 覆盖与交换 分页管理 分段管理 段页式管理 虚拟存储器管理
3.1 概述
存储器分类
作业调度时,根据内存需求,按一定的分区分 配算法,在PDT中查找空闲区,若满足,则进 行分配,并置该分区状态为1,表明已被占用。 作业执行完,回收内存时,回收的分区状态置 0,等待重新分配。
固定分区存在问题
简单易行但存在下列问题: 碎片 可接纳的作业大小受分区大小的限制 一般用在作业大小预先知道的专用系统中。
空白区表中的空白区按其容量以递减的次序排 列。查找分区说明表,找到第一个满足申请长 度的空闲区,分配并分割。剩余部分插入适当 位置。 最差适应算法:分割大空闲区后,还可以产生 较大的空闲区,空闲区均匀地减小,以避免碎 片。
④ 唯一最佳适应算法(single best fit) 分区按大小顺序分级(8KB、16KB、32 KB、…… ) 作业按请求容量也分成相应的存储级,仅当 PDT中相应级的分区为空闲时,才进行内存 分配,即使有更大的分区空闲也不予以分配。
分配策略/算法
① 首次/最先适应First fit:

计算机内存管理

计算机内存管理

计算机内存管理策略【摘要】本文从计算机的硬件结构和运行机理出发,导出计算机内存管理的重要性,并提出内存管理所要包含的4个方面内容。

然后以操作系统发展历史为主线,对单一连续分区存储管理、固定分区存储管理、可变分区存储管理、分页式存储管理、分段式存储管理5中内存管理方案进行分析,详细地介绍了各种管理策略具体实现以及各自的优劣。

在操作系统出现之前,程序曾经是存储在卡片上,计算机每读取一张卡片就执行一条指令,程序的执行过程是直接从卡片到执行。

这种从外部存储媒介上直接执行指令的做法效率极其低下,而且灵活性较差。

为了解决这一问题,人们想到将需要运行的程序预先加载到内部存储器,再自动从内部存取器读取指令并执行,从而提高计算机的效率与灵活性。

这一想法导致计算机硬件系统和软件系统都发生革命性的变化。

目前计算机硬件系统一般由处理机、存储系统和输入输出(I/O)系统构成。

其中存储系统用于存取包括程序代码和数据在内的各种信息,起到缓解负责执行程序的处理器与实现程序输入/输出系统之间速度严重不匹配的矛盾。

出于功用、性能、价格等方面的考虑,计算机存储系统并不是一个单独的存储器件,而是由不同的存储介质构成的一个复杂的多层次的存储体系,包括高速缓存、内存和外存。

高速缓存的由硬件寄存器组构成,其特点是速度最快、价格高、容量小,一般用于存放高频指令与数据;外存容量最大,价格也最低,但是读取速度相对很慢,主要用来存放程序的所有代码与数据,是程序与数据的持久完整集合;内存速度比高速缓存慢,但是比外存又快很多量级,价格适中,容量高于缓存而低于外存,用来存放操作系统内核、用户程序指令与程序运行所需数据,程序运行时,CPU直接从内存读取指令和数据。

尽管内存速度与处理器速度有一定差距,但是这种程序执行的方式仍然极大地提高了计算机的运行效率。

冯·诺依曼体系的计算机都要求程序首先装入内存才能运行,能否合理地使用内存很大程度上影响到整个计算机的正常运行以及系统性能。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

理工大学信息工程与自动化学院学生实验报告( 2013 —2014 学年第一学期)课程名称:操作系统开课实验室:信自楼444 2013年 11月28 日注:报告容按下列的要求进行。

一、实验目的通过编写固定分区存储管理的模拟程序,加深对操作系统存储管理功能中的固定分区管理方式、主存分配表等相应知识的理解。

通过编写和调试存储管理的模拟程序以加深对存储管理方案的理解,熟悉可变分区存储管理的存分配和回收。

二、实验题目1.设计一个固定分区分配的存储管理方案。

并模拟实现分区的分配和回收过程。

2.必须建立分区表,记录空闲区与占用区的状况。

3.流程图按选定的算法自己完成。

三、算法设计的思想或流程图本系统将存用户空间划分为五个大小不固定的分区,其分区大小由用户输入决定。

在每个分区只装入一道作业,这样把用户空间划分为几个分区,便允许几道作业并发运行。

当有一个空闲分区时,便可以从外存的后备队列中选择一个适当大小的作业装入该分区,当该作业结束时又可以从后备作业队列中找出另一作业调入该分区。

每个存空间是一个Node型的对象。

Node类有一个三个参数的构造函数。

分别为:分区号、起始地址、大小。

然后就是一些属性的get、set方法和一个打印其属性的函数。

四个数据域分别为:属性m_No用来表示该存空间的序号。

属性m_Addr用来表示存分区的起始地址。

属性m_Size用来表示存空间的大小。

属性m_State表示存空间的是否已分配的状态标志。

若该存空间已分配,m_TaskNo表示占有该存空间的任务序号。

否则没有实际意义。

在用户申请任务的存空间时,提示用户输入任务号和其需要的存空间大小。

流程图主程序:分配存空间算法:释放存空间算法四、算法设计的实现1、类设计本程序设计了两个比较简单的类:Node类和MManage类。

Node类主要是存放每个固定分区的一些信息。

而MManage类则主要是对Node类的容器List<Node>进行一些操作来实现要求的存空间的的分配和释放。

类设计的数据成员和接口如下:Node.h#ifndef NODE_H#define NODE_Hclass Node{public:Node(int No, int Addr, int Size);int getSize() const{return m_Size;}bool getState() const{return m_State;}int getTaskNo() const{return m_TaskNo;}void setState(bool State);void setTaskNo(int TaskNo);void print();private:int m_No;int m_Addr;int m_Size;bool m_State;int m_TaskNo;};#endif //NODE_HMManage.h#ifndef MMANAGE_H#define MMANAGE_H#include <vector>class Node;class MManage{public://MManage();MManage(int MLength);MManage(std::vector<Node> Nodes);void MAlloc();void MFree();void print();private:std::vector<Node> m_Nodes;};#endif//MMANAGE_H类接口实现和main函数的实现:Node.cpp#include <iostream>#include "Node.h"Node::Node(int No, int Addr, int Size) :m_No(No),m_Addr(Addr),m_Size(Size) {m_State = true;m_TaskNo = 0;}void Node::setTaskNo(int TaskNo){m_TaskNo = TaskNo;}void Node::setState(bool State){m_State = State;}void Node::print(){std::cout<<"| "<<m_No<<" || "<<m_Addr<<" || "<<m_Size<<" || ";if(m_State)std::cout<<"Idle ||"<<std::endl;elsestd::cout<<"Occupy || "<<m_TaskNo<<" ||"<<std::endl;}MManage.cpp#include <iostream>#include "MManag.h"#include "Node.h"#define MAXSIZE 100//class Node;/*MManage::MManage(){int sum;std::cout << "Please input the number of memory:";std::cin >> sum;std::cout << std::endl;MManage(sum);}*/MManage::MManage(int MNo){int size;int addr = 0;char yesOrNo = 'n';while ( yesOrNo != 'y' && yesOrNo != 'Y'){m_Nodes.clear();std::cout << "Start to init the memory table" << std::endl;for (int i=0; i<MNo; ++i){do{std::cout << "Please input the size of " << i+1 << "th memory:";std::cin >> size;}while(size >= MAXSIZE);Node node(i+1, addr, size);m_Nodes.push_back(node);addr+=size;}print();std::cout << "Is this correct?" << std::endl;std::cin >> yesOrNo;}}MManage::MManage(std::vector<Node> Nodes){m_Nodes.assign(Nodes.begin(), Nodes.end());}void MManage::MAlloc(){int taskNo, size;int No = -1;int temp1 = MAXSIZE;int temp2 = MAXSIZE;bool flag;do{flag=false;std::cout << "Please input the task No. and size" << std::endl;std::cin >> taskNo >> size;for(unsigned i=0; i<m_Nodes.size(); ++i){if(m_Nodes[i].getTaskNo() == taskNo){std::cout<<"This task areally exist,please change it"<<std::endl;flag = true;}if(size > MAXSIZE){std::cout<<"The size is too big,please change it"<<std::endl;flag = true;}}}while(flag);for(unsigned i=0; i<m_Nodes.size(); ++i){if(m_Nodes[i].getState()&&m_Nodes[i].getSize()>=size){temp2 = m_Nodes[i].getSize() - size;if(temp2<temp1){temp1 = temp2;No = i;}}}if(No==-1){std::cout << "Allocation fail." << std::endl;}else{std::cout << "Allocation success." << std::endl;m_Nodes[No].setState(false);m_Nodes[No].setTaskNo(taskNo);}}void MManage::MFree(){int taskNo,No=-1;std::cout << "Please input the task No." << std::endl;std::cin >> taskNo;for(unsigned i=0; i<m_Nodes.size(); ++i){if(m_Nodes[i].getTaskNo()==taskNo&&!m_Nodes[i].getState()){No = i;}}if(No==-1){std::cout << "Free fail(Can not find the task)." << std::endl;}else{std::cout << "Free success." << std::endl;m_Nodes[No].setState(true);m_Nodes[No].setTaskNo(0);}}void MManage::print(){std::cout << "The the memory table:" << std::endl;std::cout << "| No |" << "| Addr |" << "| Size |" << "| State |" << "| TaskNo |"<< std::endl;for (unsigned i=0; i<m_Nodes.size(); ++i)m_Nodes[i].print();}Main.cpp#include <iostream>#include "MManag.h"#include "Node.h"#define SIZE 5 //分配区的个数void testNode(){int size = 10;Node node1(1,0,size);node1.print();Node node2(2,size,size);node2.setState(false);node2.setTaskNo(1);node2.print();//MManage m1();//m1.print();MManage m2(2);m2.print();}int main(){MManage m(SIZE);char yesOrNo = 'y';int swt = 0;while(yesOrNo != 'n' && yesOrNo != 'N'){while(swt != 1 && swt != 2){system("cls");std::cout<<"=========================="<<std::endl;std::cout<<" Please put your choice:"<<std::endl;std::cout<<" 1--apply memory"<<std::endl;std::cout<<" 2--free memory"<<std::endl;std::cout<<"=========================="<<std::endl;std::cin>>swt;if(swt!=1&&swt!=2)std::cout<<"error iput,please put(1、2)"<<std::endl;}switch(swt){case 1: m.MAlloc();break;case 2: m.MFree();break;default:{printf("exception ouccer\n");return 1;}}m.print();std::cout<<"Do you like to continue?"<<std::endl;std::cin >> yesOrNo;swt = 0;}}四、运行结果与分析手工输入每个分区的大小来初始化分区表:分析:在手工输入每个存空间的大小后,立即调用打印的函数将存空间的情况打印出来。

相关文档
最新文档