操作系统内存分配(隔离,分段和分页)

news2024/11/13 16:22:45

内存分配问题

进程的总体目标是希望每个进程从逻辑上来看都可以独占计算机的资源。操作系统的多任务功能使得CPU能够在多个进程之间很好地共享,从进程的角度看好像是它独占了CPU而不用考虑与其他进程分享CPU的事情。操作系统的I/O抽象模型也很好地实现了IO设备的共享和抽象,那么唯一剩下的就是主存,也就是内存的分配问题了。

在早期的计算机中,程序是直接运行在物理内存上的,也就是说,程序在运行时所访问的地址都是物理地址。当然,如果一个计算机同时只运行一个程序,那么只要程序要求的内存空间不要超过物理内存的大小,就不会有问题。但事实上为了更有效地利用硬件资源,我们必须同时运行多个程序,正如前面的多道程序、分时系统和多任务中一样,当我们能够同时运行多个程序时,CPU 的利用率将会比较高。那么很明显的一个问题是,如何将计算机上有限的物理内存分配给多个程序使用

假设我们的计算机有128 MB内存,程序A运行需要10 MB,程序B需要100 MB,程序C需要20 MB。如果我们需要同时运行程序A和B,那么比较直接的做法是将内存的前10MB分配给程序A,10MB~110MB分配给B。这样就能够实现A和B两个程序同时运行,但是这种简单的内存分配策略问题很多。

1.地址空间不隔离: 所有程序都直接访问物理地址,程序所使用的内存空间不是相互隔离的。恶意的程序可以很容易改写其他程序的内存数据,以达到破坏的目的;有些非恶意的、但是有臭虫的程序可能不小心修改了其他程序的数据,就会使其他程序也崩溃,这对于需要安全稳定的计算环境的用户来说是不能容忍的。用户希望他在使用计算机的时候,其中一个任务失败了,至少不会影响其他任务。

2.内存使用效率低: 由于没有有效的内存管理机制,通常需要一个程序执行时,监控程序就将整个程序装入内存中然后开始执行。如果我们忽然需要运行程序C,那么这时内存空间其实已经不够了,这时候我们可以用的一个办法是将其他程序的数据暂时写到磁盘里面,等到需要用到的时候再读回来。由于程序所需要的空间是连续的,那么这个例子里面,如果我们将程序A换出到磁盘所释放的内存空间是不够的,所以只能将B换出到磁盘,然后将C读入到内存开始运行。可以看到整个过程中有大量的数据在换入换出,导致效率十分低下。

3.程序运行的地址不确定: 因为程序每次需要装入运行时,我们都需要给它从内存中分配一块足够大的空闲区域,这个空闲区域的位置是不确定的。这给程序的编写造成了一定的麻烦,因为程序在编写时,它访问数据和指令跳转时的目标地址很多都是固定的,这涉及程序的重定位问题,我们在后面还会详细探讨重定位的问题。

关于隔离

让我们回到程序的运行本质上来。用户程序在运行时不希望介入到这些复杂的存储器管理过程中,作为普通的程序,它需要的是一个简单的执行环境,有一个单一的地址空间、有自己的 CPU,好像整个程序占有整个计算机而不用关心其他的程序(当然程序间通信的部分除外,因为这是程序主动要求跟其他程序通信和联系)。所谓的地址空间是个比较抽象的概念,你可以把它想象成一个很大的数组,每个数组的元素是一个字节,而这个数组大小由地址空间的地址长度决定,比如32位的地址空间的大小为232=4294967296字节,即4GB,地址空间有效的地址是0~4294967295,用十六进制表示就是0x00000000~0xFFFFFFFF。地址空间分两种:虚拟地址空间(Virtual Address Space)和物理地址空间(Physical Address Space)。物理地址空间是实实在在存在的,存在于计算机中,而且对于每一台计算机来说只有唯一的一个,你可以把物理空间想象成物理内存,比如你的计算机用的是Intel的Pentium4的处理器,那么它是32位的机器,即计算机地址线有32条(实际上是36条地址线,不过我们暂时认为它只是32条),那么物理空间就有4GB。但是你的计算机上只装了512MB的内存,那么其实物理地址的真正有效部分只有0x00000000~0x1FFFFFFF,其他部分都是无效的(实际上还有一些外部IO 设备映射到物理空间的,也是有效的,但是我们暂时无视其存在)。虚拟地址空间是指虚拟的、人们想象出来的地址空间,其实它并不存在,每个进程都有自己独立的虚拟空间,而且每个进程只能访问白己的地址空间,这样就有效地做到了进程的隔离。

