什么是分段和分页?

2024-09-04 04:36
文章标签 分段 分页

本文主要是介绍什么是分段和分页?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

内存管理的必要性

  • 很早之前计算机只能运行单个进程,就算运行批处理程序,也是棑好对,一个一个的进行处理,不存在多个进程并发运行,这时候内核对于内存管理相对比较简单,直接把物理内存地址拿过来是使用即可。

  • 随着计算机演进,支持多进程的OS,多个进程都都使用同一个物理地址空间,很容易多个进程之间相互干扰而引起进程的不可预期的行为。为了解决这个问题,CPU中的MMU(内存管理单元)引入了虚拟地址空间。以32位操作系统经为例,每个进程都可以拥有4G的寻址空间,当进程需要内存时候,通过转换技术和虚拟地址进行关联。MMU通过分页的机制,提供进程的虚拟地址到物理地址的映射方法。段页机制是MMU机制提供,Linux内核是使用者。

MMU的内存管理机制 

  • 在x86体系结构下CPU对内存寻址都是通过分段和分页方式进行,在保护模式下,一个段的可以理解为基地址+段的界线+类型。进程的虚拟地址就是在段中的偏移量;线性地址就是在某个段中基地址+偏移地址得出的地址;在x86中MMU提供了分页机制,如果未开启,那么线性地址就是物理地址;反之需要经过分页机制换算后,线性地址才能转为物理地址。MMU对于内存的管理主要是分段和分页,CPU把生成的逻辑地址交给MMU内的分段单元,分段单元为每个逻辑地址生成一个线性地址,然后再将线性地址交给MMU的分页单元,最终生成物理内存的地址。

分页(Paging) 

分页是一种无需连续分配物理内存的内存管理方案。进程的地址空间被划分为固定大小的块,称为页,而物理内存被划分为固定大小的块,称为帧。

关键概念

  • 页:进程地址空间的固定大小块。

  • 帧:物理内存的固定大小块。

  • 页表:用于将虚拟地址映射到物理地址的数据结构。页表中的每个条目对应一个页面,并包含该页面所在帧的编号。

地址转换过程分为 3 个步骤

  1. 逻辑地址空间:逻辑地址(由 CPU 生成)分为页码和页偏移量。

  2. 页表查找:页码作为页表的索引,用于查找相应的帧号。

  3. 物理地址形成:帧号与页偏移量相结合,形成内存中的物理地址。

优点

  • 消除外部碎片。

  • 简化内存分配。

  • 支持高效的交换和虚拟内存。

缺点

  • 可能导致内部碎片。

  • 页表需要额外内存。

  • 由于多次访问内存,地址转换速度较慢。

分段(Segmentation)

分段是一种内存管理技术,根据程序的逻辑划分(如函数、对象或数据数组),将内存划分为大小可变的段。

关键概念
  • 段:程序的逻辑划分,每个段的大小可变。

  • 段表:将段号映射到段的基地址和长度的数据结构。

地址转换过程分为 3 个步骤
  1. 逻辑地址空间:逻辑地址包括段号和段内偏移量。

  2. 段表查找:段号用作段表的索引,用于查找段的基地址。

  3. 物理地址形成:将基址与偏移量相加,形成内存中的物理地址。

优点
  • 为程序的不同部分提供逻辑分隔。

  • 便于保护和共享程序段。

  • 简化对不断增长的数据结构的管理。

缺点
  • 可能导致外部碎片。

  • 内存管理更复杂。

  • 由于多次访问内存,地址转换速度较慢。

分段和分页的比较

  • 内存分配:分页将内存划分为固定大小的单元,而分段将内存划分为可变大小的单元。

  • 碎片:分页消除了外部碎片,但可能导致内部碎片。分段可导致外部碎片,但可避免内部碎片。

  • 地址转换:分页涉及页表,而分段使用段表。

  • 逻辑视图:分页更直接,但不太符合程序的逻辑视图。分段与程序内的逻辑划分更为一致。

总之,分页和分段都有自己独特的内存管理方法,各有利弊。在某些系统中,它们还可以结合使用,以发挥两种技术的优势。

混合分页和分段

有些系统结合使用这两种技术,以发挥各自的优势。例如,可以将一个分段划分为多个页面,以便从分段的逻辑组织和分页的简便性中获益。这种混合方法有助于减轻单独使用其中一种技术的缺点。

优点
  • 结合了分页和分段的优点。

  • 减少外部碎片(来自分段)和内部碎片(来自分页)。

