一分钟系列:什么是虚拟内存?

一分钟系列:什么是虚拟内存?

转自:https://mp.weixin.qq.com/s/opMgZrXV-lfgOWrNUMKweg

注:一分钟系列的篇幅都不长,适合吃饭蹲坑、地铁公交上食用~

内存对于用户来说就是一个字节数组,我们可以根据地址来访问到某个字节或者某些字节:

在这里插入图片描述

很久之前的内存

很久很久之前,一台机器上只放置一个程序,操作系统仅仅作为一个函数库存在。对于内存来说,除去操作系统的代码和数据占用的一些空间外,其余空间全部分配给正在运行的那个程序,画个图就是这样:

在这里插入图片描述

小贴士:我们把运行着的程序称之为进程。

同时运行多个程序的内存

后来人们觉得同时在一台计算机上只运行一个程序太亏了,就设计了一个可以同时运行多个程序的机制。不过内存条只有一个,所以这些用户程序只能共享同一个内存条,只能把内存的不同部分划分给不同的用户程序,画个图就像是这样:

在这里插入图片描述

这样子的话也有一些问题:

  • 不同用户程序只能使用给他们规定好的那部分内存,也就是程序员在敲代码的时候就应该小心翼翼的计算自己使用的内存有没有占到别人家的地儿,这样对码农很不友好有木有。
  • 如果哪个心眼儿坏的家伙故意去读取别人家的程序使用的内存,这不就暴露了么,更严重的,这个坏家伙直接把别人家程序正在使用的内存的某些字节给更新掉,这就是天坑了~
  • 能使用的内存空间都给规定好了,太少了有木有~

虚拟内存

操作系统是个老好人,使命就是解决所有用户感到麻烦的事情。设计操作系统的大叔觉得,如果让用户直接去操作内存的话,用户也不知道其他人到底使用了内存的哪些字节,自己可以使用哪些字节,如果要做到这一点的话人们在开发程序的时候还要聚到一起开个会,把每个人该用哪块内存都规定好,即使规定好了用户还得小心翼翼的避免使用了不属于自己的那部分内存。干脆,干脆就不让用户直接操作内存了,让用户在编程序的时候直接把内存想象成一个非常非常大的字节数组就好了,自己在这个字节数组上可以随便折腾,他们把这个非常大的字节数组称之为虚拟内存,由操作系统完成从虚拟内存的虚拟地址到真实内存的真实地址之间的映射工作。画个图就像这样:

在这里插入图片描述

这样还有问题,用户越来越多,即使每个用户都使用非常少的内存空间,那加起来占用的内存空间都可能超过了真实内存的大小,更何况某些丧心病狂的程序员写的程序里本身就使用了超过真正内存大小的空间,这可怎么办。这难不倒设计操作系统的大叔们,他们机智的把硬盘也拉了进来。

在这里插入图片描述

操作系统完成由虚拟内存地址到真实内存地址或者磁盘地址之间的映射工作,这样子给用户提供的虚拟内存的地址空间就可以非常非常大,用户程序中那些很久都用不到的内存空间可以被操作系统给搞到磁盘上边存储,什么时候需要用了,又从磁盘中加载到真实内存中,重要的是这个过程全部是操作系统自动完成的,对于我们这些码农来说,编写程序就像是在一个炒鸡大的字节数组上将某个地方的数据搬到另一个地方,或者将某个地方的数据经过CPU的某种加工之后再放到某个字节数组的某个地方,整个过程so easy,完全不用担心有没有读取/覆盖掉别人正在使用的内存空间。

小贴士:对于Windows操作系统来说,虚拟内存所需的磁盘空间从系统盘,一般是C盘分配,当你的C盘剩余空间很少时就会导致很卡~

虚拟内存结构

我们说对于敲代码的码农来说,虚拟内存就是一个超级大的字节数组,不过这个字节数组也是被划分为多个部分的,并不是每个地方用户都可以访问,一般的虚拟内存结构长这样:

在这里插入图片描述

用户需要调用函数的时候,一般都会生成一个称之为栈帧的结构,从而导致虚拟内存中的栈空间增长。

