内存分配方式

2023-05-16

内存分配方式

1.基本概念

①内存管理的基本概念

虽然计算机硬件发展,内存容量在不断变大,但是也不可能将所有用户进程和系统所需要的程序和数据放入内存中,因此操作系统必须要对内存空间进行合理划分和有效动态分配。操作系统对内存的划分和动态分配,就是内存管理的概念。

②程序的连接和装入

创建进程首先要将程序和数据装入内存。将用户源程序变为可在内存中执行的程序,通常需要以下几个步骤:

  • 预编译、编译、汇编、链接将源代码转换成可执行程序。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-z3eIPxFC-1658219812073)(C:\Users\ThinkStation K\AppData\Roaming\Typora\typora-user-images\1658147675292.png)]

  • 由装入程序将装入模块装入内存中运行。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Kbct7Koi-1658219812074)(C:\Users\ThinkStation K\AppData\Roaming\Typora\typora-user-images\1658148478394.png)]

③逻辑地址与物理地址

  • 逻辑地址(虚拟地址):经过预编译、编译、汇编后生成的各个模块(目标代码)都是从0号单元开始编址,这成为该模块的相对地址(逻辑地址)。在进程运行时,看到和使用的地址都是逻辑地址,用户和程序员只知道逻辑地址。

  • 逻辑地址空间(虚拟地址空间):连接程序将各个模块连接成一个完整的可执行目标程序时,依次按各个模块的相对地址构成统一的从0开始的逻辑地址空间(虚拟地址空间)。

  • 物理地址(绝对地址):进程在运行时执行指令和访问数据,最后都要通过物理地址从主存中存取。当装入程序将可执行代码装入内存时,必须通过地址转换将逻辑地址转换成物理地址,这个过程称为地址重定位。

④进程的内存映像(虚拟内存分布)

不同于放在硬盘上的可执行程序文件,当一个程序调入内存运行时,就构成了进程的内存映像。一般内存映像包括以下几个部分:

  • 内核区:主要包括进程控制块PCB。
  • 堆区: 动态申请内存用。
  • 栈区: 存放局部变量、函数参数值。
  • 数据区: 存放程序中已经初始化的全局变量和全局变量的一块内存区域。
  • 代码区: 存放执行代码的一段区域(只读)。
  • BSS区: 存放未初始化的全局变量和静态变量的一块内存区域。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3lkoZiiD-1658219812075)(C:\Users\ThinkStation K\AppData\Roaming\Typora\typora-user-images\1658149978620.png)]

2.内存的连续分配管理方式

连续分配方式是指为一个用户分配一个连续的内存空间,例如:用户需要100MB内存,就在内存中开辟一块连续的100MB空间供其使用。连续分配方式主要包括单一连续分配、固定分区分配和动态分区分配。

①单一连续分配

在此方式下,内存中仅有一道用户程序,被独占,不使用这种方法。优缺点如下:

  • 优点:简单、无外部碎片
  • 缺点:有内部碎片、内存利用率极低。

②固定分区分配

固定分区是最简单的一种多道批程序存储管理方式,它将用户内存空间划分为若干固定大小的区域,每个区域只装入一个进程。优缺点如下:

  • 优点:程序可能太大放入不了任何一个分区。
  • 缺点:程序太小独占一个分区,造成内部碎片。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-v0nzohKT-1658219812075)(C:\Users\ThinkStation K\AppData\Roaming\Typora\typora-user-images\1658150805907.png)]

③动态分区分配

又称为可变分区分配,它是在进程装入内存时,根据进程的实际需要,动态地位置分配内存。使分区的大小正好适合进程的需要。优缺点如下:

  • 优点:一开始内存利用率较高。
  • 缺点:随着时间推移,内存中会产生越来越多的小的内存块,内存的利用率也随之下降,这些碎片成为外部碎片。可以这个问题,操作系统可以时不时地对进程进行碎片整理来解决。

3.基本分页存储管理

