操作系统实验-第四讲-物理存储器与进程逻辑地址空间的管理

合集下载

操作系统课件之第四章存储器管理

操作系统课件之第四章存储器管理
操作系统课件之第四章存储 器管理
• 存储器管理概述 • 存储器组织结构 • 内存分配与回收 • 虚拟内存管理 • 存储器管理性能优化
01
存储器管理概述
存储器管理的功能
内存分配
为每个进程分配所需的 内存空间,包括代码、
数据和堆栈。
内存回收
当进程完成或释放其内 存时,操作系统负责回
收这些内存。
内存保护
动态分配策略
根据进程的实际需要动态 地分配物理内存。
分段式分配策略
将进程的逻辑地址空间划 分为多个段,每个段对应 一个物理内存区域。
05
存储器管理性能优化
内存访问冲突的解决
内存访问冲突是指多个进程同时访问同一内存地址时产生 的冲突,可能导致数据错误或程序崩溃。
解决内存访问冲突的方法包括使用锁机制、信号量机制、 避免死锁等,以实现进程间的互斥访问和同步控制。
确保每个进程只能访问 其分配的内存空间,防
止非法访问。
内存扩充
通过虚拟内存技术,将物理 内存与外部存储器结合,提
供更大的可用内存空间。
存储器管理的分类
固定分区存储器管理
将内存划分为固定大小的分区 ,每个进程分配一个分区。
可变分区存储器管理
根据进程大小动态分配内存分 区过页表进 行映射。
引用计数
通过跟踪每个内存块的引用计数来回 收内存,当引用计数为零时,该内存 块可以被回收。
分代收集
将内存中的对象按照存活时间和使用 频率分为不同的代,根据不同代的特 性采用不同的回收策略。
内存优化技术
内存压缩
通过压缩内存中的数据来减 少内存占用和提高内存利用 率。
内存共享
通过共享内存中的数据来减 少内存占用和提高数据利用 率。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

计算机操作系统 存储器管理ppt课件

计算机操作系统 存储器管理ppt课件

2.具有快表的地址变换机构
不具快表,则需两次访问内存。 (1)访页表 (2)得到绝对地址内容
有快表,速度提高。 快表贵,不能太多。
2.具有快表的地址变换机构
页表寄存器
逻辑地址
页表始址 页表长度
>
越界中断
页号 页内地址

页号 块号
1



b


页表
页号 块号
b 快表
b
d
物理地址
………
……… ………
………
………
………
两级页表示意图
逻辑地址
外部页号 外部页内地址 页内地址
P1
P2
d
外部页表寄存器
+
+
b
d
物理地址
外部页表
页表
具有两级页表的地址变换机构

某虚拟存储器的用户编程空间共32个页面,每页为 1KB,内存为16KB。假定某时刻一用户页表中已调入 内存的页面对应的物理块号如下表:
返回分区号 及首址
4.2.5 对换
1 对换的引入 将阻塞进程,暂时不用的程序,数据换出。 将具备运行条件的进程换入。 类型: 整体对换:进程对换,解决内存紧张 部分对换:页面对换/分段对换:提供虚存支持
2 对换空间的管理 外存 对换区比文件区侧重于对换速度。 因此,对换区一般采用连续分配。采用数据结构 和分配回收类似于可变化分区分配。
段表: 逻辑段—map—物理段
地址变换机构:图4-16,4-17 分页与分段:
(1)页是信息的物理单位,段是逻辑单位 (2)页长度固定,段长度不固定(由用户指定) (3)一维与二维

操作系统第四章-第四章存储器管理-精品

操作系统第四章-第四章存储器管理-精品

L+M-1 Return;
L+M
模块 C
L+M+N-1 Return;
内存
Operating System
2019/10/24
Page 25
程序的链接
运行时动态链接(Run-time Dynamic Linking) 应用程序在每次运行的模块可能不相同
运行时动态链接方式将对某些模块的链接 推迟到执行时才进行,即在执行过程中, 当发现一个被调用模块尚未装入内存时, 立即由OS去找到该模块并将之装入内存, 把它链接到调用者模块上
12500
365
5000 作业 地 址空
15000

缺点:不断的分配和回收,造成内存中小空闲块很多,总
空闲空间量够,但分配不了
内 存空 间
办法:紧凑(移作动)业,装但入该内装存入时方法的不情支况持
Operating System
2019/10/24
Page 16
程序的装入
0
1000 LOAD 1,2500
绝对地址的产生
程序员直接赋予。不仅要求程序员熟悉内存 使用情况,而且一旦程序或数据被修改后, 可能要改变程序中的所有地址。通常在程序 中采用符号地址,在编译或汇编时,再将符 号地址转换为绝对地址。
编译或汇编时产生
Operating System
2019/10/24
Page 14
程序的装入
2019/10/24
Page 9
程序的装入和链接
程序的装入 程序的链接
Operating System
2019/10/24
Page 10
程序的装入
多道程序环境下,程序要运行必须为之创建进程, 而创建进程的第一件事就是分配内存

存储器管理-操作系统PDF课件-中国科技大学-4

存储器管理-操作系统PDF课件-中国科技大学-4

jmp 150 100
jmp 2150 2100
• 说明:重定位表中列出所有修改的位置。如:重定位表的150 表示相对地址150处的内容为相对地址(即100为从0起头的相 对位置)。在装入时,要依据重定位后的起始位置(2000)修改 相对地址。
– 重定位修改:重定位表中的150->绝对地址2150(=2000+150) – 内容修改:内容100变成2100(=100+2000))。
4.2分区存储管理
单一连续区存储管理
适用于单道程序系统
• 内存分为两个连续区域:系统区,用户 区。应用程序装入到用户区,可使用用 户区全部空间。 • 最简单,适用于单道程序设计的OS。 • 优点:易于管理。 • 缺点:对要求内存空间少的程序,造成 内存浪费(空闲存储区)。
0H 中断矢量表 操作系统 7FFFH 用户程序区 界限寄存器 08000H
区 号 1 2 3 4 5 起始地址 08000H 0A000H 12000H 1A000H 3A000H 大小 8K 32K 32K 128K 512K 使用 标志 Y Y N Y N 118K 作业 大小 6K 24K 12000H 空闲分区 1A000H 作业C 3A000H 空闲分区 分区5 分区4 08000H 0A000H 作业B 分区2 分区3 作业A 分区1
• 优点:
– 可以实现分区共享 – 诸进程可以共享数据分区。
4.3 覆盖和交换
覆盖(overlay)
• 引入:其目标是在较小的可用内存中运行较大 的程序。常用于多道程序系统,与分区存储管 理配合使用。 • 基本思想:一个作业的若干程序段,或几个作 业的某些部分共享同一存储区。 • 优点:解决小主存容量与大作业之间的矛盾。 • 缺点:实现覆盖管理的系统开销较大。