用户需要单独申请内存空间时,就会从堆空间分配,从而导致虚拟内存中的堆空间增长。

这里需要强调的一点是,我们平时所说的操作系统内核不是一个进程,而是指操作系统的代码。

不知不觉我觉得超过了一分钟,下次再见~


来源:微信公众号

作者:小孩子4919

原文:虚拟内存是个啥 | 一分钟系列

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

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

相关文章

蓝桥杯真题训练 2019.3题

标题:数列求值 (本题总分:10 分)### 给定数列 1, 1, 1, 3, 5, 9, 17, …,从第 4 项开始,每项都是前 3 项的和。求 第 20190324 项的最后 4 位数字。 【答案提交】 这是一道结果填空的题,你只需…

11-Kafka

1 Kafka Kafka是一个分布式流式数据平台,它具有三个关键特性 Message System: Pub-Sub消息系统Availability & Reliability:以容错及持久化的方式存储数据记录流Scalable & Real time 1.1 Kafka架构体系 Kafka系统中存在5个关键组件 Producer…

虚拟内存精粹

虚拟内存精粹 标题:虚拟内存精粹 作者:潘建锋 原文:HTTPS://strikefreedom.top/memory-management–virtual-memory 导言 虚拟内存是当今计算机系统中最重要的抽象概念之一,它的提出是为了更加有效地管理内存并且降低内存出错的概…

蓝桥杯真题训练 2019.4题

标题: 数的分解(本题总分:10 分) 【问题描述】 把 2019 分解成 3 个各不相同的正整数之和,并且要求每个正整数都不包 含数字 2 和 4,一共有多少种不同的分解方法? 注意交换 3 个整数的顺序被视…

深度学习自动编译和优化技术调研

深度学习自动编译和优化技术调研 转自:https://moqi.com.cn/blog/deeplearning/ 作者:墨奇科技全栈开发 在墨奇科技,我们需要将一些包含深度神经网络(DNN)的 AI 算法移植到边缘端的设备, 这些设备往往使用 …

三元组数据处理系统

include<stdio.h> include<stdlib.h> define OK 1 define ERROR 0 define OVERFLOW -2 typedef int Status; typedef float ElemType; typedef ElemType *Triplet; // 声明Triplet为ElemType指针类型 //三元组的初始化 Status initTriplet(Triplet &T, E…

Copy-On-Write COW机制

Copy-On-Write COW机制 转自&#xff1a;https://zhuanlan.zhihu.com/p/48147304 作者&#xff1a;Java3y 前言 只有光头才能变强 在读《Redis设计与实现》关于哈希表扩容的时候&#xff0c;发现这么一段话&#xff1a; 执行BGSAVE命令或者BGREWRITEAOF命令的过程中&#xff0c…

实验报告:抽象数据类型的表现和实现

实验报告&#xff1a;抽象数据类型的表现和实现 实验内容 基本要求&#xff1a; 设计实现抽象数据类型“三元组”&#xff0c;要求动态分配内存。每个三元组由任意三个实数的序列构成&#xff0c;基本操作包括&#xff1a;创建一个三元组&#xff0c;取三元组的任意一个分量&…

关于x86、x86_64/x64、amd64和arm64/aarch64

关于x86、x86_64/x64、amd64和arm64/aarch64 转自&#xff1a;https://www.jianshu.com/p/2753c45af9bf 为什么叫x86和x86_64和AMD64? 为什么大家叫x86为32位系统&#xff1f; 为什么软件版本会注明 for amd64版本&#xff0c;不是intel64呢&#xff1f; x86是指intel的开…

实验报告: 线性表的基本操作及应用

实验报告&#xff1a; 线性表的基本操作及应用 实验内容 基本要求&#xff1a; &#xff08;1&#xff09;实现单链表的创建&#xff1b;&#xff08;2&#xff09;实现单链表的插入&#xff1b;&#xff08;3&#xff09;实现单链表的删除 &#xff08;4&#xff09;实现单链…

TVM:源码编译安装