固定分区会产生内部碎片,动态分区会产生外部碎片,这两种技术对内存的利用率都比较低,我们希望尽可能避免碎片地产生,这就产生了分页地思想:把主存空间划分为大小相等且固定地块,块相对较小,作为主存地基本单位。每个进程以块为单位进行划分,进程在执行时,以块为单位逐个申请主存中地块空间。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-n6vmQlUD-1658219812075)(C:\Users\ThinkStation K\AppData\Roaming\Typora\typora-user-images\1658152234789.png)]

3.1基本概念

①易混淆

  • 进程中的块:页或页面
  • 页或页面的编号:页号
  • 内存中的块:页框或页帧
  • 页框的编号:块号
  • 页表:每个进程页号对应块号的映射表
  • 页表项:页号 + 块号
  • 逻辑地址:页号 + 页内偏移量
  • 页表寄存器: 存放页表在内存的地址及页表长度

②分页存储的地址结构

进程空间分为了一个个页,每个页存放了一些数据,用页内偏移地址表示。根据页号和业内偏移地址就能找到逻辑地址的每一个地址。因此,将分页存储管理的逻辑地址结构规定如下:

  • 0~11位为页内地址,即每页大小为4KB。
  • 12~31位位页号,即最多允许2^20页。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JpbK2Wzj-1658219812075)(C:\Users\ThinkStation K\AppData\Roaming\Typora\typora-user-images\1658153353130.png)]

3.2基本地址变换机构

逻辑地址的页内偏移量直接映射为物理地址的块内偏移量,那么我们只需要找到逻辑地址的页号对应的物理地址的块号即可,我们就寻找页号对应页表项的快号即可。

为什么不直接访问页表?这是因为页表可能占用的内存空间比较大,一页大小只有4KB,而页表有2^20个页号,肯定放在不同的块里。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jtJyXkMn-1658219812076)(C:\Users\ThinkStation K\AppData\Roaming\Typora\typora-user-images\1658216120631.png)]

3.3具有快表的地址变换机构

上述的分页管理方式存在两个主要问题:

  • 每次访问操作都需要进行逻辑地址到物理地址的转换,地址转换速度必须足够快,不然访存速度会降低。
  • 每个进程引入页表,用于存储映射机制,页表不能太大,否则内存利用率将会降低。

具有快表的地址变换结构可以解决第一个问题,大大减少访存次数

快表有以下特点:

  • 快表一般放在高速缓存中,访问速度很快。(内存包括主存和高速缓存
  • 快表和慢表是一起查询的,谁先查到对应块号用谁。
  • 由于局部性原理,快表命中率高达百分之90以上。

【注】局部性原理:程序在一段时间内访问的地址,可能集中在一定的范围之内。因为指令通常是顺序存放、顺序执行的,数据一般也是以数组、向量等形式存放。

  • 时间局部性:在程序中的某条指令一旦运行,不久后该指令可能再次执行。
  • 空间局部性:一旦程序访问了某个存储单元,在不久后,其附近的存储单元也将被访问。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xWZv5ljH-1658219812076)(C:\Users\ThinkStation K\AppData\Roaming\Typora\typora-user-images\1658216501328.png)]

3.4两级页表

单级页表的缺点:

  • 页表所占内存空间大
  • 没有必要整个页表常驻内存

因此,我们引入两级分页的思想,相当于构造一个页表的页表

在进程执行时,只需要将这一页的上一页页表调入内存即可,进程的页表和进程本身的页面可以在后面的执行中再调入内存。为了查询方便,顶级页表最多只能有一个页面。

3.5基本分段存储管理

分页管理方式是从计算机的角度考虑设计的,目的是为了提高内存的利用率,提升计算机的性能。而分段管理方式的提出则是考虑了用户和程序员,以满足方便编程、信息保护和共享、动态增长以及动态链接多方面的需要。

①分段

段式存储方式按照进程中的自然段划分逻辑空间。 如:用户进程由主程序段、两个子程序段、数据段、栈段组成,于是可以把这个进程分为5个段,每段从0开始编址,并分配一段连续的地址空间。(段内要求连续,段间不连续)。

②段表

类似页表,但是段表中每段的长度可能不一样,因此段表的内容如下:

在这里插入图片描述

③地址变址机构

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JqLLHK01-1658219812077)(C:\Users\ThinkStation K\AppData\Roaming\Typora\typora-user-images\1658218975608.png)]