操作系统物理存储器与进程逻辑地址空间的管理)

操作系统物理存储器与进程逻辑地址空间的管理)

操作系统实验报告哈尔滨工程大学软件学院第四讲物理存储器与进程逻辑地址空间的管理一、实验概述1. 实验名称物理存储器与进程逻辑地址空间的管理2. 实验目的通过查看物理存储器的使用情况,并练习分配和回收物理内存,从而掌握物理存储器的管理方法。

通过查看进程逻辑地址空间的使用情况,并练习分配和回收虚拟内存,从而掌握进程逻辑地址空间的管理方法。

3. 实验类型(验证、设计)验证+设计4. 实验内容(1)准备实验(2)执行控制台命令“pm”,查看物理存储器的信息(3)分配物理页和释放物理页: a. 在pm命令函数中添加分配物理页和释放物理页的代码 b. 单步调试分配物理页和释放物理页(4)执行控制台命令“vm”,查看系统进程的虚拟地址描述符信息执行控制台命令“vm”,查看当创建了一个应用程序进程后,系统进程和应用程序进程中虚拟地址描述符的信息(5)在系统进程中分配虚拟页和释放虚拟页(6)在应用程序进程中分配虚拟页和释放虚拟页(7)结束实验二、实验环境操作系统:Windows xp实验环境:Oslab;编程语言:C++三、实验过程(每次实验不一定下面6条都写,根据实际情况定)1. 设计思路和流程图2. 源程序并附上注释#include "EOSApp.h"int main(int argc, char* argv[]){#ifdef _DEBUG__asm("int $3\n nop");#endifINT *a;if(d=VirtualAlloc(0,sizeof(int),MEM_RESERVE|MEM_COMMIT)){//调用API函数VirtualAlloc,分配一个整型变量所需的空间,并使用一个整型变量的指针指向这个空间。

printf("Allocated %d bytes virtual memory of 0x%x\n\n",sizeof(int),a);printf("virtual memory original value:0x%x\n\n",*a);//输出原始整型变量的值*d=0xFFFFFFFF;//修改整型变量的值为0xFFFFFFFFprintf("virtual memory new value:0x%x\n\n",*a);//输出修改后的整型变量的值printf("\nWait for 10 seconds\n");Sleep(10000);// 调用API函数Sleep,等待10秒钟。

第四讲 物理存储器与进程逻辑地址空间的管理

第四讲 物理存储器与进程逻辑地址空间的管理

系统进程的Vad链表举例
15
“vm”命令的源代码
// 获得指定进程的 VAD 链表 …… // 输出 VAD 链表中记录的起始页框号,结束页框号 fprintf(StdHandle, "Total Vpn from %d to %d. (0x%X - 0x%X)\n\n", pVadList->StartingVpn, pVadList->EndVpn, pVadList->StartingVpn * PAGE_SIZE, (pVadList->EndVpn + 1) * PAGE_SIZE - 1); // 遍历 VAD 链表,输出所有 VAD 的起始页框号,结束页框号和包含的虚拟页框数量 Index = AllocatedVpnCount = 0; for(pListEntry = pVadList->VadListHead.Next; pListEntry != &pVadList->VadListHead; pListEntry = pListEntry->Next) { Index++; //根据结构体某个域的地址反推结构体的地址 pVad = CONTAINING_RECORD(pListEntry, MMVAD, VadListEntry); VpnCount = pVad->EndVpn - pVad->StartingVpn + 1; fprintf(StdHandle, "%d# Vad Include %d Vpn From %d to %d. (0x%X - 0x%X)\n", Index, VpnCount, pVad->StartingVpn, pVad->EndVpn, pVad->StartingVpn * PAGE_SIZE, (pVad->EndVpn + 1) * PAGE_SIZE - 1); AllocatedVpnCount += VpnCount;

操作系统实验第四讲物理存储器与进程逻辑地址空间的管理

操作系统实验第四讲物理存储器与进程逻辑地址空间的管理

Word格式操作系统实验报告哈尔滨工程大学计算机科学与技术学院一、实验概述1. 实验名称物理存储器与进程逻辑地址空间的管理2. 实验目的通过查看物理存储器的使用情况,并练习分配和回收物理内存,从而掌握物理存储器的管理方法。

通过查看进程逻辑地址空间的使用情况,并练习分配和回收虚拟内存,从而掌握进程逻辑地址空间的管理方法。

3. 实验类型验证+设计4.实验内容 3.1 准备实验3.2 阅读控制台命令“pm”相关的源代码,并查看其执行的结果3.3 分配物理页和释放物理页3.4 阅读控制台命令“vm”相关的源代码,并查看其执行的结果3.5 在系统进程中分配虚拟页和释放虚拟页3.6 在应用程序进程中分配虚拟页和释放虚拟页3.6.1 要求3.6.2 测试方法3.6.3 提示二、实验环境操作系统 windos xp编译器 OS Lab语言 c语言三、实验过程1. 设计思路和流程图MiAllocateAnyPages函数的流程图MiFreePages函数的流程图2.需要解决的问题及解答(1)在实验指导的P160-4.和5.按F10单步调试MmAllocateVirtualMemory函数的执行过程,要求给出监视窗口BaseAddress和RegionSize个变量前后变化截图界面。

