面试题:请解释一下什么是虚拟内存?

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

很久之前的内存

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

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

同时运行多个程序的内存

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

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

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

虚拟内存

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

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

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

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

虚拟内存结构

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

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

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

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

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

Image placeholder
Knight_Arthur
未设置
  52人点赞

没有讨论,发表一下自己的看法吧

推荐文章
【搞定 Java 并发面试】面试最常问的 Java 并发基础常见面试题总结!

Java并发基础常见面试题总结 1.什么是线程和进程? 1.1.何为进程? 进程是程序的一次执行过程,是系统运行程序的基本单位,因此进程是动态的。系统运行一个程序即是一个进程从创建,运行到消亡的过程。

面试官问:请介绍一下MySQL数据库的锁机制?

为什么要加锁问题背景当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况。若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性。要解决的问题多用户环境下保证数

阿里面试题:如何保证缓存与数据库的双写一致性?

作者:你是我的海啸出处:https://blog.csdn.net/chang384915878/article/details/86756463只要用缓存,就可能会涉及到缓存与数据库双存储双写,你只

面试题:如何理解 Linux 的零拷贝技术?

本文讲解Linux的零拷贝技术,云计算是一门很庞大的技术学科,融合了很多技术,Linux算是比较基础的技术,所以,学好Linux对于云计算的学习会有比较大的帮助。本文借鉴并总结了几种比较常见的Linu

关于面试题:[1, 2, 3].map(parseInt)问题的剖析

一、前言最近有小伙伴在公号中咨询了胡哥这道面试题,窃以为是比较有意思的一道面试题,于此分享给各位小伙伴。先把答案给了各位,和你理解的一样吗?![1,2,3].map(parseInt)//[1,NaN

浏览器中的JavaScript:什么是文档对象模型?什么是DOM操作?

JavaScript并没有那么糟糕。作为运行在浏览器中的脚本语言,它对于网页操作非常有用。在本文中,我们将看到可以用哪些手段来修改HTML文档和交互。什么是文档对象模型?文档对象模型是在浏览器中一切的

Stack Overflow 上最火的一个问题:什么是 NullPointerException

在逛StackOverflow的时候,发现最火的问题竟然是:什么是NullPointerException(java.lang.NullPointerException),它是由什么原因导致的,有没有

【分享】2020年大前端面试题库 - 备战明年金三银四

https://segmentfault.com/a/119000002122195...2020年大前端面试题库-备战明年金三银四前端面试 阅读约10分钟写在前面现在面试文章已很多,更不觉得新鲜,本

干货满满 | 来自灵魂的拷问-这21道Redis面试题

1、使用redis有哪些好处?速度快,因为数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1)支持丰富数据类型,支持string,list,set,sort

两万字的数据库面试题,不看绝对后悔

一、基本概念1.主键、外键、超键、候选键超键:在关系中能唯一标识元组的属性集称为关系模式的超键。一个属性可以为作为一个超键,多个属性组合在一起也可以作为一个超键。超键包含候选键和主键。候选键:是最小超

面试题总结:可能是全网最好的MySQL重要知识点

作者:Snailclimb 整理编辑:SegmentFault本文原载于SegmentFault专栏JavaGuide,如侵删。标题有点标题党的意思,但希望你在看了文章之后不会有这个想法——这篇文章是

PHP面试题

是总监面试的我,目前对我来说,是很有难度的。 1个进程执行是1s,10个进程同时执行是多长时间,1万个进程同时执行是多长时间?也是1s吗?我觉得这个问题,涉及到了进程间的切换么? 这两个执行,那个会

什么是刻意练习?

刻意练习,不是简单的重复又重复。 “刻意练习”的概念要这样分开理解,“刻意”什么?“练习”什么?“刻意”就是持续做自己不会的事情,比如这章节的知识点没弄明白,我就要去行动起来去弄明白,如查文档,看点评

基础信息:什么是 MySQL?

MySQL是一个开源的深受欢迎的关系型数据库管理系统(简称RDBMS)。目前排名第二,仅次于Oracle数据库。 MySQL可以免费下载,但是,还提供了几个付费版本,这些版本提供了附加功能。 顾名思义

Kubernetes 基础信息:什么是 Kubernetes?

简介 Kubernetes(常简称为K8s,在希腊语意为“舵手”或“驾驶员”)是用于自动部署、扩展和管理容器化(containerized)应用程序的开源系统。 由JoeBeda、BrendanBur

Redis为什么是单线程、及高并发快的3大原因详解

Redis的高并发和快速原因 1.redis是基于内存的,内存的读写速度非常快; 2.redis是单线程的,省去了很多上下文切换线程的时间; 3.redis使用多路复用技术,可以处理并发的连接。非阻塞

Linux/Unix 基础:什么是 Linux?

简单来讲,Linux是一个操作系统(OS)。我们都很熟悉其他操作系统,就像Microsoftwindows,AppleMacOS,iOS,Googleandroid,等等这些,linux就像它们一样,

一座岛告诉你,什么是智慧!

华为中国生态伙伴大会2019已落下帷幕,两天的时间,华为向大家展示了什么是智慧,什么才是真正的数字世界,当然还有那座仅用30天打造的一座“智慧岛”。

什么是边缘计算及其重要性?

边缘计算正在改变世界上数百万台设备处理,处理和传递数据的方式。联网设备(IoT)的爆炸性增长,以及需要实时计算能力的新应用,继续推动着边缘计算系统的发展。诸如5G无线之类的更快的联网技术,使边缘计算系

什么是react组件

什么是react组件组件就是页面上的一部分。我们可以把一个大的网页拆分成很多小的部分。比如标题部分,对应一个组件,就是标题组件。搜索部分,对应的组件就是搜索组件。页面上很多区域也可以拆分成组件,所以页

什么是Vue-CLI?

vue-cli是有Vue提供的一个官方cli,专门为单页面应用快速搭建繁杂的脚手架。它是用于自动生成vue.js+webpack的项目模板,是为现代前端工作流提供了batteries-included

什么是jquery插件?

什么是jquery插件?jQuery插件,就是开发爱好者自己利用Jquery制作的特效,然后经过封包或包装处理成js文件,发布到网上供大家使用的脚本集合。通常这类插件除了调用jQuery库文件,还需要

HTML 什么是内联元素?

内联元素(inlineelement)也叫内嵌元素或行内元素,一般都是基于语义级(semantic)的基本元素。内联元素只能容纳文本或者其他内联元素,通常被包括在块元素中使用,常见内联元素有“a、b、

css什么是雪碧图?

css雪碧图即CSSSprite,又称CSS精灵,也被称为“CSS图像拼合”、“CSS贴图定位”或“CSS图片精灵”,是一种网页图片应用处理方式。其实就是把一个页面涉及到的所有零星图片都包含到一张大图