《计算机体系结构》第六次实验 cache

合集下载

2022年黄河科技学院计算机应用技术专业《计算机系统结构》科目期末试卷B(有答案)

2022年黄河科技学院计算机应用技术专业《计算机系统结构》科目期末试卷B(有答案)

2022年黄河科技学院计算机应用技术专业《计算机系统结构》科目期末试卷B(有答案)一、选择题1、组相联映象、LRU替换的Cache存贮器,不影响Cache命中率的是( )A.增加Cache中的块数B.增大组的大小C.增大主存容量D.增大块的大小2、对系统程序员不透明的应当是( )。

A.Cache存贮器XB.系列机各档不同的数据通路宽度C.指令缓冲寄存器D.虚拟存贮器3、在计算机系统的层次结构中,机器被定义为()的集合体A.能存储和执行相应语言程序的算法和数据结构B.硬件和微程序(固件)C.软件和固件D.软件和硬件4、推出系列机的新机器,不能更改的是()。

A.原有指令的寻址方式和操作码B.系统总线的组成C.数据通路宽度D.存储芯片的集成度5、以下说法中,不正确的是()。

软硬件功能是等效的,提高硬件功能的比例会A.提高解题速度B.提高硬件利用率C.提高硬件成本D.减少所需存储器用量6、在尾数下溢处理方法中,平均误差最大的是()A.截断法B.舍入法C.恒置"1"法D.ROM查表法7、计算机系统的层次结构按照由高到低的顺序分别为()。

A.高级语言机器级,汇编语言机器级,传统机器语言机器级,微程序机器级B.高级语言机器级,应用语言机器级,汇编语言机器级,微程序机器级C.应用语言机器级,传统机器语言机器级,汇编语言机器级,操作系统机器级D.应用语言机器级,操作系统机器级,微程序机器级,传统机器语言机器级8、在流水机器中,全局性相关是指( )。

A.先写后读相关B.先读后写相关C.指令相关D.由转移指令引起的相关9、()属于MIMD系统结构。

A.各处理单元同时受同一个控制单元的管理B.各处理单元同时接受同一个控制单元送来的指令C.松耦合多处理机和多计算机D.阵列处理机10、"从中间开始"设计的"中间"目前多数是在( )。

A.传统机器语言级与操作系统机器级之间B.传统机器语言级与微程序机器级之间C.微程序机器级与汇编语言机器级之间D.操作系统机器级与汇编语言机器级之间二、判断题11、二进制数表示数据信息较之二一十进制数表示,其存贮空间利用率低,运算速度要快。

以下习题来自《计算机系统结构》第七章 存储体系。

以下习题来自《计算机系统结构》第七章 存储体系。

以下习题来自《计算机系统结构》第七章存储体系。

7.1解释下列术语直接映像:每个主存地址映像到Cache中的一个指定地质的方式称为直接映像。

全相联映像:任何主存地址可映像到任何Cache地址的方式称为全相联映像。

组相联映像:组相联映像指的是将存储空间的页面分成若干组,各组之间是直接映像,而组内各块之间是全相联映像。

全写法:全写法也称直达法,即写操作将数据同时写入Cache和缓存。

写回法:写Cache时不写主存,仅当被写Cache数据块要被替换出去时才写回主存。

虚拟存储器:虚拟存储器是主存的扩展,当主存的容量不能满足要求时,数据可存放在外存中,在程序中仍然按地址访问外存空间。

大小取决于计算机的访存能力。

段式管理:把主存按段分配的存储管理方式称为段式管理。

页式管理:把虚拟存储空间和实际存储空间等分成固定大小的页,各虚拟页可装入主存中不同的实际页面位置。

段页式管理:段页式管理式段式管理和页式管理的结合,他将存储空间按逻辑模块分成段,每段又分成若干个页,访存通过一个段表和若干个页表进行。

段的长度必须是页的长度的整数倍,段的起点必须是某一页的起点。

快表:为了提高页表中常用项的访问速度,采用快速硬件构成的比全表小的多的部分表格。

慢表:存放在主存中的整个页表。

高速缓存:高速缓冲存储器是位于CPU和主存之间的高层存储子系统。

时间局部性:如果一个存储项被访问,则可能该项会很快再次被访问。