截图见3.5。

在实验指导的P160-1.和2. 按F10单步调试MmFreeVirtualMemory函数的执行过程,要求给出监视窗口BaseAddress和RegionSize个变量前后变化截图界面。

截图见3.5。

(2)按照《实验指导》的P160-3.6 在应用程序进程中分配虚拟页和释放虚拟页,编写代码。

要求至少给出源代码及其解释。

程序见3.6.2。

(3)按F10单步调试MiAllocateAnyPages函数的执行过程,尝试回答下面的问题:①本次分配的物理页的数量是多少?分配的物理页的页框号是多少?②物理页是从空闲页链表中分配的?还是从零页链表中分配的?③哪一行语句减少了空闲页的数量?哪一行语句将刚刚分配的物理页由空闲状态修改为忙状态?答:①本次分配的物理页的数量是1,分配的物理页的页框号是0x409;②物理页是从空闲页链表中分配的③第226行MiFreePageListHead=MiGetPfnDatabaseEntry(Pfn)->Next;和第227 行MiFreePageCount--;减少了空闲页的数量,第229行将刚刚分配的物理页由空闲状态修改为忙状态;(4)按F10单步调试MiFreePages函数的执行过程,尝试回答下面的问题:①本次释放的物理页的数量是多少?释放的物理页的页框号是多少?释放的物理页是之前分配的物理页吗?②释放的物理页是被放入了空闲页链表中?还是零页链表中?③绘制MiFreePages函数的流程图。

计算机操作系统-存储器管理 ppt课件

计算机操作系统-存储器管理  ppt课件
只适合于单道程序环境
ppt课件
10
4.1 程序的装入和链接
2. 可重定位装入方式 在多道程序环境下,目标模块的起始地址通常从 0开始,程序中的其他地址都是相对于起始地址 计算的。因此应采用可重定位装入方式,根据内 存的当前情况,将装入模块装入到内存的适当位 置。
注意:在采用可重定位装入方式将装入模块装入 内存后,会使装入模块中的所有逻辑地址与实际 装入内存的物理地址不同。
系统区(OS)
用户区 内存
ppt课件
21
4.2 连续分配方式
连续分配方式,是指为一个用户程序分配一个连 续的内存空间。
单一连续分配
固定分区分配
动态分区分配
可重定位分区分配
ppt课件
22
4.2.2 固定分区分配
1. 原理 将内存用户空间划分为若干个固定大小的区域,在每个分区中 只装入一道作业,便可以有多道作业并发执行。当有一空闲分 区时,便可以再从外存的后备作业队列中,选择一个适当大小 的作业装入该分区,当该作业结束时,可再从后备作业队列中 找出另一作业调入该分区。
ppt课件
13
4.1 程序的装入和链接
4.1.2 程序的链接
程序经过编译后得到一组目标模块,再利用链接程序 将目标模块链接,形成装入模块。 根据链接时间的不同,把链接分成三种: 1、静态链接:在程序运行前,将目标模块及所需的库 函数链接成一个完整的装配模块,以后不再拆开。 2、装入时动态链接:指将用户源程序编译后所得的一 组目标模块,在装入内存时,采用边装入边链接的链 接方式。 3、运行时动态链接:指对某些目标模块的链接,是在
分区分配中的数据结构 分区分配算法 分区分配及回收操作
ppt课件
26
4.2.3 动态分区分配

操作系统中的进程管理与内存分配原理解析

操作系统中的进程管理与内存分配原理解析

操作系统中的进程管理与内存分配原理解析进程管理与内存分配是操作系统中非常重要的两个方面,它们直接影响着计算机系统的性能和稳定性。

本文将分别对进程管理和内存分配进行原理解析,希望能够帮助读者深入了解操作系统的核心原理。

一、进程管理1.进程的概念进程是指在计算机系统中运行的程序的实例。

每个进程都有自己的地址空间、堆栈、寄存器以及其他系统资源,它们之间相互独立,互不干扰。

进程是操作系统进行资源分配和调度的基本单位,它的有效管理对于系统的稳定性和性能至关重要。

2.进程的创建在操作系统中,进程的创建是通过调用系统调用来实现的。

当用户启动一个程序时,操作系统会创建一个新的进程,并为其分配相应的资源。

在进程创建的过程中,操作系统会为新进程分配一个唯一的进程标识符,用来标识该进程。

3.进程的调度进程调度是操作系统中非常重要的部分,它决定了系统中各个进程的执行顺序。

常见的调度算法包括先来先服务(FCFS)、最短作业优先(SJF)、优先级调度、多级反馈队列调度等。

这些调度算法可以根据不同的应用场景选择合适的调度策略,以优化系统的性能。

4.进程的同步与互斥在多进程的系统中,进程之间往往需要进行通信与同步。

在并发执行的场景下,不同的进程可能会访问共享资源,为了避免出现竞态条件和死锁现象,需要通过信号量、互斥锁等方式进行进程的同步与互斥操作。

5.进程的终止当一个进程执行完毕或者出现异常时,需要由操作系统对其进行清理和回收。

在进程终止的过程中,操作系统会回收该进程占用的资源,并将其从系统中移除。

6.进程间通信进程间通信是指不同进程之间进行数据交换和信息传递的机制。

常见的进程间通信方式包括管道、消息队列、信号量、共享内存等。

这些通信方式可以实现不同进程之间的数据共享与交互,为复杂的应用提供了实现手段。

二、内存分配1.内存管理的基本原理内存管理是操作系统中的一个重要组成部分,它负责对计算机系统的内存资源进行分配和管理。

内存管理的基本原理包括虚拟内存、分页、分段、段页式内存管理等。

计算机操作系统第4章存储器管理PPT课件

计算机操作系统第4章存储器管理PPT课件