在操作系统中,进程与进程间的内存和数据都是不共享的。两个进程就好像大海中相互独立的两个岛屿,各自生活在互相平行的两个世界中,互不干扰,各自为政。这样做的目的,是为了避免进程间相互操作数据的现象发生,从而引起各自的安全问题。为了实现进程隔离,采用了虚拟地址空间,两个进程各自的虚拟地址不同,从逻辑上来实现彼此间的隔离。

分段(Segmentation)

最开始人们使用的是一种叫做分段(Segmentation) 的方法,基本思路是把一段与程序所需要的内存空间大小的虚拟空间映射到某个地址空间。比如程序A需要10MB内存,那么我们假设有一个地址从0x00000000到0x00A00000的10MB大小的一个假象的空间,也就是虚拟空间,然后我们从实际的物理内存中分配一个相同大小的物理地址,假设是物理地址0x00100000开始到0x00B00000结束的一块空间。然后我们把这两块相同大小的地址空间一一映射,即虚拟空间中的每个字节相对应于物理空间中的每个字节。这个映射过程由软件来设置,比如操作系统来设置这个映射函数,实际的地址转换由硬件完成。比如当程序A中访问地址0x00001000时,CPU会将这个地址转换成实际的物理地址0x00101000。那么比如程序A和程序B在运行时,它们的虚拟空间和物理空间映射关系可能如图所示:

在这里插入图片描述

分段的方法基本解决了上面提到的3个问题中的第一个和第三个。首先它做到了地址隔离,因为程序A和程序B被映射到了两块不同的物理空间区域,它们之间没有任何重叠,如果程序A访问虚拟空间的地址超出了0x00A00000这个范围,那么硬件就会判断这是一个非法的访问,拒绝这个地址请求,并将这个请求报告给操作系统或监控程序,由它来决定如何处理。再者,对于每个程序来说,无论它们被分配到物理地址的哪一个区域,对于程序来说都是透明的,它们不需要关心物理地址的变化,它们只需要按照从地址0x00000000 到0x00A00000来编写程序、放置变量,所以程序不再需要重定位。

但是分段的这种方法还是没有解决我们的第二个问题,即内存使用效率的问题。分段对内存区域的映射还是按照程序为单位,如果内存不足,被换入换出到磁盘的都是整个程序,这样势必会造成大量的磁盘访问操作,从而严重影响速度,这种方法还是显得粗糙,粒度比较大。事实上,根据程序的局部性原理,当一个程序在运行时,在某个时间段内,它只是频繁地用到了一小部分数据,也就是说,程序的很多数据其实在一个时间段内都是不会被用到的。人们很自然地想到了更小粒度的内存分割和映射的方法,使得程序的局部性原理得到充分的利用,大大提高了内存的使用率。这种方法就是分页(Paging)

分页(Paging)

分页的基本方法是把地址空间人为地等分成固定大小的页,每一页的大小由硬件决定,或硬件支持多种大小的页,由操作系统选择决定页的大小。比如Intel Pentium系列处理器支持4KB或4MB的页大小,那么操作系统可以选择每页大小为4KB,也可以选择每页大小为4MB,但是在同一时刻只能选择一种大小,所以对整个系统来说,页就是固定大小的。目前几乎所有的PC上的操作系统都使用4KB大小的页。我们使用的PC机是32位的虚拟地址空间,也就是4GB,那么按4KB每页分的话,总共有1048576个页。物理空间也是同样的分法。

下面我们来看一个简单的例子,如图所示,每个虚拟空间有8页,每页大小为1KB,那么虚拟地址空间就是8KB。我们假设该计算机有13条地址线,即拥有213的物理寻址能力,那么理论上物理空间可以多达8KB。但是出于种种原因,购买内存的资金不够,只买得起6KB的内存,所以物理空间其实真正有效的只是前6KB。

在这里插入图片描述

