虚拟存储器概述

目录

常规存储器管理方式的特征和局部性原理

缺点

局部性原理

局部性原理的应用

1. 提高内存利用率

2. 实现按需装入

3. 支持内存共享

4. 提高系统稳定性

虚拟存储器的定义与特征

虚拟存储器的特征

虚拟存储器的实现机制

虚拟存储器的工作过程

虚拟存储器的优点

虚拟存储器的实现方法

1. 分页存储管理

2. 分段存储管理

3. 段页式存储管理

硬件支持

结语


        虚拟存储器是操作系统中 commonly used 的内存管理技术,它通过在磁盘和内存之间移动进程页,为进程提供了比实际内存更大的地址空间。虚拟存储器的关键思想是基于程序的局部性原理,即程序在一段时间内只访问其部分代码和数据。

常规存储器管理方式的特征和局部性原理

传统的存储器管理方式是一种将进程的地址空间直接映射到物理内存的方案。它具有以下特点:

  • 地址空间连续:进程的地址空间是连续的,从低地址到高地址线性增长。
  • 静态内存分配:在内存中为进程分配连续的内存区域,直到进程结束或换出内存。
  • 没有虚拟内存:进程的地址空间直接映射到物理内存,因此进程访问的地址就是实际的内存地址。

缺点

传统的存储器管理方式存在以下缺点:

  • 内存利用率低:由于进程必须连续地装入内存,导致内存碎片和内部碎片问题,降低了内存的利用率。
  • 不能共享内存:每个进程都有自己的内存区域,不允许共享,导致内存浪费。
  • 不能实现按需装入:进程必须全部装入内存才能执行,增加了内存压力,特别是对于大型程序。

局部性原理

        为了克服传统存储器管理方式的缺点,引入了虚拟存储器技术。虚拟存储器基于程序的局部性原理,即程序在一段时间内只访问其部分代码和数据。局部性原理主要包含以下两种类型:

  • 时间局部性:最近被访问过的地址,将来不久还会再次被访问。
  • 空间局部性:程序倾向于访问相邻的内存地址。

局部性原理的应用

        局部性原理为虚拟存储器的设计提供了理论基础。虚拟存储器通过利用局部性原理,可以有效地提高内存的利用率,并实现按需装入和内存共享等功能。以下是一些具体的应用:

1. 提高内存利用率

        虚拟存储器通过分页或分段技术,将进程的地址空间划分为若干小块(页或段),并将这些小块按需加载到内存中。这样可以减少内存碎片问题,提高内存利用率。

2. 实现按需装入

        虚拟存储器允许进程在需要时才将相应的页或段加载到内存中,而不是一次性全部加载。这种按需装入技术可以显著减少内存压力,特别是对于大型程序。

3. 支持内存共享

        通过虚拟存储器,不同的进程可以共享同一块物理内存。例如,共享库和共享数据段可以被多个进程同时访问,从而减少内存浪费。

4. 提高系统稳定性

        虚拟存储器可以通过内存保护机制,防止进程非法访问其他进程的内存区域,从而提高系统的稳定性和安全性。

虚拟存储器的定义与特征

        虚拟存储器是一种计算机系统技术,通过在磁盘和内存之间移动进程页,为进程提供比实际内存更大的地址空间。它使每个进程可以拥有一个独立的、完整的地址空间,这种地址空间可以大于实际的物理内存容量。

定义
"虚拟存储器是通过在磁盘和内存之间移动进程页,为进程提供比实际内存更大的地址空间的技术。"

虚拟存储器的特征

虚拟存储器具有以下几个关键特征:

  1. 虚拟地址空间

    虚拟存储器为每个进程提供一个虚拟的地址空间,这个空间可以大于实际的物理内存。虚拟地址空间通过地址映射机制将虚拟地址转换为物理地址,从而使得每个进程在自己的地址空间内操作数据,而不干扰其他进程。

  2. 按需装入

    虚拟存储器系统只在进程需要时才将所需的页装入内存,这种方式称为按需装入(Demand Paging)。这种方式提高了内存利用率,因为它避免了将不必要的页一次性加载到内存中。

  3. 共享和保护

    虚拟存储器通过页表或段表机制,实现内存的共享和保护:

    • 共享:多个进程可以共享相同的代码段或数据段,从而减少内存的冗余使用,提高内存利用率。
    • 保护:通过设置页表或段表中的访问权限,可以防止一个进程非法访问另一个进程的内存,增强系统的安全性。
  4. 动态重定位

    在虚拟存储器系统中,进程在内存中的位置可以动态变化,进而实现内存的动态管理。这意味着进程的内存地址不必固定,可以在内存和磁盘之间灵活地移动。