空间局部性:如果一个存储项被访问,则该项及其邻近的相也可能很快被访问。

段表:在对虚拟内存进行管理时,系统中用于指明各段在主存中的位置的表,表中包括段名或段号、段起点、装入位和段长等。

页表:在对虚拟内存进行管理时,系统中用于指明各页在主存中的位置的表,表中包括页号、每页在主存中的起始位置、表示该页是否已装入主存的装入位等。

块表:存储系统中的一个用于解决块和页的定位、标志、和寻址问题的表。

7.2 有人认为,随着存储器芯片集成度的提高,主存的容量将越来越大,虚拟存贮器将被淘汰,未来的计算机中将不采用虚拟存储器。

2022年哈尔滨理工大学计算机科学与技术专业《计算机系统结构》科目期末试卷B(有答案)

2022年哈尔滨理工大学计算机科学与技术专业《计算机系统结构》科目期末试卷B(有答案)

2022年哈尔滨理工大学计算机科学与技术专业《计算机系统结构》科目期末试卷B(有答案)一、选择题1、在系统结构设计中,提高软件功能实现的比例会( )。

A.提高解题速度B.减少需要的存贮容量C.提高系统的灵活性D.提高系统的性能价格比2、组相联映象、LRU替换的Cache存贮器,不影响Cache命中率的是( )A.增加Cache中的块数B.增大组的大小C.增大主存容量D.增大块的大小3、若输入流水线的指令既无局部性相关,也不存在全局性相关,则()。

A.可获得高的吞吐率和效率B.流水线的效率和吞吐率恶化C.出现瓶颈D.可靠性提高4、对系统程序员不透明的应当是( )。

A.Cache存贮器XB.系列机各档不同的数据通路宽度C.指令缓冲寄存器D.虚拟存贮器5、计算机系统多级层次中,从下层到上层,各级相对顺序正确的应当是()。

A.汇编语言机器级,操作系统机器级,高级语言机器级B.微程序机器级,传统机器语言机器级,汇编语言机器级C.传统机器语言机器级,高级语言机器级,汇编语言机器级D.汇编语言机器级,应用语言机器级,高级语言机器级6、直接执行微指令的是( )A.汇编程序B.编译程序C.硬件D.微指令程序7、浮点数尾数基值rm=8,尾数数值部分长6位,可表示的规格化最小正尾数为( )A.0.5B.0.25C.0.125D.1/648、Cache存贮器常用的地址映象方式是( )。

A.全相联映象B.页表法映象C.组相联映象D.段页表映象9、下列说法中不正确的是( )A.软件设计费用比软件重复生产费用高B.硬件功能只需实现一次,而软件功能可能要多次重复实现C.硬件的生产费用比软件的生产费用高D.硬件的设计费用比软件的设计费用低10、计算机系统结构不包括()A.主存速度B.机器工作状态C.信息保护D.数据表示11、计算机系统的层次结构按照由高到低的顺序分别为()。

A.高级语言机器级,汇编语言机器级,传统机器语言机器级,微程序机器级B.高级语言机器级,应用语言机器级,汇编语言机器级,微程序机器级C.应用语言机器级,传统机器语言机器级,汇编语言机器级,操作系统机器级D.应用语言机器级,操作系统机器级,微程序机器级,传统机器语言机器级12、对汇编语言程序员透明的是()A.I/O方式中的DMA访问B.浮点数据表示C.访问方式保护D.程序性中断13、在计算机系统设计中,比较好的方法是( )A.从上向下设计B.从下向上设计C.从两头向中间设计D.从中间开始向上、向下设计14、外部设备打印机适合于连接到( )。

计算机体系结构-存储器的组成、cache的映试题分析

计算机体系结构-存储器的组成、cache的映试题分析

计算机体系结构-存储器的组成、C a c h e的映试题分析(总22页)-CAL-FENGHAI.-(YICAI)-Company One1-CAL-本页仅作为文档封面,使用请直接删除本章真题解析在本章的内容中,需要考生重点掌握的有存储器的组成、Cache的映像等。

本节按照研究生入学考试的试题样式,参考历年的真题和全国40所高校的研究生入学试题,组织了相关的真题及解析,供读者参考。

