对于用户来说,内存就像是一个可以按地址访问的字节数组:
在很久之前,内存的使用非常简单。一台机器上通常只运行一个程序,操作系统仅作为一个函数库存在。内存中,除了操作系统占用的一些空间外,其余部分都分配给运行的程序,示意图如下:
随着需求的增长,人们开始希望在一台计算机上同时运行多个程序。然而,由于内存条只有一个,这些程序必须共享同一块内存,因此需要将内存划分为不同的部分分配给不同的程序,如图所示:
这种方法存在一些问题:
不同程序只能使用分配给它们的特定内存区域,程序员在编写代码时必须小心计算,避免侵占其他程序的内存空间。这对开发者来说非常不友好。此外,如果有恶意程序试图读取或修改其他程序的内存,这不仅会暴露信息,还可能导致严重的问题。另外,可用的内存空间有限,限制了程序的扩展性。
为了解决这些问题,操作系统引入了虚拟内存的概念。操作系统的设计者认为,如果用户直接操作内存,会面临无法确定其他程序使用了哪些内存的问题。为了避免这种复杂性,他们设计了让用户将内存视为一个超大字节数组的方案,称为
虚拟内存
。操作系统负责将虚拟地址映射到实际的物理内存地址,如下图所示:
然而,随着用户数量的增加,即使每个用户只使用少量内存,总需求可能会超过物理内存的容量。此外,一些程序可能本身就需要超过物理内存的空间。为了应对这一挑战,操作系统的设计者聪明地利用了硬盘。
操作系统负责将虚拟内存地址映射到物理内存地址或磁盘地址,从而提供了一个巨大的虚拟内存空间。那些长时间不使用的内存可以被操作系统移到磁盘上,需要时再加载回物理内存。这个过程完全由操作系统自动完成,程序员只需在编写代码时像操作一个巨大的字节数组一样,轻松地移动数据或进行CPU处理,而无需担心侵入其他程序的内存空间。
虚拟内存的结构对于程序员来说是一个超大的字节数组,但它也被划分为不同的部分,并非所有部分都可访问。一般的虚拟内存结构如下:
当用户调用函数时,会生成一个称为
栈帧
的结构,导致虚拟内存中的
栈空间
增长。
当用户需要申请额外的内存时,系统会从
堆空间
分配,从而导致虚拟内存中的
堆空间
增长。
需要特别指出的是,我们常说的操作系统
内核
并不是一个独立的进程,而是指操作系统的代码部分。
以上就是虚拟内存是个啥的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/126578.html
微信扫一扫
支付宝扫一扫