那么,当我们把进程的虚拟地址空间按页分割,把常用的数据和代码页装载到内存中,把不常用的代码和数据保存在磁盘里,当需要用到的时候再把它从磁盘里取出来即可。以上图为例,我们假设有两个进程 Process1和 Process2,它们进程中的部分虚拟页面被映射到了物理页面,比如 VP0、VP1和VP7映射到PP0、PP2和PP3;而有部分页面却在磁盘中,比如VP2和VP3位于磁盘的DP0和 DP1中;另外还有一些页面如VP4、VP5和VP6可能尚未被用到或访问到,它们暂时处于未使用的状态。在这里,我们把虚拟空间的页就叫虚拟页(VP,Virtual Page),把物理内存中的页叫做物理页(PP,Physical Page),把磁盘中的页叫做磁盘页(DP,Disk Page)。图中的线表示映射关系,我们可以看到虚拟空间的有些页被映射到同一个物理页,这样就可以实现内存共享。

图中Process1的 VP2和VP3不在内存中,但是当进程需要用到这两个页的时候,硬件会捕获到这个消息,就是所谓的页错误(Page Fault),然后操作系统接管进程,负责将VP2和 VP3从磁盘中读出来并且装入内存,然后将内存中的这两个页与VP2和VP3之间建立映射关系。以页为单位来存取和交换这些数据非常方便,硬件本身就支持这种以页为单位的操作方式。

保护也是页映射的目的之一,简单地说就是每个页可以设置权限属性,谁可以修改,谁可以访问等,而只有操作系统有权限修改这些属性,那么操作系统就可以做到保护自己和保护进程

虚拟存储的实现需要依靠硬件的支持,对于不同的CPU来说是不同的。但是几乎所有的硬件都采用一个叫 MMU ( Memory Management Unit) 的部件来进行页映射,如图所示:

在这里插入图片描述

在页映射模式下,CPU发出的是Virtual Address,即我们的程序看到的是虚拟地址。经过MMU转换以后就变成了Physical Address。一般MMU都集成在CPU内部了,不会以独立的部件存在。

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

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

相关文章

【增长的本质】-

关于作者 塞萨尔伊达尔戈,出生在智利,现在是美国麻省理工学院媒体实验室宏观联系研究团队的主管。他是一位著名的跨界物理学家,最擅长的就是利用物理概念来分析和解释经济、文化领域的大问题。他还长期致力于研究促进经济增长和繁荣的因素&a…

2022最新xcode打包IPA(完整详细图文)​

本文详细讲述iOS的App开发后如何进行证书的创建和项目中如何配置证书及上传到苹果App管理后台后如何新增与更新版本。​ 前期准备:​ ① Mac OS电脑​ ② 一款开发完毕的App​ ③ 99美元的开发者证书一个(此证书提供App上传到App Store),苹果的另外一个299美元一年的证书打…

F28069的cpu定时器

工程搭建参考:https://blog.csdn.net/feisy/article/details/126380289 F28069有三个32位的CPU定时器:0,1,2。0,1可用,如果程序未使用DIS/BIOS,定时器2也可用。 CPU定时器相关的有5个信号,四个输入信号&…

jenkins调用metersphere自动化接口

metersphere自动化测试场景,可以用过jenkins job配至界面化传参数,传递给metersphere动态执行脚本。 1.下载metersphere jenkins插件 Releases metersphere/jenkins-plugin GitHub 2.jenkins安装metersphere插件 Jenkins 的插件管理页面&#xff0c…

谷歌翻译不能用了

最近发现谷歌翻译不能使用了,对于英语不好的我是个问题呀。 解决办法: 网上说要执行 win r 然后 进行ipConfig 结果我试了,没有一点用。 来先试试这个吧,直接就成功了。 看 图 找到 C:\Windows\System32\drivers\etc\hosts文件 …

【爬虫】力扣每日一题每天自动邮件提醒!!!

使用python实现了一个力扣每日一题每天自动邮件提醒的小爬虫,小但实用!!! 文章目录A.需求来源与分析B.技术角度分析C.具体分析步骤1.接口协议分析2.发邮件3.写crontab放服务器上定时跑D.成品1.源代码2.效果3.使用说明免责申明A.需…