单项选择题例题1某计算机的Cache共有16块,采用2路组相联映射方式(即每组2块)。

每个主存块大小为32字节,按字节编址。

主存129号单元所在主存块应装入到的Cache组号是(1)。

[2009年试题14](1)A.0 B.2 C.4 D.6例题1分析组相联映射方式是将某一主存块j按模Q(Q是Cache的组数)映射到Cache的第i 组中的任一块,即i = j mod Q。

根据题目条件可知,Q=16/2=8组。

因为每个主存块大小为32字节,按字节编址,所以主存129号单元所在的主存块号为4(注意:从0开始计数),所以i=4 mod 8=4。

例题1答案(1)C例题2某计算机主存容量为64KB,其中ROM区为4KB,其余为RAM区,按字节编址。

现要用2K×8位的ROM芯片和4K×4位的RAM芯片来设计该存储器,则需要上述规格的ROM芯片数和RAM芯片数分别是(2)。

[2009年试题15](2)A.1、15 B.2、l5 C.1、30 D.2、30例题2分析因为1B=8位,ROM区的总大小为4KB,即为4K×8位,那么需要的ROM芯片数为:(4K×8位)/(2K×8位)=2片。

RAM区的总大小为64KB4KB=60KB,即60K×8位,那么需要的RAM芯片数为:(60K×8位)/(4K×4位)=30片。

例题2答案(2)D例题3假设某计算机的存储系统由Cache和主存组成。

2022年北京航空航天大学计算机科学与技术专业《计算机系统结构》科目期末试卷A(有答案)

2022年北京航空航天大学计算机科学与技术专业《计算机系统结构》科目期末试卷A(有答案)

2022年北京航空航天大学计算机科学与技术专业《计算机系统结构》科目期末试卷A(有答案)一、选择题1、下列说法正确的是( )A.Cache容量一般不大,命中率不会很高B.Cache芯片速度一般比CPU的速度慢数十倍C.Cache本身速度很快。

但地址变换的速度很慢D.Cache存贮器查映象表和访问物理Cache其间可以流水,使速度与CPU匹配2、直接执行微指令的是( )A.汇编程序B.编译程序C.硬件D.微指令程序3、多处理机的各自独立型操作系统()。

A.要求管理程序不必是可再入的B.适合于紧耦合多处理机C.工作负荷较平衡D.有较高的可靠性4、下列说法正确的是()A."一次重叠"是一次解释一条指令B."一次重叠"是同时解释相邻两条指令C.流水方式是同时只能解释两条指令D."一次重叠"是同时可解释很多条指令5、费林按指令流和数据流的多倍性把计算机系统分类,这里的多倍性指()。

A.系统瓶颈部件上处于同一执行阶段的指令流是数据流的多少倍。

B.系统瓶颈部件上处于同一执行阶段的数据流是指令流的多少倍。

C.系统瓶颈部件上处于同一执行阶段的指令或数据的最大可能个数。

D.A和B6、对系统程序员不透明的应当是( )。

A.Cache存贮器XB.系列机各档不同的数据通路宽度C.指令缓冲寄存器D.虚拟存贮器7、推出系列机的新机器,不能更改的是()。

A.原有指令的寻址方式和操作码B.系统总线的组成C.数据通路宽度D.存储芯片的集成度8、除了分布处理、MPP和机群系统外,并行处理计算机按其基本结构特征可分为流水线计算机,阵列处理机,多处理机和()四种不同的结构。

A.计算机网络B.控制流计算机C.机群系统D.数据流计算机9、下列说法中不正确的是()A.软件设计费用比软件重复生产费用高B.硬件功能只需实现一次,而软件功能可能要多次重复实现C.硬件的生产费用比软件的生产费用高D.硬件的设计费用比软件的设计费用低10、在多用户机器上,应用程序员不能使用的指令是()A.“执行”指令B.“访管”指令C.“启动IO”指令D“测试与置定”指令11、汇编语言程序经()的()成机器语言程序。

计算机体系结构-复习题(附答案)-vip专享

计算机体系结构-复习题(附答案)-vip专享

《计算机体系结构》复习题一、填空题1. 推动计算机系统结构发展的主要动力是( 计算机应用 )。

2. ( 器件 )的发展是促使计算机系统结构不断发展的最活跃因素。