➢ 不支持多道程序
➢ 内存利用率不高
➢ 受内存容量限制
23
4.2.2 连续分区存储管理
➢ 将内存划分成若干个连续区域,称为分区 ➢ 每个分区只能存储一个程序,而且程序也只
能在它所驻留的分区中运行(连续性)
➢ 是实现多道程序的最简单的存储管理方案 ➢ 根据划定的分区是否可变,分为固定分区和
可变分区管理
编译/链接
地址映射
data1 3456
200
3456
1200
3456
15
三种装入方式
➢ 绝对装入
✓ 编译时给出绝对地址
✓ 相对地址与绝对地址相同,无须地址转换
✓ 适用于单道程序环境
➢ 静态重定位装入
✓ 相对地址与绝对地址不同
✓ 装入时一次性给出绝对地址
➢ 动态重定位装入
✓ 相对地址与绝对地址不同
✓ 地址的转换推迟到指令运行时才进行
24
1. 固定分区 ➢ 基本思想
✓ 由OS在初启时,将内存空间划分为若干连 续区域,一个区域称为一个分区
✓ 每个分区的大小固定不变,每个分区装一 个且只能装一个进程
✓ 每个分区大小可以相同也可以不同
25
➢ 数据结构 ✓ 分区说明表:分区号、起始地址、大小、状态 ✓ 分区请求表:进程号、内存大小
分区号 始址(K) 大小(K) 状态
要位置
➢ 任何一种存储装置,都无法同时从速度与
容量两方面,满足用户的需求
➢ 实际上它们组成了一个速度由快到慢,容
量由小到大的存储装置层次结构
5
存储器层次
存取时间减少
高速缓存
存取速度增加 存取成本增加
内存
存储容量减少

操作系统第四章存储管理习题 (1)

操作系统第四章存储管理习题 (1)

第四章存储管理习题一、选择题1、存储分配解决多道作业(A)的划分问题。

为了解决静态和动态存储分配,需采用地址重定位,即把(B)变换成(C),静态重定位由(D)实现,动态重定位由(E)实现。

A:①地址空间②符号名空间③主存空间④虚拟空间B、C:①页面地址②段地址③逻辑地址④物理地址⑤外存地址⑥设备地址D~E:①硬件地址变换机构②执行程序③汇编程序④连接装入程序⑤调试程序⑥编译程序⑦解释程序2、提高主存利用率主要是通过(A)功能实现的。

(A)的基本任务是为每道程序做(B);使每道程序能在不受干扰的环境下运行,主要是通过(C)功能实现的。

A、C:①主存分配②主存保护③地址映射④主存扩充B:①逻辑地址到物理地址的变换;②内存与外存间的交换;③允许用户程序的地址空间大于内存空间;④分配内存3、由固定分区方式发展为分页存储管理方式的主要推动力是(A);由分页系统发展为分段系统,进而以发展为段页式系统的主要动力分别是(B)。

A~B:①提高主存的利用率;②提高系统的吞吐量;③满足用户需要;④更好地满足多道程序运行的需要;⑤既满足用户要求,又提高主存利用率。

4、静态重定位是在作业的(A)中进行的,动态重定位是在作业的(B)中进行的。

A、B:①编译过程;②装入过程;③修改过程;④执行过程5、对外存对换区的管理应以(A)为主要目标,对外存文件区的管理应以(B)为主要目标。

A、B:①提高系统吞吐量;②提高存储空间的利用率;③降低存储费用;④提高换入换出速度。

6、从下列关于虚拟存储器的论述中,选出一条正确的论述。

①要求作业运行前,必须全部装入内存,且在运行中必须常驻内存;②要求作业运行前,不必全部装入内存,且在运行中不必常驻内存;③要求作业运行前,不必全部装入内存,但在运行中必须常驻内存;④要求作业运行前,必须全部装入内存,且在运行中不必常驻内存;7、在请求分页系统中有着多种置换算法:⑴选择最先进入内存的页面予以淘汰的算法称为(A);⑵选择在以后不再使用的页面予以淘汰的算法称为(B);⑶选择自上次访问以来所经历时间最长的页面予淘汰的算法称为(C);A~D:①FIFO算法;②OPT算法;③LRU 算法;④NRN算法;⑤LFU算法。

操作系统讲稿第四章内存管理

操作系统讲稿第四章内存管理

物理地址空间
一、地址重定位
1.装入程 2.地址映射0 1.装入 序
nn 逻辑空间 内存 mov AL, [nn] m
[nn+m] mov AL, [nn] L nn+m nn+m
装入后的作业并不能立即运行, L+m 对于指令要访问的地址进行相对 装入是指将逻辑地址空间安 因为作业中每一个指令要访问的 地址到绝对地址的变换,就是地 在装入过程完成后,根据装入的起始位 根据不同的地址修改时间可 排到内存中具体的物理位置上。 址映射。 地址依然是相对地址,相对地址 置来修改程序中指令要访问的地址,将 装入针对的是整个逻辑地址空 将重定位划分为静态重定位 是逻辑地址空间中的地址,并不 相对地址改为绝对地址就是重定位。 间。 地址映射就是将逻辑地址空间中 和动态重定位。 =(BR)+ 相对地址 是内存中的实际地址,因此不能 的地址映射到物理地址空间中去。 绝对地址 够访问。 采用的办法为重定位。
第四章 内存管理
主存储器是仅次于CPU的宝贵资源。
众多进程共用一个存储器,必然涉及到存储器 的分配、安全、利用率、共享以及扩展等诸多 问题。 存储管理需要做的事情是:
将用户程序所用的地址空间转换为主存储器中的实 际地址空间,将用户程序的操作地址变换为存储器 上的具体位置。 为存储空间提供安全和共享的手段。 为用户程序实现虚拟存储空间等。
存储区整理
当系统运行一段时间后,可能出现如下问题: 产生许多碎片; 进程过分分散存储; 换进、换出的次数过多,导致系 统运行缓慢; 不断“内存空间不够”。
——存储区需要整理。
存储器的整理方法:
(1)定期将内存中的碎片合并; (2)将某些进程的分散存储区域移动到一起。
经过整理后

北京邮电大学《操作系统》第四章存储器管理2(2)精品PPT课件

北京邮电大学《操作系统》第四章存储器管理2(2)精品PPT课件