TVM&#xff1a;Linux源码编译安装 笔者环境&#xff1a; OS&#xff1a;Ubuntu 18.04 CMake&#xff1a;3.10.2 gcc&#xff1a;7.5.0 cuda&#xff1a;11.1 编译安装过程总览 本文将简介 tvm 的编译安装过程&#xff0c;包含两个步骤&#xff1a; 通过C代码构建共享库设置相…

第2章线性表的基本使用及其cpp示例(第二章汇总,线性表都在这里)

2.1线性表的定义和特点 【类型定义&#xff1a; *是n个元素的有限序列 *除了第一个元素没有直接前驱和最后一个没有直接后驱之外&#xff0c;其余的每个元素只有一个直接前驱和直接后驱&#xff1b; &#xff08;a1,a2…an&#xff09; 【特征&#xff1a; *有穷性&#xff1…

TVM:通过Python接口(AutoTVM)来编译和优化模型

TVM&#xff1a;通过Python接口&#xff08;AutoTVM&#xff09;来编译和优化模型 上次我们已经介绍了如何从源码编译安装 tvm&#xff0c;本文我们将介绍在本机中使用 tvm Python 接口来编译优化模型的一个demo。 TVM 是一个深度学习编译器框架&#xff0c;有许多不同的模块…

TVM:在树莓派上部署预训练的模型

TVM&#xff1a;在树莓派上部署预训练的模型 之前我们已经介绍如何通过Python接口&#xff08;AutoTVM&#xff09;来编译和优化模型。本文将介绍如何在远程&#xff08;如本例中的树莓派&#xff09;上部署预训练的模型。 在设备上构建 TVM Runtime 首先我们需要再远程设备…

2.2线性表的顺序表

2.2.1线性表的顺序表示和实现------顺序映像 【顺序存储】在【查找时】的时间复杂度为【O(1)】&#xff0c;因为它的地址是连续的&#xff0c;只要知道首元素的地址&#xff0c;根据下标可以很快找到指定位置的元素 【插入和删除】操作由于可能要在插入前或删除后对元素进行移…

TVM:交叉编译和RPC

TVM&#xff1a;交叉编译和RPC 之前我们介绍了 TVM 的安装、本机demo和树莓派远程demo。本文将介绍了在 TVM 中使用 RPC 进行交叉编译和远程设备执行。 通过交叉编译和 RPC&#xff0c;我们可以在本地机器上编译程序&#xff0c;然后在远程设备上运行它。 当远程设备资源有限…

2.3单链表的基本使用及其cpp示例

2.3线性表的链式表现与实现 2.3.1.1单链表 【特点&#xff1a; *用一组任意的存储单元存储线性表的数据元素 *利用指针实现用不同相邻的存储单元存放逻辑上相邻的元素 *每个元素ai&#xff0c;除存储本身信息外&#xff0c;还存储其直接后继的元素&#xff08;后一个元素的地址…

TVM:简介

TVM&#xff1a;简介概述 Apache TVM 是一个用于 CPU、GPU 和机器学习加速器的开源机器学习编译器框架。它旨在使机器学习工程师能够在任何硬件后端上高效地优化和运行计算。本教程的目的是通过定义和演示关键概念&#xff0c;引导您了解 TVM 的所有主要功能。新用户应该能够从…

2.3.3单链表的双向链表

2.3.3双向链表 插入、删除 指在前驱和后驱方向都能游历&#xff08;遍历&#xff09;的线性链表 双向链表的每个结点有两个指针域 【结构】&#xff1a;prior data next 双链表通常采用带头结点的循环链表形式 可理解为首位相接的数据“圈”&#xff0c;每个结点都可以向前…

nvidia-smi 命令详解

nvidia-smi 命令详解 简介 nvidia-smi - NVIDIA System Management Interface program nvidia smi&#xff08;也称为NVSMI&#xff09;为来自 Fermi 和更高体系结构系列的 nvidia Tesla、Quadro、GRID 和 GeForce 设备提供监控和管理功能。GeForce Titan系列设备支持大多数…