面试官:你先回去等通知吧!这个 Java 岗位我还有机会吗?

面试官:看你简历写的不错,先简单自我介绍下? 我:大佬好!我是小程,工作时长两年半,目前负责在公司打杂,啊不,负责维护公司的两个项目… 面试官:hmmm&#xf…

[激光原理与应用-37]:《光电检测技术-4》- 光学测量基础 - 噪声与光学中的常见电路

目录 第1章 噪声 1.1 什么是噪声 1.2 分类 第2章 电子电路的常见噪声 2.1 通过放电产生的噪声 2.2 因为辐射干扰而产生的噪声 2.3 特定器件固有的噪声源 2.4 电子电路中噪声监测办法 第3章 光学电路常见噪声 3.1 常见噪声 3.2 噪声处理 第4章 光学电路中常见的电路…

双指针题目

比较含退格的字符串 给定 s 和 t 两个字符串,当它们分别被输入到空白的文本编辑器后,如果两者相等,返回 true 。# 代表退格字符。 class Solution {public boolean backspaceCompare(String S, String T) {int S_Len S.length(), T_Len T.…

[附源码]计算机毕业设计数字乡村基础治理系统Springboot程序

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

NFV网络云落地过程中若干问题分析

Labs 导读NFV技术从诞生起,从根本上来说就是为了解决运营商网络演进中部署成本高,迭代更新慢,架构僵化等痛点问题。同时,在引入NFV技术前,旧有产业链相对单一,核心成员主要包括设备制造商、芯片制造商等&am…

[Mysql]数据库约束

文章目录前言1. 数据库约束1.1 not null1.2 unique1.3 primary key,主键约束1.4 default,设置默认值1.5 foreign key 外键约束前言 数据库约束,在实际应用中,由于某些特定的要求,例如学生的学号不能为空,学生表中的班级id,在班级表中要能存在…

python足球作画

努力是为了不平庸~ 学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。 足球(Football[英]、 Soccer[美])是一项以脚为主,控制和支配球,两支球队按照一定规则在同一块长方形…

HTML如何制作公司网站首页(web前端期末大作业)

🎉精彩专栏推荐 💭文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业: 【📚毕设项目精品实战案例 (10…

新老用户该如何选择腾讯云服务器!

随着云计算的快速发展,很多用户都选择上云,上运中最常见的产品就是云服务器CVM和轻量应用服务器了,那么怎么选购最优惠呢,这篇文章将介绍新老用户选购腾讯云服务器的几个优惠方法。 一、买赠专区 第一个介绍的就是买赠专区&…

软考高级——系统架构设计师通关宝库

关于报考时间。每年8到9月进行报名,11月考试。一定要关注报名时间,各省有些许差别。系统架构设计师一年只有一次考试机会。 关于考试科目。考试科目分为 综合题(选择题案例分析题论文题。 其中综合题只有75道,考试时间两个半小时…

企企通成功入选「亿欧EqualOcean 2022 中国SaaS 50强」榜单!

近日,由EqualOcean全球化智库主办的2022 EqualOcean Summit for Globalization (ESG) 2022 全球化峰会顺利召开,并重磅发布《2022年中国SaaS 50强》榜单。作为行业领先的数字化采购SaaS服务商,企企通凭借在SRM领域的持续创新和深厚的SaaS服务经验成功入选…

CSS栅格布局(Grid)

今天写页面布局,突然想到了栅格布局,以往习惯了弹性布局,然后发现栅格布局有点香,然后就简单的整理了一下,用于学习与分享。 一、什么是栅格布局 可以理解为将一个元素分成行列,然后可以设置对应的大小、布…

接口自动化测试:mock server之Moco工具

什么是mock server mock:英文可以翻译为模仿的,mock server是我们用来解除依赖(耦合),假装实现的技术,比如说,前端需要使用某些api进行调试,但是服务端并没有开发完成这些api&#…

机器学习:在SAS中运行随机森林

为了在SAS中运行随机森林,我们必须使用PROC HPFOREST指定目标变量,并说明天气变量是“类别”还是“定量”。 最近我们被客户要求撰写关于随机森林的研究报告,包括一些图形和统计输出。为了进行此分析,我们使用了目标(…