缺点
  • 增加了内存管理的复杂性。

  • 由于需要同时管理段表和页表,因此开销较大。

这篇关于什么是分段和分页?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1135007

相关文章

oracle分页和mysql分页

mysql 分页 --查前5 数据select * from table_name limit 0,5 select * from table_name limit 5 --limit关键字的用法:LIMIT [offset,] rows--offset指定要返回的第一行的偏移量,rows第二个指定返回行的最大数目。初始行的偏移量是0(不是1)。   oracle 分页 --查前1-9

fastreport打印trichedit分页问题的解决

用fastreport来打印richedit里面的内容。刚开始放一个frxrichview组件到报表上,然后在 var str: TMemoryStream; begin    begin      str:= TMemoryStream.Create;      CurrRichRecord.richedit.Lines.SaveToStream(str);      str.Posit

简单Hbase 分页方案

简单Hbase分页方案 网上大多数分页方案分为从服务端分页或者从客户端分页 服务端分页方式主要利用PageFilter过滤器,首先太复杂,其次针对集群的兼容性不是很好,作者利用服务端分页+客户端分页结合方式给出一种简单易行的中间方案。 1.利用PageFilter过滤器从服务端分页,过滤出所需要的最大条数, 注:作者认为大多数用户不会进行太深的翻页,假设pageSize=5,客户饭100页一共

SpringBoot项目-实现简单的CRUD功能和分页查询

背景 本博文主要是创建了一个新的SpringBoot项目,实现基本的增删改查,分页查询,带条件的分页查询功能。是方便初学者学习后端项目的一个比较清晰明了的实践代码,读者可根据博文,从自己动手创建一个新的SpringBoot项目,到使用PostMan测试基本请求,完完全全实践一遍,写出自己的代码,或者实现自己想要的功能。因为在这个过程中会遇到许多的问题,从JDK的版本选择到跑通SpringBo

Jasperreports+jaspersoft studio学习教程(八)- 报表分页和大量数据内存处理

9.1 设计报表模板 9.1.1 使用Table组件新建模板(步骤参考教程七)如下: 9.1.2 模板自带变量 $V{PAGE_NUMBER} :代表当前页数(可以是页码也可以是页数,通过TextField的计算时间的不同值来设置) $V{PAGE_COUNT} :当前页面中记录的数目 $V{groupname_COUNT} :   代表当前组的记录数 $V{COLUMN_NU

操作系统分页式存储管理

每次输入地址后,计算出页号,若页号越界,则给出错误提示。否则依次调用FIFO和LRU算法,这里值得注意的是,由于我们的FIFO算法先于LRU算法被调用,那么当在处理FIFO算法时,我们暂且不将位视图相应位置做变化,留到处理LRU算法再做处理。 对于FIFO、LRU算法的缺页,我们分两种情况考虑,第一种是模拟栈内还有空间,那么直接将其入栈。第二种是模拟栈内无空间,要发生置换。发生置换时把模拟栈最底

PHP 分页实现序号递加或递减排序

PHP 分页实现序号递加或递减排序 实现思路: 在循环前赋值变量i,然后在循环输出变量i 。 实现序号递加1表达式:i=(页数-1)× 每页条数+1                循环:$i++               asp:i=i+1 实现序号递减1表达式:i=总数—(页数-1)× 每页条数 +1           循环:$i--             asp:i=i-1

【硬刚ES】ES入门 (13)Java API 操作(4)DQL(1) 请求体查询/term 查询,查询条件为关键字/分页查询/数据排序/过滤字段/Bool 查询/范围查询/模糊查询/高亮查询/聚合查

本文是对《【硬刚大数据之学习路线篇】从零到大数据专家的学习指南(全面升级版)》的ES部分补充。 1 请求体查询 2 高亮查询 3 聚合查询 package com.atguigu.es.test;import org.apache.http.HttpHost;import org.apache.lucene.search.TotalHits;import org.elasticse

Oracle、MySQL和SqlServe三种数据库分页查询语句的区别介绍

先来定义分页语句将要用到的几个参数: int currentPage ; //当前页 int pageRecord ; //每页显示记录数 以之前的ADDRESSBOOK数据表为例(每页显示10条记录): 一、SqlServer下载 分页语句 String sql = "select top "+pageRecord +" * from addressbook where id not i

Orderby limit offset分页

SELECT * FROM table_name WHERE some_column = #{value} ORDER BY id LIMIT #{limit} OFFSET #{offset} // 假设你已经配置了 SqlSession try (SqlSession session = sqlSessionFactory.openSession()) { // 调用 countTotal