3.6段页式

分页存储能有效提高内存利用率,分段存储管理能反应程序逻辑结构并有利于段的保护和共享。将这两种存储方式结合起来,便形成了段页式存储管理方式。

具体来说先按逻辑结构分段,再将每个段分页。

①段页式逻辑地址结构

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nHG3yOsE-1658219812077)(C:\Users\ThinkStation K\AppData\Roaming\Typora\typora-user-images\1658219167425.png)]

②段页式系统地址变换机构

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2Y7jp0AU-1658219812077)(C:\Users\ThinkStation K\AppData\Roaming\Typora\typora-user-images\1658219784384.png)]

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

内存分配方式 的相关文章

  • 报错:CommandNotFoundError: Your shell has not been properly configured to use ‘conda activate‘.

    新安装anaconda xff0c 输入 conda activate 报错 终端输入 xff1a source activate source deactivate conda activate
  • Windows下C++调用Http接口

    1 WininetHttp h span class token macro property span class token directive keyword pragma span once span span class toke
  • ubuntu系统 PyImport_ImportModule 返回 NULL

    原因 xff1a 1 python文件出错 2 python文件路径出错 在PyImport ImportModule命令前添加语句 PyRun SimpleString 34 import sys 34 PyRun SimpleStrin
  • ModuleNotFoundError:No module named

    经典报错 xff1a ModuleNotFoundError No module named XXX 但通过conda list 可以发现相关第三方包 在程序中添加路径 import sys sys path append 39 三方包路径
  • Iterator迭代器

    1 迭代器的概述 迭代器 是一种通用的遍历集合 取出集合中元素的方式 迭代器由来 集合有很多种 每种集合的数据结构是不同的 数组 链表 哈希表 集合取出元素的方式也不同 我们不可能为每种集合都定义一种取出元素的方式 浪费 所以我们就可以使用
  • strcat函数将两个字符串拼接在一起

    span class token macro property span class token directive keyword include span span class token string 34 pch h 34 span
  • 4、C语言结构体使用---链表

    结构体 1 掌握结构体的概念和用法 2 掌握结构体数组和结构体指针 3 掌握包含结构体的结构体 4 掌握结构体搭建链表方法 5 掌握结构体及链表在产品应用场景 结构体的概念 比如说学生的信息 xff0c 包含了学生名称 学号 性别 年龄等信
  • 爬虫之爬取百度贴吧

    爬虫之爬取百度贴吧 直接示例代码 xff1a import requests from lxml import html etree 61 html etree from lxml import etree class Tieba obje
  • 正则表达式匹配开头和结尾(^、$、[^指定字符])

    1 匹配开头和结尾 代码功能 匹配字符串开头 匹配字符串结尾 示例1 xff1a 需求 xff1a 匹配以数字开头的数据 import re 匹配以数字开头的数据 match obj 61 re match 34 d 34 34 1hell
  • re.sub()用法详解

    源代码 参数及其意义 xff1a def sub pattern repl string count 61 0 flags 61 0 34 34 34 Return the string obtained by replacing the
  • BERT模型的详细介绍

    1 BERT 的基本原理是什么 xff1f BERT 来自 Google 的论文Pre training of Deep Bidirectional Transformers for Language Understanding xff0c
  • 自然语言处理(NLP)之使用TF-IDF模型计算文本相似度

    自然语言处理 NLP 之使用TF IDF模型计算文本相似度 所用数据集 xff1a ChnSentiCorp htl all csv 语料库即存放稀疏向量的列表 要注意的是 xff0c 搜索文本text与被检索的文档共用一个特征词词典 NL
  • C++中关于类重复定义的分析和解决方法

    在C 43 43 中将类以及类中的成员函数的声明放在 h的头文件中 xff0c 而将类中成员函数的定义 xff08 即实现代码 xff09 放在 cpp的源文件中 xff0c 这样我们的程序设计起来更加的模块化 xff0c 但是 xff0c
  • re.search()用法详解

    re search xff1a 匹配整个字符串 xff0c 并返回第一个成功的匹配 如果匹配失败 xff0c 则返回None pattern 匹配的规则 string 要匹配的内容 flags 标志位 这个是可选的 就是可以不写 可以写 比
  • re.findall()用法详解

    re findall xff1a 函数返回包含所有匹配项的列表 返回string中所有与pattern相匹配的全部字串 xff0c 返回形式为数组 示例代码1 xff1a 打印所有的匹配项 import re s 61 34 Long li
  • Linux系统中创建虚拟环境详解

    1 方法一 1 1 安装虚拟环境的命令 xff1a sudo pip install virtualenv sudo pip install virtualenvwrapper 1 2 安装完虚拟环境后 xff0c 如果提示找不到mkvir
  • 使用python将图片改为灰度图或黑白图

    使用python将图片改为灰度图或黑白图有三种方式 xff0c 分别是是使用cv2库和PIL库来实现 xff0c 详细过程如下所示 1 使用cv2库将图片改为灰度图 在使用cv2进行读取原彩色图片时 xff0c 在里面添加一个参数cv2 I
  • 虚拟机中windows镜像下载与安装

    镜像文件下载 xff1a 链接 xff1a https pan baidu com s 1VKWMHHCGRwWXk2GpxyUp0A 提取码 xff1a shlg 注意 xff1a 虚拟机中的镜像和本地电脑系统安装的镜像是一样的 安装教程
  • mongo数据库中字符串型正负数值比较大小

    数据库中数据展示 xff1a 使用python代码实现 xff1a Requires pymongo 3 6 0 43 from pymongo import MongoClient client 61 MongoClient 34 mon
  • flask项目中内部接口调用其他内部接口操作

    1 requests 在 Flask 框架项目中 xff0c 可以通过使用 requests 模块来进行内部接口调用 requests 模块是 Python 中常用的 HTTP 请求库 xff0c 可以用于发送 HTTP 请求和处理响应 示