3. 衡量计算机系统性能可采用各种尺度,但最为可靠的衡量尺度是( 时间 )。

4. CPI表示执行每条指令所需的( 平均时钟周期数 )。

5. 计算机系统中的数据表示是指可由硬件直接辨认的( 数据类型 )。

6. 在向量处理中经常会遇到稀疏向量,为了节省存储空间和处理时间( 压缩向量 )的表示方法。

7. 在当今的RISC机的指令系统中,全都是( 定字长 )指令格式。

8. 增强向量流水处理性能的方法主要有:多功能部件并行操作和采用( 链接 )技术。

9. 数组多路通道与设备之间的数据传送的基本单位是( 数据块 )。

10. 数据流系统结构是基于数据驱动和( 消息传送 )的计算模型。

11. 现代计算机系统是由(硬件/固件)和(软件)组成的十分复杂的系统。

12. 计算机系统应能支持软件可移植,实现可移植性的常用方法有3种,即(采用系列机),(仿真和模拟),统一高级语言。

13. 可以将当前大多数通用寄存器型指令集结构进一步细分为3种类型,即( RM结构)、( RR结构)和存储器-存储器型指令集结构。

14.MIPS指令DADDIU R14,R5,#6属于( I )类型的指令格式;MIPS指令SD R4,300(R5)属于( I )类型的指令格式。

15.描述流水线的工作,常采用时空图的方法。

在时空图中,横坐标表示(时间),纵坐标代表(空间或流水线各段)。

16.在MIPS指令实现的简单数据通路中,在WB周期中,有两大类指令执行操作:( Load )和( ALU )指令。

17.存储器的层次结构中,“Cache-主存”层次是为了弥补主存(速度)的不足,“主存-辅存”层次是为了弥补主存(容量)的不足。

18.Cache实现的映像规则有全相联映像、(直接)和(组相联)三种。

西安交大计算机系统结构实验报告.

西安交大计算机系统结构实验报告.

《计算机系统结构课内实验》实验报告第一次实验:记分牌算法和Tomasulo算法第二次实验:cache性能分析班级:物联网21姓名:李伟东学号:2120509011日期:2015.5.21第一次实验:记分牌算法和Tomasulo算法一、实验目的及要求1. 掌握DLXview模拟器的使用方法;2. 进一步理解指令动态调度的基本思想,了解指令动态调度的基本过程与方法;3. 理解记分牌算法和Tomasulo算法的基本思想,了解它们的基本结构、运行过程;4. 比较分析基本流水线与记分牌算法和Tomasulo算法的性能及优缺点。

二、实验环境DLXview模拟器三、实验内容1.用DLX汇编语言编写代码文件*.s(程序中应包括指令的数据相关、控制相关以及结构相关),以及相关的初始化寄存器文件*.i和数据文件*.d;2.观察程序中出现的数据相关、控制相关、结构相关,并指出三种相关的指令组合;四、实验步骤将自己编写的程序*.s、*.i、*.d装载到DLXview模拟器上,(1)分别用基本流水线、记分牌算法和Tomasulo算法模拟,针对每一种模拟做如下分析:①统计程序的执行周期数和流水线中的暂停时钟周期数;②改变功能部件数目重新模拟,观察并记录性能的改变;③改变功能部件延迟重新模拟,观察并记录性能的改变;论述功能部件数目、功能部件延迟对性能的影响。

(2)记录运行记分牌算法时的功能部件状态表和指令状态表;(3)记录运行Tomasulo算法时的指令状态表和保留站信息;五、实验结果1)基本流水线原始即加法延迟2,乘法延迟5,实验结果显示该段程序运行了11个时钟周期增加了一个除法器。

加法器延迟2,乘法器延迟5,除法器延迟19。

实验结果显示该段程序运行了11个时钟周期。

增加除法器对程序的执行无影响。

加法器延迟2,乘法器延迟6,无除法器。

实验结果显示该段程序运行了12个时钟周期乘法器的延迟对程序执行有有影响。

加法器延迟1,乘法器延迟5。

体系结构试题及答案

体系结构试题及答案

一.名词解释2:1Cache经验规则:大小为N的直接印象Cache的失效率约等于大小为N/2的两路组相联Cache的失效率。