虚拟存储器的实现机制
  1. 分页(Paging)

    • 基本思想:将虚拟地址空间和物理内存都划分为固定大小的页和页框,通过页表实现虚拟地址到物理地址的映射。
    • 页表:每个进程拥有一个页表,存储其虚拟页号和物理页框号的映射关系。
    • 按需调页:当进程访问一个不在内存中的页时,引发缺页中断,系统从磁盘调入该页。
  2. 分段(Segmentation)

    • 基本思想:将虚拟地址空间划分为不同大小的段,每段有独立的起始地址和长度。
    • 段表:每个进程拥有一个段表,存储段的起始地址、长度和访问权限。
  3. 分页和分段结合

    • 基本思想:结合分页和分段两种技术,虚拟地址首先通过分段机制映射到一个逻辑段,然后再通过分页机制映射到物理内存。
    • 段页表:综合使用段表和多级页表,在虚拟存储器中组织和管理地址映射。

虚拟存储器的工作过程
  1. 地址生成:进程生成一个虚拟地址,这个地址包括段号(或页号)和段内偏移(或页内偏移)。
  2. 地址转换:系统通过段表和页表将虚拟地址转换为物理地址。
  3. 缺页处理
    • 检测缺页中断:如果页表项指示该页不在内存中,会触发缺页中断。
    • 调页机制:操作系统根据缺页中断,从磁盘中调入所需的页,将其装入空闲页框。
    • 更新页表:更新页表项,指示该页已驻留在内存中。
  4. 内存访问:成功转换后,系统根据生成的物理地址访问内存中的数据。

虚拟存储器的优点
  1. 扩展性:提供比实际物理内存更大的地址空间,支持大内存需求的应用程序。
  2. 内存利用率高:按需调页和共享内存页技术,提高了内存利用率。
  3. 进程隔离和安全:通过保护机制,实现进程间的内存隔离,增强系统安全性。
  4. 简化编程:提供线性、连续的地址空间,简化程序的编写和管理。

虚拟存储器的实现方法

        虚拟存储器是一种通过将物理内存与外存(例如磁盘)结合起来,为程序提供比实际物理内存更大的地址空间的技术。它可以有效提高内存的利用率,并支持更大的程序运行。

虚拟存储器的实现主要有两种方法:

1. 分页存储管理

        分页存储管理将虚拟地址空间和物理内存都划分成固定大小的页(Page)。每个页都有一个唯一的页号(Page Number)。虚拟地址由页号和页内偏移量(Page Offset)组成。

        在分页存储管理中,页表(Page Table)用于存储虚拟页号和物理页框号(Page Frame Number)的映射关系。页表寄存器(Page Table Register)则指向当前正在使用的页表。

        当程序访问一个虚拟地址时,CPU首先会将该地址分解为页号和页内偏移量。然后,CPU会使用页表寄存器中的基地址找到相应的页表项,并从中获取物理页框号。最后,CPU会将物理页框号和页内偏移量组合成物理地址,并访问相应的物理内存。

分页存储管理具有以下优点:

  • 实现简单,易于管理。
  • 可以有效防止内存碎片。
  • 支持共享内存。

2. 分段存储管理

        分段存储管理将虚拟地址空间划分为大小可变的段(Segment)。每个段都有一个唯一的段名(Segment Name)和长度(Length)。虚拟地址由段名和段内偏移量(Segment Offset)组成。

        在分段存储管理中,段表(Segment Table)用于存储段名和物理页框号的映射关系。段表寄存器(Segment Table Register)则指向当前正在使用的段表。

        当程序访问一个虚拟地址时,CPU首先会将该地址分解为段名和段内偏移量。然后,CPU会使用段表寄存器中的基地址找到相应的段表项,并从中获取物理页框号。最后,CPU会将物理页框号和段内偏移量组合成物理地址,并访问相应的物理内存。