随机推荐

  • ElasticSearch删除索引中的数据(delete_by_query)

    1 删除两个月以前的数据 在 Elasticsearch 中 xff0c 要删除两个月以前的数据 xff0c 可以通过以下步骤 xff1a 计算当前时间的两个月前的日期 xff0c 可以使用 Python 的 datetime 模块来实现
  • Qt Creator子图绘制

    Qt中在一个窗体文件内画所有图显然是不好维护的 xff0c 我们可以将主窗体拆分为几个子窗体 xff0c 在子窗体中绘制子图 xff0c 这样便于我们去维护我们的代码 1 在工程文件中右键 gt Add New 2 选择Qt 设计师界面 3
  • MessageFilter [target=odom ]: Dropped 100.00% of messages so far.问题解决

    错误提示 WARN 1580994954 426403779 MessageFilter target 61 odom Dropped 100 00 of messages so far Please turn the ros gmappi
  • 电磁循迹智能车基于stm32cubeMX、HAL库—我的第一辆智能车

    我的第一辆智能车 电磁循迹智能车 提示 本文适用于初学 想完成一个基础四轮车练练手者 大佬还请勿喷 不过欢迎提出意见 有纰漏之处我将及时纠正 注 工程代码链接已贴在文末 前言 所用到的硬件平台 stm32f103c8t6 舵机 电机 L29
  • 2022年国赛建模B题思路与程序

    B题 无人机遂行编队飞行中的纯方位无源定位 关键词搜索 xff1a 无人机 xff0c 无源定位 其实这个工作特别多 xff0c 知网一堆 xff0c 如果选这个题一定要想好做的出彩 xff0c 另外网上的场景和本题不是很一样 xff0c
  • 2017全国大学生电子设计竞赛:室内可见光定位装置

  • 基于FreeRTOS下多任务的同时操作

    FreeRTOS移植及多任务的实现 前言 xff1a 一 FreeRTOS移植 xff08 1 xff09 移植准备工作 xff08 2 xff09 FreeRTOS移植到stm32中 xff08 3 xff09 例程验证 二 多任务实现
  • undefined symbol 问题解决记录

    历经一个月 xff0c 昨日完成打印机network部分的编写 c语言 xff0c 编写makefile构建动态库 构建完成后遂进行调用测试 xff0c 出现 xff1a network symbol lookup error usr li
  • 2.O(NlogN)的排序算法

    认识O NlogN 的排序算法 1 剖析递归行为及其时间复杂度的估算 递归过程 xff1a 递归过程是一个多叉树 xff0c 计算所有树的结点的过程就是利用栈进行后序遍历 xff0c 每个结点通过自己的所有子结点给自己汇总信息之后才能继续向
  • 4.二叉树的遍历(C++版)

    二叉树的递归 1 二叉树递归遍历 二叉树的递归序 递归序过程 xff1a 两个注释1之间的代码代表第一次来到一个节点的时候 xff0c 会判断一下这个节点是否为空 xff1b 来到这个节点的左树去遍历 遍历完第二次回到本函数 xff0c 进
  • 6.暴力递归转动态规划

    动态规划 1 什么是动态规划 xff1f 动态规划就是暴力递归 xff08 回溯 xff09 的过程中有重复调用的过程 xff0c 动态规划在算过每次调用后把答案记下来 xff0c 下次再遇到重复过程直接调用这个行为就叫动态规划 动态规划就
  • 8.岛问题

    岛问题 题目 一个矩阵中只有0和1两种值 xff0c 每个位置都可以和自己的上 下 左 右四个位置相连 xff0c 如果有一片1连在一起 xff0c 这个部分叫做一个岛 xff0c 求一个矩阵中有多少个岛 xff1f 例子 0 0 1 0
  • 9.KMP算法

    KMP算法 1 KMP算法解决的问题 字符串str1和str2 xff0c str1是否包含str2 xff0c 如果包含返回str2在str1中开始的位置 xff0c 如果不包含返回 1 如果做到时间复杂度O N 完成 xff1f 测试用
  • 10.Manacher算法(用于解决回文子串问题)

    Manacher算法 1 Manacher算法解决的问题 字符串str中 xff0c 最长回文子串的长度如何求解 xff1f 如何做到时间复杂度O N 完成 xff1f 回文序列是从左往右和从右往左看一样 xff0c 如abba xff0c
  • git push代码到远程仓库,报错解决:fatal: unable to access ‘https://github.com/.......‘: OpenSSL SSL_read: Connec

    报错如下 xff1a 产生原因 xff1a 一般是这是因为服务器的SSL证书没有经过第三方机构的签署 xff0c 所以才报错解除ssl验证后 xff0c 再次git即可 解决办法输入此条git命令 xff1a git config glob
  • 11.滑动窗口的最大值——重要结构双端队列

    滑动窗口最大 xff08 小 xff09 值 1 滑动窗口最大值结构 窗口概念 xff1a 一开始窗口左边界L 有边界R都停留在数组左侧 xff0c 窗口L和R都只能往数组右边移动 xff0c 并且左边界L永远不能超过有边界R 任何时刻都能
  • 12.单调栈——解决接雨水和柱状图中的最大矩形等问题

    单调栈 1 单调栈实现结构 单调栈解决的问题 xff1a 给你一个数组 想要用尽可能低的代价知道数组中每一个元素的左边元素比它大的或者右边元素比他大的信息是什么 如果用暴力方法 xff0c 左边遍历一次右边遍历一次 xff0c 时间复杂度为
  • 12.快速排序

    1荷兰国旗问题 问题1 xff1a 给定一个数组arr和一个数num xff0c 将小于等于num的数放在数组的左边大于num的数放在数组的右边 xff08 不要求有序 xff09 要求额外空间复杂度为O 1 时间复杂度为O N 遍历数组元
  • 死锁预防、死锁避免、死锁检测

    死锁 1 死锁的概念 1 1死锁的定义 多个进程并发执行 xff0c 由于竞争资源而造成的一种僵局 xff08 互相等待 xff09 xff0c 若无外力作用 xff0c 这些进程都将无法推进 xff0c 这就是死锁现象 例如 xff1a
  • 内存分配方式

    内存分配方式 1 基本概念 内存管理的基本概念 虽然计算机硬件发展 xff0c 内存容量在不断变大 xff0c 但是也不可能将所有用户进程和系统所需要的程序和数据放入内存中 xff0c 因此操作系统必须要对内存空间进行合理划分和有效动态分配