通道处理机:通道的专用处理机,来专门负责整个计算机体系的输入/输出工作。

通道处理机只能执行有限的一组输入/输出指令。

透明性:在计算机技术中,把这种本来存在的事物或属性,但从某种角度看又好像不存在的概念称为透明性。

向量处理机:设置了向量数据表示和相应的向量指令的流水线处理机称为向量处理机。

虚拟Cache:直接用虚拟地址进行访问的Cache计算机系统结构:传统机器程序员所看到的计算机属性,即概念性结构与功能特性。

系列机:由同一厂家生产的具有相同系统结构、但具有不同组成和实现的一系列不同型号的计算机。

同构型多处理机系统:由多个同类型或至少担负同等功能的处理机组成,它们同时处理同一作业中能并行执行的多个任务。

堆栈型机器:CPU 中存储操作数的单元是堆栈的机器。

累加器型机器:CPU 中存储操作数的单元是累加器的机器。

通用寄存器型机器:CPU 中存储操作数的单元是通用寄存器的机器。

数据相关:考虑两条指令i和j,i在j的前面,如果下述条件之一成立,则称指令j与指令i数据相关:(1)指令j使用指令i产生的结果;(2)指令j与指令k数据相关,而指令k又与指令i数据相关。

定向:用来解决写后读冲突的。

在发生写后读相关的情况下,在计算结果尚未出来之前,后面等待使用该结果的指令并不见得是马上就要用该结果。

如果能够将该计算结果从其产生的地方直接送到其它指令需要它的地方,那么就可以避免停顿。

指令级并行:简称ILP。

是指指令之间存在的一种并行性,利用它,计算机可以并行执行两条或两条以上的指令。

指令的动态调度:是指在保持数据流和异常行为的情况下,通过硬件对指令执行顺序进行重新安排,以提高流水线的利用率且减少停顿现象。

是由硬件在程序实际运行时实施的。

指令的静态调度:是指依靠编译器对代码进行静态调度,以减少相关和冲突。

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

Cache实验报告姓名:王宇航学号:09283020 安全0901
Cache实验报告
一、实验要求:
1.阅读分析附件模拟器代码
要求:1)读懂2)关键注释3)总结关键参数和算法的实现方法
2.通过读懂代码加深了解cache的实现技术
3.结合书后习题1进行测试
4.通过测试和进行实验设计了解参数和算法选择的特点和相互关系(比较,组合等),需要定性和量化结合说明,可以用数字或图表等多种描述手段配合说明。

二、实验代码:
1. LRU页面置换算法
程序一共有3中模式:
Direct_mapped 2 Set_associate 3 Fully_associate
对于第一种,直接映射,显然用不到LRU算法,因为每一个地址在cache中只有一个地方可以去。

对于后两种,组相联映射和全相联映射,就需要用到LRU算法了。

其中,全相联映射等于是只有一个set的Set_associate,而LRU正是用在一个set中,所以,后面两种模式的LRU问题可以归结为一种:一个set中,来了一个没有的页面,需要置换出一个,应该置换出哪一个的问题。

那么,具体过程如下:
1 这个set中的每一个block都有一个lru值,初始为0。

2 每次访问这个set的时候,不管是否命中,这个set中的所有block的lru值都+1。

3 当需要置换出去一个页面的时候,选择一个lru值最大的那个置换出入,用来放入刚刚进来的。

4 不管是否命中,刚刚访问过的,或者加入的那个block的lru值置为0。

if(x<lru[index][z])//选择lru值最大的一个
{
x=lru[index][z];
y=z;
}
if(z==((assoc*2)-2))//没有命中时
{
newarray[index][y+1]=tag; //把lru值最大的替换掉
misscount++;
c=misstype(blockaddress[j],NOofblock,j);
cc=1;
for(m=0;m<(assoc*2);m=m+2)//所有的lru值+1
lru[index][m]++;
lru[index][y]=0;//把lru值最大的替换掉
}
z=z+2;
2. 用于判断缺页类型的算法
在程序中,体现了3中缺页的类型:
Compulsory Miss:之前没有出现的地址,肯定不会命中
Conflict Miss:由于冲突而产生的不命中
Capacity Miss:由于容量不足而导致的不命中
在函数int misstype(int ba, int nb, int l)中。