分段存储管理具有以下优点:

  • 可以更好地利用内存空间,减少内存碎片。
  • 支持动态增长和收缩的段。
  • 可以灵活地实现共享内存和保护。

3. 段页式存储管理

        段页式存储管理结合了分页存储管理和分段存储管理的优点。它将虚拟地址空间划分为大小可变的段,每个段又进一步划分为固定大小的页。

段页式存储管理具有以下优点:

  • 兼顾了分页存储管理和分段存储管理的优点。
  • 可以更灵活地管理内存空间。

硬件支持

虚拟存储器的实现还需要硬件的支持,包括:

  • 地址变换机构(Address Translation Mechanism):负责将虚拟地址转换为物理地址。
  • 页表(Page Table):存储虚拟页号和物理页框号的映射关系。
  • 页表寄存器(Page Table Register):存储当前正在使用的页表的基地址。
  • 段表(Segment Table):存储段名和物理页框号的映射关系。
    • 段表寄存器(Segment Table Register):存储当前正在使用的段表的基地址。

结语

        虚拟存储器是 commonly used 的内存管理技术,它基于程序的局部性原理,为进程提供了比实际内存更大的地址空间。虚拟存储器通过在磁盘和内存之间移动进程页,实现了按需装入、共享和保护。了解虚拟存储器的概述,有助于我们理解操作系统中内存管理的技术细节,并提高系统的性能和稳定性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/24797.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++ ─── STL 以及string

前言:什么是STL STL(standard template libaray-标准模板库):是C标准库的重要组成部分,不仅是一个可复用的组件库,而且 是一个包罗数据结构与算法的软件框架 STL的六大组件 1. 为什么学习string类? 1.1 C语言中的字符…

Ambari集成Apache Kyuubi实践

目前还有很多公司基于HDP来构建自己的大数据平台,随着Apache Kyuubi的持续热度,如何基于原有的HDP产品来集成Apache Kyuubi,很多人都迫切的需求。集成Apache Kyuubi到HDP中,主要涉及Ambari的二次开发。本文详细叙述了集成Apache K…

力扣刷题分类合集

数组1.二分法:704.Binary Search(求下标) 704. Binary Search

SOA的作用和设计原则

1.SOA的作用 在一个企业内部,可能存在不同的应用系统,而这些应用系统由于开发的时间不同,采用的开发工具不同,一个业务请求很难有效地调用所有的应用系统。用简单的语言来表述,这些已有应用系统是孤立的,也…

分享一个用python的本地WIFI密码查看器

本章教程,主要分享一个本地wifi密码查看器,用python实现的,感兴趣的可以试一试。 具体代码 import subprocess # 导入 subprocess 模块,用于执行系统命令 import tkinter as tk # 导入 tkinter 模块,用于创建图形用…

Ubuntu bash按Table不联想

Ubuntu bash按Table不联想 bash-completion包未安装或损坏: 自动补全功能依赖于bash-completion包。首先,需要确保这个包已经安装。可以通过下面的命令安装或重新安装它: sudo apt install --reinstall bash-completion安装完成后&#xff0c…

使用RedissonClient的管道模式批量查询key

1.场景 遇到了一个场景,在客户给我们推送的数据中,咋1分钟左右,会有相同车辆vehicle 和时间 gpstime一样的数据,这类数据呢,我们认为是重复数据,需要过滤的 把相同 vehicle 和 gpstime 作为key存入到redis中…

MCU的环形FIFO

fifo.h #ifndef __FIFO_H #define __FIFO_H#include "main.h"#define RINGBUFF_LEN (500) //定义最大接收字节数 500typedef struct {uint16_t Head; // 头指针 指向可读起始地址 每读一个,数字1uint16_t Tail; // 尾指针 指…

实现Ingress-Nginx Controller高可用方案