对每一段要建立一张页表。
1 1026
段表的长度由作业分段的个数决定
段表中的每一个表目指出本段的页表始址和长度。 例如: 进程A有3个段,各自对应一个页表. 0 1022
1 2028
2 3001
• 页表的长度由对应段所分的页 页表
果超出长度,返回”内存定位错误”,终止进程. 否则执行(3) (3) 根据段表基址寄存器给出的段表首地址查找 该进程的段表,找到”段号”对应的段首地址. (4) 物理地址=段首地址+逻辑地址中的偏移量
逻辑地址中的偏移量就是段内地址
例1:某段表的内容如下:
段号
段首址 段长度
0
120k
40k
1
760k
段由用户自己划分,长度随机. 页的长度固定,页的划分对用户是透明的.
✓需要硬件的协助
一组计算地址内存的控制寄存器: 段表基址寄存器和段表长度寄存器 当一个进程被调度时,OS从PCB中取出段表首地
址和长度,置入段表基址寄存器和段表长度寄 存器中.
✓ 地址变换过程 PP.150
(1) 提取逻辑地址中的”段号” (2) 比较”段号”与段表长度寄存器中的长度,如
内存分配
以段为单位分配内存,每一个段在内 存中占据连续空间(内存随机分割, 需要多少分配多少),但各段之间可 以不连续存放。
2、存储管理 (1) 段表(segment mapping table)PP.149
为每一个程序设一个段表。
记录了段号、段的首地址、段的长度
段号 0
1 2
(2) 地址变换 PP.150 ✓与分页管理方式相似,但有不同点:
页内地址为836. 查页表可知,页号为1的程序段对应的块
号为1966,每块的大小为1024.
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

操作系统实验报告&哈尔滨工程大学计算机科学与技术学院一、实验概述1. 实验名称物理存储器与进程逻辑地址空间的管理2. 实验目的通过查看物理存储器的使用情况,并练习分配和回收物理内存,从而掌握物理存储器的管理方法。

通过查看进程逻辑地址空间的使用情况,并练习分配和回收虚拟内存,从而掌握进程逻辑地址空间的管理方法。