ba:表示当前不命中的地址
nb:表示NOofblock,即cache中block的数目
l:表示当前ba在访问序列bytearray数组中的位置
before数组,用来表示当前已经访问过了那些页面。

blarray数组,表示相邻两次访问ba之间,访问过的地址。

变量b,表示blarray数组的大小。

Compulsory Miss:
那么,只要当前访问的页面,在之前没有访问过,那么,就是Compulsory Miss这种类型。

代码上就是:遍历before数组,看看有没有和ba相同的,没有的话就是Compulsory Miss,同时不要忘记把ba加入到before数组,供下次使用。

Conflict Miss:
在统计相邻两次访问ba之间的不同的地址数目时,数组blarray的大小b就是这个值。

那么只要和nb比较一下,只要b<nb,表示其实还有多余的空间可以使ba在之前不被调出,就说明其实是ba由于冲突而被调出,即Conflict Miss。

Capacity Miss:
反之,如果b>nb,就表示,相邻两次访问ba之间的地址数目过大,导致空间不够使用,即Capacity Miss。

三、实验过程:
1. 原始代码测试
第一个测试:Direct mapped
第二个测试:two-way set associative
第三个测试:fully associative
可见三次测试的结果是相同的,因为我们给的三组输入数据是相同的。

下面我们用书上的例子进行测试:
第一个测试:Direct mapped:
如图,和课本的结果吻合。

全部miss,由于其中有3种不同的地址,所以Compulsory miss 的数目是3.
第二个测试:two-way set associative
如图,和课本的结果吻合。

只有一个hit,由于其中有3种不同的地址,所以Compulsory miss 的数目是3.
第三个测试:fully associative
如图,和课本的结果吻合。

有2个hit,由于其中有3种不同的地址,所以Compulsory miss 的数目是3.
综上,上述三种模式的miss率如下:左:direct 中:2-way 右:full
2. 代码测试
依据课后题进行代码测试:为了测试block 的大小和n-way 中n 的大小对miss 率的影响,需要反复实验。

所以,就需要一种策略来生成访问序列地址,但是又不能随便生成,因为序列需要满足一定的空间局部性和时间局部性。

在源代码中加入一小段测试代码如下:(网上找的测试代码,且将源代码中的指定打开文件注释掉,改为由以下函数生成:页面访问序列生成函数)
int num, e, N; int Gen(int que[]) {
double t = (rand() % 100) * 0.01; int m = (rand() % (N / 2)) + 1; int p = rand() % (N / 2); int cnt = 0; while(true) {
e = rand() % (N / 2) + 1; for(int i = 0; i < m; i++) {
que[cnt++] = rand() % e + p;
if (que[cnt - 1] > N - 1) que[cnt - 1] = N - 1; if (cnt == num) break; }
if (cnt == num) break;
double r = (rand() % 100) * 0.01; if (r < t)
p = rand() % N; else p = (p + 1) % N; }
return cnt;
}
那么,为了兼顾到3种模式,下面将按照
A Direct mapped模式下,仅BlockSize大小增加。

B 仅n-way的n改变,从1~16
C 仅采用全相联
都用相同的数据测试1000次观察效果
(1)Direct mapped直接映射,BlockSize大小增加
Cache大小固定为128,序列长度为100
当BlockSize = 1的时候:
当BlockSize = 2的时候:
当BlockSize = 4的时候:
由此可见,在直接映射下,当blocksize从1、2、4依次的增长时,缺页率在减少。

(2)组相联映射中n对缺页率的影响测试实验:
Cache大小固定为64,BlockSize为1,序列长度为100,n从1变到16,看结果:n=1时:
n=2
n=4
n=8
n=16
由此可知,随着n的增大,缺页率是逐步减小的。

3. 全相联映射:
Cache大小固定为128,BlockSize为2,序列长度为100
由此可见,综合各方面,全相联映射是最优方法,其缺页率最低。

4.实验总结
通过这次实验,我了解了cache中的三种映像规则:直接映射、组相联映射和全相联映射的各自的优缺点和性能对比。

也提高了我阅读代码的能力,同时也理解了作业中遇到的问题。

总之,受益匪浅。

相关文档
最新文档