文章目录 前提准备1.修改Ingress-Controller 运行模式为hostNetwork并生效2.给部署ingress-controller的节点打标签3.查看ingress-controller的部署情况 方式一:LVSKeepalivedNginxIngress一、部署ipvsadm和keepalived二、配置keepalived1.配置lvs01(keepalived mas…

Java Web学习笔记27——对话框、表单组件

常见组件对话框: Dialog对话框:在保留当前页面状态下,告知用户并承载相关操作。 dialogTableVisible: false 默认是不可见的。 在按钮属性中设置为true的意思,点击按钮的时候,才会true,对话框才会显示。 …

python Tk 获取输入框内容,分割内容

创建输入框、一个按钮和一个标签的GUI。 用户可以在输入框中输入文本,点击按钮后,程序将在控制台打印输入的文本(已经分割为列表),并在GUI中的标签上显示一些静态文本。 import tkinter as tk# 创建主窗口 root tk.…

基于SpringBoot+Vue学生请假管理系统设计和实现(源码+LW+调试文档+讲解等)

💗博主介绍:✌全网粉丝1W,CSDN作者、博客专家、全栈领域优质创作者,博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌💗 🌟文末获取源码数据库🌟 感兴趣的可以先收藏起来,还…

gitlab中配置全局钩子

设置全局pre-receive hooks vi /etc/gitlab/gitlab.rb #打开下面配置 gitaly[custom_hooks_dir] "/var/opt/gitlab/gitaly/custom_hooks" #保存退出 #创建钩子目录 mkdir -p /var/opt/gitlab/gitaly/custom_hooks/pre-receive.d cd /var/opt/gitlab/gitaly/custom_…

Netty网络应用框架

一.Netty 是什么? Netty 是一个基于 Java 的异步事件驱动网络应用框架,主要用于构建高性能、高可扩展性的网络服务器和客户端。Netty 提供了丰富的功能和工具集,使得开发网络应用程序变得更加简便和高效。 1.Netty 的优点 1.高性能: 异步和事件驱动架构…

linux指令--sed

sed 主要用来自动编辑一个或多个文件、简化对文件的反复操作、编写转换程序等。 语法解析 sed [选项] 编辑命令 文件 选项: -n:只显示匹配处理的行-e:执行多个编辑命令时-i:在原文件中进行修改,不输出到屏幕-…

常见知识点总结

文章目录 for of和for in区别 同源策略跨域资源共享跨域问题解决跨域jsonpcors方式nginx代理方式 apply,bind,call相同点不同点 js判断数据类型的方式typeofinstanceofconstructorObject下的toString.call()方法 闭包闭包的作用注意闭包的生命周期 body-parser for of和for in …

qsort函数

学习c语言的过程中少不了的就是排序&#xff0c;例如冒泡排序&#xff08;不清楚的同学可以翻找一下之前的文章&#xff09;&#xff0c; 我们这里将冒泡排序作为一个自定义函数来呈现一下 #include<stdio.h>void bubble_sort(int arr[], int len) {for (int i 0; i &…

【Vue】mutations

文章目录 一、定义mutations二、组件中提交 mutations三、带参数的 mutations 一、定义mutations mutations是vuex中的对象&#xff0c;这个对象可以定义在当前store的配置项中 const store new Vuex.Store({state: {count: 0},// 定义mutations// mutations是一个对象&#x…

自然语言处理(NLP)—— rasa的测试

1. 测试 Rasa NLU 模型 运行 rasa test nlu 命令会测试你的 Rasa NLU 模型。这个命令主要做以下几件事情&#xff1a; 1.1 意图识别测试 检查模型在识别用户意图方面的性能。这包括每个意图的准确率、召回率和 F1 得分。 1.2 实体提取测试 检查模型在识别和提取预定义实体方面…

为什么先遍历背包再遍历物品,求的是排列数;先遍历物品再遍历背包,求的是组合数?

完全背包问题简介 在完全背包问题中&#xff0c;每个物品可以被选择任意次。我们通常使用动态规划来求解这个问题&#xff0c;定义 dp[j] 为填满容量为 j 的背包的方法数。 先遍历背包再遍历物品&#xff08;排列数&#xff09; 先遍历背包再遍历物品的逻辑是&#xff1a;对…