3. 实验类型验证+设计4.实验内容准备实验阅读控制台命令“pm”相关的源代码,并查看其执行的结果分配物理页和释放物理页阅读控制台命令“vm”相关的源代码,并查看其执行的结果在系统进程中分配虚拟页和释放虚拟页~在应用程序进程中分配虚拟页和释放虚拟页要求测试方法提示二、实验环境操作系统windos xp编译器OS Lab[语言c语言三、实验过程1. 设计思路和流程图MiAllocateAnyPages函数的流程图MiFreePages函数的流程图-2.需要解决的问题及解答(1)在实验指导的P160-4.和5.按F10单步调试MmAllocateVirtualMemory函数的执行过程,要求给出监视窗口BaseAddress和RegionSize个变量前后变化截图界面。

截图见。

在实验指导的P160-1.和2. 按F10单步调试MmFreeVirtualMemory函数的执行过程,要求给出监视窗口BaseAddress和RegionSize个变量前后变化截图界面。

截图见。

(2)按照《实验指导》的在应用程序进程中分配虚拟页和释放虚拟页,编写代码。

要求至少给出源代码及其解释。

程序见。

:(3)按F10单步调试MiAllocateAnyPages函数的执行过程,尝试回答下面的问题:①本次分配的物理页的数量是多少分配的物理页的页框号是多少②物理页是从空闲页链表中分配的还是从零页链表中分配的③哪一行语句减少了空闲页的数量哪一行语句将刚刚分配的物理页由空闲状态修改为忙状态答:①本次分配的物理页的数量是1,分配的物理页的页框号是0x409;②物理页是从空闲页链表中分配的③第226行MiFreePageListHead=MiGetPfnDatabaseEntry(Pfn)->Next;和第227行MiFreePageCount--;减少了空闲页的数量,第229行将刚刚分配的物理页由空闲状态修改为忙状态;(4)按F10单步调试MiFreePages函数的执行过程,尝试回答下面的问题:;①本次释放的物理页的数量是多少释放的物理页的页框号是多少释放的物理页是之前分配的物理页吗②释放的物理页是被放入了空闲页链表中还是零页链表中③绘制MiFreePages函数的流程图。

答:①本次释放的物理页的数量是1,释放的物理页的页框号0x409,释放的物理页是之前分配的物理页;②释放的物理页被放入了空闲页链表中;③见实验过程开头流程图部分。

(5)按F10单步调试MmAllocateVirtualMemory函数的执行过程,尝试回答下面的问题:①分配的虚拟页的起始地址是多少分配的虚拟页的数量是多少它们和参数BaseAddress和RegionSize初始化的值有什么样的关系—②分配虚拟页的同时有为虚拟页映射实际的物理页吗这是由哪个参数决定的③分配的虚拟页是在系统地址空间(高2G)还是在用户地址空间(低2G)这是由哪个参数决定的④参考MiReserveAddressRegion函数的定义和注释,说明该函数的功能。

答:①分配的虚拟页的起始地址是0xa0003000,分配的虚拟页的数量是1,BaseAddress和RegionSize初始化的值是期望保留或者提交的地址区域的起始地址和大小;②分配虚拟页的同时有为虚拟页映射实际的物理页,这是由第三个参数AllocationType决定的;③分配的虚拟页是在系统地址空间(高2G),这是由第四个参数SystemVirtual 决定的;④MiReserveAddressRegion函数的功能是保留一段虚拟地址区域。

(6)按F10单步调试MmFreeVirtualMemory函数的执行过程,尝试回答下面的问题:%①本次释放的虚拟地址是多少释放的虚拟页是之前分配的虚拟页吗②参考MiFindReservedAddressRegion函数、MiFreeAddressRegion函数和MiDecommitPages函数的定义和注释,说明这些函数的功能。

答:①本次释放的虚拟地址是0xa0003000,是之前分配的虚拟页;②MiFindReservedAddressRegion函数用于查找已保留地址区域,如果目标区域非已保留区域则返回失败,MiFreeAddressRegion函数用于释放已保留地址区域和MiDecommitPages函数用于释放映射在连续虚拟页框上的物理页框。

(7)在本实验中,如果分配了物理页后,没有回收,会对EOS操作系统造成什么样的影响目前EOS操作系统内核函数MiAllocateAnyPages能处理所有物理页被分配完毕的情况吗例如在没有可分配的物理页的情况下调用该内核函数,是否会返回失败如果内核函数MiAllocateAnyPages还不能处理这种极端情况,尝试修改代码解决这个问题。

答:如果分配了物理页后,没有回收,将会使可分配自由页和零页越来越少,最终导致内存溢出,系统无法运行。

目前EOS操作系统内核函数MiAllocateAnyPages不能处理所有物理页被分配完毕的情况,在没有可分配的物理页的情况下,不会分配物理页,但仍然会返回成功,添加以下代码即可:Else{return STATUS_MEMORY_NOT_ALLOCATED;}(8).(9)在本实验中,在分配物理页时是调用的内核函数 MiAllocateAnyPages,该函数会优先分配空闲页,尝试修改代码,调用内核函数MiAllocateZeroedPages优先分配零页,并调试分配零页的情况。

尝试从性能的角 7 度分析内核函数 MiAllocateAnyPages 和 MiAllocateZeroedPages。

尝试从安全性的角度分析分配零页的必要性。

答:将MiAllocateAnyPages(1, PfnArray);修改为MiAllocateZeroedPages(1, PfnArray);即可。

系统启动时,所有空闲物理页都是未初始化的,此时零页链表为空,MiAllocateAnyPages函数可以直接从自由页链表分配,而MiAllocateZeroedPages函数会对从自由页链表中分配的每一页进行零初始化,确保所有分配页都是被零初始化的,再进行分配,因此MiAllocateZeroedPages函数效率较低。

但因为MiAllocateZeroedPages函数对自由页进行了初始化,减小了出错的可能性,从而安全性较高。

3.主要数据结构、实现代码及其说明typedef struct _MMPFN {ULONG Unused : 9; 序运行时的初值和运行结果准备实验1. 启动 OS Lab。

2. 新建一个 EOS Kernel 项目。

》阅读控制台命令“pm”相关的源代码,并查看其执行的结果执行控制台命令“ pm”,查看物理存储器的信息:分配物理页和释放物理页使用文件中 ConsoleCmdPhysicalMemory 函数的函数体替换 ke/ 文件中ConsoleCmdPhysicalMemory 函数的函数体。

调试并执行控制台命令“ pm”,查看物理存储器的信息:分配和释放多个物理页调用 MiAllocateAnyPages 函数时分配多个物理页,然后在调用 MiFreePages 函数时将分配的多个物理页释放。

阅读控制台命令“vm”相关的源代码,并查看其执行的结果执行控制台命令“ vm”,查看系统进程的虚拟地址描述符信息:按 F5 启动调试。

待 EOS 启动完毕,在 EOS 控制台中输入命令“pt”后按回车。

“pt”命令可以输出当前系统中的进程列表,其中系统进程的 ID 为 1。

]在 EOS 控制台中输入命令“ vm 1”后按回车得到虚拟地址描述符信息。

执行控制台命令“ vm”,查看当创建了一个应用程序进程后,系统进程和应用程序进程中虚拟地址描述符的信息:切换到“Console-2”,然后输入命令“ pt”后按回车。

输出的信息:输入命令“ vm 1”后按回车,可以查看系统进程中虚拟地址描述符的信息】输入命令“ vm 31”后按回车,可以查看应用程序进程中虚拟地址描述符的信息在系统进程中分配虚拟页和释放虚拟页使用文件中 ConsoleCmdVM 函数的函数体替换 ke/ 文件中 ConsoleCmdVM 函数的函数体。

在 EOS 控制台中输入命令“vm 1”后按回车调试分配虚拟页和释放虚拟页的过程:vm 命令开始执行后,会在调用MmAllocateVirtualMemory 函数的代码行处中断。

此时要注意参数BaseAddress 和 RegionSize 初始化的值。

(分配虚拟页的调试过程中BaseAddress 和RegionSize 的值的变化:进入函数之前BaseAddress 和RegionSize 的值退出函数以后BaseAddress 和RegionSize 的值释放虚拟页的调试过程中BaseAddress 和RegionSize 的值的变化:进入函数前BaseAddress 和RegionSize 的值刚退出函数时BaseAddress 和RegionSize 的值'在调用 MmAllocateVirtualMemory 函数时将 RegionSize 参数的值设置为PAGE_SIZE+1时“输出”窗口中转储的信息:Total Vpn from 655360 to 657407. (0xA0000000 - 0xA07FFFFF)1# Vad Include 1 Vpn From 655360 to 655360. (0xA0000000 - 0xA0000FFF)2# Vad Include 2 Vpn From 655361 to 655362. (0xA0001000 - 0xA0002FFF)3# Vad Include 2 Vpn From 655365 to 655366. (0xA0005000 - 0xA0006FFF)?4# Vad Include 2 Vpn From 655367 to 655368. (0xA0007000 - 0xA0008FFF)5# Vad Include 2 Vpn From 655369 to 655370. (0xA0009000 - 0xA000AFFF)6# Vad Include 2 Vpn From 655371 to 655372. (0xA000B000 - 0xA000CFFF)7# Vad Include 2 Vpn From 655373 to 655374. (0xA000D000 - 0xA000EFFF)8# Vad Include 2 Vpn From 655375 to 655376. (0xA000F000 - 0xA0010FFF)9# Vad Include 2 Vpn From 655377 to 655378. (0xA0011000 - 0xA0012FFF)10# Vad Include 2 Vpn From 655379 to 655380. (0xA0013000 - 0xA0014FFF)11# Vad Include 2 Vpn From 655381 to 655382. (0xA0015000 - 0xA0016FFF)《Total Vpn Count: 2048.Allocated Vpn Count: 21.Free Vpn Count: 2027.Zeroed Physical Page Count: 0.Free Physical Page Count: 7126."New VM's base address: 0xA0017000. Size: 0x3000.1# Vad Include 1 Vpn From 655360 to 655360. (0xA0000000 - 0xA0000FFF) 2# Vad Include 2 Vpn From 655361 to 655362. (0xA0001000 - 0xA0002FFF) 3# Vad Include 2 Vpn From 655365 to 655366. (0xA0005000 - 0xA0006FFF) 4# Vad Include 2 Vpn From 655367 to 655368. (0xA0007000 - 0xA0008FFF) 5# Vad Include 2 Vpn From 655369 to 655370. (0xA0009000 - 0xA000AFFF) 6# Vad Include 2 Vpn From 655371 to 655372. (0xA000B000 - 0xA000CFFF) @7# Vad Include 2 Vpn From 655373 to 655374. (0xA000D000 - 0xA000EFFF) 8# Vad Include 2 Vpn From 655375 to 655376. (0xA000F000 - 0xA0010FFF) 9# Vad Include 2 Vpn From 655377 to 655378. (0xA0011000 - 0xA0012FFF) 10# Vad Include 2 Vpn From 655379 to 655380. (0xA0013000 - 0xA0014FFF) 11# Vad Include 2 Vpn From 655381 to 655382. (0xA0015000 - 0xA0016FFF) 12# Vad Include 3 Vpn From 655383 to 655385. (0xA0017000 - 0xA0019FFF)Allocated Vpn Count: 24.@Free Vpn Count: 2024.Zeroed Physical Page Count: 0.Free Physical Page Count: 7126.Free VM's base address: 0xA0017000. Size: 0x3000.1# Vad Include 1 Vpn From 655360 to 655360. (0xA0000000 - 0xA0000FFF) :2# Vad Include 2 Vpn From 655361 to 655362. (0xA0001000 - 0xA0002FFF) 3# Vad Include 2 Vpn From 655365 to 655366. (0xA0005000 - 0xA0006FFF) 4# Vad Include 2 Vpn From 655367 to 655368. (0xA0007000 - 0xA0008FFF) 5# Vad Include 2 Vpn From 655369 to 655370. (0xA0009000 - 0xA000AFFF) 6# Vad Include 2 Vpn From 655371 to 655372. (0xA000B000 - 0xA000CFFF) 7# Vad Include 2 Vpn From 655373 to 655374. (0xA000D000 - 0xA000EFFF) 8# Vad Include 2 Vpn From 655375 to 655376. (0xA000F000 - 0xA0010FFF) 9# Vad Include 2 Vpn From 655377 to 655378. (0xA0011000 - 0xA0012FFF) 》10# Vad Include 2 Vpn From 655379 to 655380. (0xA0013000 - 0xA0014FFF) 11# Vad Include 2 Vpn From 655381 to 655382. (0xA0015000 - 0xA0016FFF)Allocated Vpn Count: 21.Free Vpn Count: 2027.Zeroed Physical Page Count: 0.Free Physical Page Count: 7126.;在调用 MmAllocateVirtualMemory 函数时将 BaseAddress 参数的值设置为已经被占用的虚拟内存,例如 0xA0000000,“输出”窗口中转储的信息:Total Vpn from 655360 to 657407. (0xA0000000 - 0xA07FFFFF)1# Vad Include 1 Vpn From 655360 to 655360. (0xA0000000 - 0xA0000FFF)2# Vad Include 2 Vpn From 655361 to 655362. (0xA0001000 - 0xA0002FFF)3# Vad Include 2 Vpn From 655365 to 655366. (0xA0005000 - 0xA0006FFF)4# Vad Include 2 Vpn From 655367 to 655368. (0xA0007000 - 0xA0008FFF)5# Vad Include 2 Vpn From 655369 to 655370. (0xA0009000 - 0xA000AFFF).6# Vad Include 2 Vpn From 655371 to 655372. (0xA000B000 - 0xA000CFFF)7# Vad Include 2 Vpn From 655373 to 655374. (0xA000D000 - 0xA000EFFF)8# Vad Include 2 Vpn From 655375 to 655376. (0xA000F000 - 0xA0010FFF)9# Vad Include 2 Vpn From 655377 to 655378. (0xA0011000 - 0xA0012FFF)10# Vad Include 2 Vpn From 655379 to 655380. (0xA0013000 - 0xA0014FFF)11# Vad Include 2 Vpn From 655381 to 655382. (0xA0015000 - 0xA0016FFF)Total Vpn Count: 2048.¥Free Vpn Count: 2027.Zeroed Physical Page Count: 0.Free Physical Page Count: 7126.New VM's base address: 0xA0003000. Size: 0x1000.1# Vad Include 1 Vpn From 655360 to 655360. (0xA0000000 - 0xA0000FFF)】2# Vad Include 2 Vpn From 655361 to 655362. (0xA0001000 - 0xA0002FFF)3# Vad Include 1 Vpn From 655363 to 655363. (0xA0003000 - 0xA0003FFF)4# Vad Include 2 Vpn From 655365 to 655366. (0xA0005000 - 0xA0006FFF)5# Vad Include 2 Vpn From 655367 to 655368. (0xA0007000 - 0xA0008FFF)6# Vad Include 2 Vpn From 655369 to 655370. (0xA0009000 - 0xA000AFFF)7# Vad Include 2 Vpn From 655371 to 655372. (0xA000B000 - 0xA000CFFF)8# Vad Include 2 Vpn From 655373 to 655374. (0xA000D000 - 0xA000EFFF)9# Vad Include 2 Vpn From 655375 to 655376. (0xA000F000 - 0xA0010FFF)《10# Vad Include 2 Vpn From 655377 to 655378. (0xA0011000 - 0xA0012FFF)11# Vad Include 2 Vpn From 655379 to 655380. (0xA0013000 - 0xA0014FFF)12# Vad Include 2 Vpn From 655381 to 655382. (0xA0015000 - 0xA0016FFF)Free Vpn Count: 2026.Zeroed Physical Page Count: 0.Free Physical Page Count: 7126.》Free VM's base address: 0xA0003000. Size: 0x1000.1# Vad Include 1 Vpn From 655360 to 655360. (0xA0000000 - 0xA0000FFF)2# Vad Include 2 Vpn From 655361 to 655362. (0xA0001000 - 0xA0002FFF)3# Vad Include 2 Vpn From 655365 to 655366. (0xA0005000 - 0xA0006FFF)4# Vad Include 2 Vpn From 655367 to 655368. (0xA0007000 - 0xA0008FFF)5# Vad Include 2 Vpn From 655369 to 655370. (0xA0009000 - 0xA000AFFF)6# Vad Include 2 Vpn From 655371 to 655372. (0xA000B000 - 0xA000CFFF)7# Vad Include 2 Vpn From 655373 to 655374. (0xA000D000 - 0xA000EFFF)[8# Vad Include 2 Vpn From 655375 to 655376. (0xA000F000 - 0xA0010FFF)9# Vad Include 2 Vpn From 655377 to 655378. (0xA0011000 - 0xA0012FFF)10# Vad Include 2 Vpn From 655379 to 655380. (0xA0013000 - 0xA0014FFF)11# Vad Include 2 Vpn From 655381 to 655382. (0xA0015000 - 0xA0016FFF)Free Vpn Count: 2027.Free Physical Page Count: 7126.¥在调用 MmAllocateVirtualMemory 函数时将 RegionSize 参数的值设置为PAGE_SIZE*2,将BaseAddress 参数的值设置为 0xA0017004,“输出”窗口中转储的信息:Total Vpn from 655360 to 657407. (0xA0000000 - 0xA07FFFFF)1# Vad Include 1 Vpn From 655360 to 655360. (0xA0000000 - 0xA0000FFF)2# Vad Include 2 Vpn From 655361 to 655362. (0xA0001000 - 0xA0002FFF)3# Vad Include 2 Vpn From 655365 to 655366. (0xA0005000 - 0xA0006FFF) 4# Vad Include 2 Vpn From 655367 to 655368. (0xA0007000 - 0xA0008FFF) 5# Vad Include 2 Vpn From 655369 to 655370. (0xA0009000 - 0xA000AFFF) )6# Vad Include 2 Vpn From 655371 to 655372. (0xA000B000 - 0xA000CFFF) 7# Vad Include 2 Vpn From 655373 to 655374. (0xA000D000 - 0xA000EFFF) 8# Vad Include 2 Vpn From 655375 to 655376. (0xA000F000 - 0xA0010FFF) 9# Vad Include 2 Vpn From 655377 to 655378. (0xA0011000 - 0xA0012FFF) 10# Vad Include 2 Vpn From 655379 to 655380. (0xA0013000 - 0xA0014FFF) 11# Vad Include 2 Vpn From 655381 to 655382. (0xA0015000 - 0xA0016FFF)Total Vpn Count: 2048.%Allocated Vpn Count: 21.Free Vpn Count: 2027.Zeroed Physical Page Count: 0.Free Physical Page Count: 7126.New VM's base address: 0xA0017000. Size: 0x3000..1# Vad Include 1 Vpn From 655360 to 655360. (0xA0000000 - 0xA0000FFF) 2# Vad Include 2 Vpn From 655361 to 655362. (0xA0001000 - 0xA0002FFF) 3# Vad Include 2 Vpn From 655365 to 655366. (0xA0005000 - 0xA0006FFF) 4# Vad Include 2 Vpn From 655367 to 655368. (0xA0007000 - 0xA0008FFF) 5# Vad Include 2 Vpn From 655369 to 655370. (0xA0009000 - 0xA000AFFF) 6# Vad Include 2 Vpn From 655371 to 655372. (0xA000B000 - 0xA000CFFF) 7# Vad Include 2 Vpn From 655373 to 655374. (0xA000D000 - 0xA000EFFF) 8# Vad Include 2 Vpn From 655375 to 655376. (0xA000F000 - 0xA0010FFF) '9# Vad Include 2 Vpn From 655377 to 655378. (0xA0011000 - 0xA0012FFF) 10# Vad Include 2 Vpn From 655379 to 655380. (0xA0013000 - 0xA0014FFF) 11# Vad Include 2 Vpn From 655381 to 655382. (0xA0015000 - 0xA0016FFF) 12# Vad Include 3 Vpn From 655383 to 655385. (0xA0017000 - 0xA0019FFF)Free Vpn Count: 2024.Zeroed Physical Page Count: 0.Free Physical Page Count: 7126.|Free VM's base address: 0xA0017000. Size: 0x3000.1# Vad Include 1 Vpn From 655360 to 655360. (0xA0000000 - 0xA0000FFF)2# Vad Include 2 Vpn From 655361 to 655362. (0xA0001000 - 0xA0002FFF)3# Vad Include 2 Vpn From 655365 to 655366. (0xA0005000 - 0xA0006FFF)4# Vad Include 2 Vpn From 655367 to 655368. (0xA0007000 - 0xA0008FFF)5# Vad Include 2 Vpn From 655369 to 655370. (0xA0009000 - 0xA000AFFF)6# Vad Include 2 Vpn From 655371 to 655372. (0xA000B000 - 0xA000CFFF)·7# Vad Include 2 Vpn From 655373 to 655374. (0xA000D000 - 0xA000EFFF)8# Vad Include 2 Vpn From 655375 to 655376. (0xA000F000 - 0xA0010FFF)9# Vad Include 2 Vpn From 655377 to 655378. (0xA0011000 - 0xA0012FFF)10# Vad Include 2 Vpn From 655379 to 655380. (0xA0013000 - 0xA0014FFF)11# Vad Include 2 Vpn From 655381 to 655382. (0xA0015000 - 0xA0016FFF)Free Vpn Count: 2027.Zeroed Physical Page Count: 0.》在应用程序进程中分配虚拟页和释放虚拟页要求创建一个 EOS 应用程序,并编写代码完成下列功能:1. 调用 API 函数 VirtualAlloc,分配一个整型变量所需的空间,并使用一个整型变量的指针指向这个空间。

相关文档
最新文档