0

0

基本分页存储管理方式是什么

angryTom

angryTom

发布时间:2019-07-26 15:44:41

|

8822人浏览过

|

来源于php中文网

原创

基本分页存储管理方式是什么

推荐教程:常见问题

简介

在存储器管理中,连续分配方式会形成许多“碎片”,虽然可通过“紧凑”方法将许多碎片拼接成可用的大块空间,但须为之付出很大开销。

  如果允许将一个进程直接分散地装入到许多不相邻的分区中,则无须再进行“紧凑”。基于这一思想而产生了离散分配方式。如果离散分配的基本单位是页,则称为分页存储管理方式。在分页存储管理方式中,如果不具备页面对换功能,则称为基本分页存储管理方式,或称为纯分页存储管理方式,它不具有支持实现虚拟存储器的功能,它要求把每个作业全部装入内存后方能运行。

为什么要分页存储

  在内存的分配过程中,连续分配方式容易产生大量的碎片,虽然可以通过“紧凑”对其进行整理,但是这样需要大量的开销。 

  因此,如果能够在进程的内存分配的时候,将连续的逻辑内存打散分配在多个可以不相连的物理内存上,那么将会利用到原来被浪费的大块碎片,降低不可利用碎片的最大大小(降至页面的大小,因为如果碎片的大小超过页面的大小,那么将可以被利用),提升内存利用率。根据这种思想,产生了离散分配方式,如果离散分配的基本单位是页,则称之为分页存储管理方式;如果不具备页面对换功能,那么就是基本分页存储管理方式。

基本概念

页面 

  分页存储管理方式将进程的连续的逻辑地址空间分割为若干个大小相等 的地址片,称之为页或者页面。并将其进行编号,如第0页、第1页。在逻辑上,这些页中的各个地址拼接起来是连续的,但是他们对应的物理块地址是可以不连续的。对应的物理块也相应的被命名为第0块、第1块等。在进程分配内存时,进程的若干个页分别被装入对应的物理块,由于最后一页经常装不满,所以形成了无法被利用的页内碎片

  采用分页存储管理方式的目的就是更多的利用内存碎片,因此,页面的大小相对来说是小于正常进程所需的地址空间大小。那么页面多大是比较合适的呢?页面如果过于小,虽然可以使得内存中不可利用碎片的最大大小降低,提升内存空间的利用率,但是也会导致进程占用过多的页面,使得页表过长,降低页面的换进换出的效率。同样,如果页面过大,虽然提升了页面换进换出的效率,但是也会使得内存碎片增大。所以,根据经验,页面的大小最好选择512B~8KB左右。

页表 

  页表就是进程中维护的一段地址空间,其中存储了页面和物理块的映射关系,在讨论页表之前,先理清分页中的地址结构。 

  对于物理地址空间,总的内存地址空间是固定的。而对于一个进程,分配的逻辑内存空间也是固定且连续的,该逻辑地址空间从0开始,假设某个进程中的一个字节的逻辑地址为 1088B, 而页面大小为512B。在介绍页面 时说过,逻辑地址空间虽然分给为若干个页,但是这些页的逻辑地址仍然是连续的。那么我们可以知道该字节所属的页号 P = 2 (从0开始),页内地址 d = (1088 - 512 * 2) = 64。

X-CART  GOLD
X-CART GOLD

X-Cart号称是全球最强大的PHP购物车软件,几乎囊括所有电子商务功能,采用网页方式管理后台,多语言支持,智能库存管理,模板定制灵活,功能插件化、模块化。X-Cart分为gold版和Pro版这两个版本。Gold版为普通商店版,Pro为商城版。这款软件的优势是功能比较强大,由于是付费方式采用终生制的开源软件,软件的稳定性、安全性以及可扩展性较强。目前已知的能与x-cart跨平台整合的软件包括了国外

下载

  也就是说在页面长度已知的情况下,根据逻辑地址可以简单的知道该地址空间所属的页面号和在该页面中的相对地址。根据这两个参数和页表,就能够知道该地址对应的物理地址了。

  页表是用来映射页面和物理块的一张表,如下图: 

 

pc11.jpg

  通过页表和页号,我们知道了物理块号,也就知道了对应物理块空间的起始地址。再加上页内地址,就知道了对应的物理地址。通过这种方式,我们能够实现从逻辑地址到物理地址的转换。

地址转换

  上面的基础概念介绍简单介绍了一下地址转换的原理,下面详细看看具体流程。

  上面说到通过查找页表找到页号到物理块号的映射,那么页表存放在哪里,如何找到页表呢?? 

  页表可以通过一组寄存器来实现,一个寄存器存储一条页表项,因为寄存器的存取速度快,可以提高页表地址转换的速度。然而,寄存器成本较高,页表中的页表项可能会非常大,达到数百上千项。因此页表通常也存储在内存中,在系统中,只设置一个页表寄存器PTR,用来存储页表在内存中的起始地址和长度。平时,进程未执行时,页表的始址和页表长度存放在本进程的PCB中。当调度程序调度到某进程时,才将这两个数据装入页表寄存器中。因此,在单处理机环境下,虽然系统中可以运行多个进程,但只需一个页表寄存器(也就是说,多进程同时运行的情况下,需要分别存储多个进程内的页表数据)。

  当进程要访问某个逻辑地址中的数据时,分页地址变换机构会自动地将有效地址(相对地址)分为页号页内地址两部分,再以页号为索引去检索页表。在执行检索之前,先将页号与页表长度进行比较,如果页号大于或等于页表长度,则表示本次所访问的地址已超越进程的地址空间。于是,这一错误将被系统发现并产生一地址越界中断。若未出现越界错误,则将页表始址与页号和页表项长度的乘积相加,便得到该表项在页表中的位置,于是可从中得到该页的物理块号,将之装入物理地址寄存器中。与此同时,再将有效地址寄存器中的页内地址送入物理地址寄存器的块内地址字段中。这样便完成了从逻辑地址到物理地址的变换。下图示出了分页系统的地址变换机构 

pc22.jpg

快表

  由于页表是存放在内存而非寄存器中,所以每次读取一个地址的时候需要访问两次内存,第一次访问页表找到物理块号,第二次才是访问真正的物理地址获取数据。因此,采用这种方式将使计算机的处理速度降低近1/2。 

  为了提升地址变换效率,在地址变换机构中加入了一组具有并行查寻能力的特殊高速缓冲寄存器,又称为“联想寄存器”(Associative Memory),或称为“快表”,用来存储当前访问的页表项数据(类似于缓存,存储之前查找过的页表项,提升页号到物理块号的转换效率)。通过这种方式,地址转换过程变成了如下图: 

 pc33.jpg

  在CPU获取到逻辑地址后,地址转换机构将页号交给快表查询对应的物理块号,如果查到,则直接根据页内地址找到物理地址访问数据,如果没有则按正常的方式查找物理块号,并同时将其保存在快表中。如果快表已满,则系统会自动在其中去掉一个页表项替换出来。 

  简而言之,快表就相当于页表项缓存。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

16

2026.03.11

Go高并发任务调度与Goroutine池化实践
Go高并发任务调度与Goroutine池化实践

本专题围绕 Go 语言在高并发任务处理场景中的实践展开,系统讲解 Goroutine 调度模型、Channel 通信机制以及并发控制策略。内容包括任务队列设计、Goroutine 池化管理、资源限制控制以及并发任务的性能优化方法。通过实际案例演示,帮助开发者构建稳定高效的 Go 并发任务处理系统,提高系统在高负载环境下的处理能力与稳定性。

23

2026.03.10

Kotlin Android模块化架构与组件化开发实践
Kotlin Android模块化架构与组件化开发实践

本专题围绕 Kotlin 在 Android 应用开发中的架构实践展开,重点讲解模块化设计与组件化开发的实现思路。内容包括项目模块拆分策略、公共组件封装、依赖管理优化、路由通信机制以及大型项目的工程化管理方法。通过真实项目案例分析,帮助开发者构建结构清晰、易扩展且维护成本低的 Android 应用架构体系,提升团队协作效率与项目迭代速度。

75

2026.03.09

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

95

2026.03.06

Rust内存安全机制与所有权模型深度实践
Rust内存安全机制与所有权模型深度实践

本专题围绕 Rust 语言核心特性展开,深入讲解所有权机制、借用规则、生命周期管理以及智能指针等关键概念。通过系统级开发案例,分析内存安全保障原理与零成本抽象优势,并结合并发场景讲解 Send 与 Sync 特性实现机制。帮助开发者真正理解 Rust 的设计哲学,掌握在高性能与安全性并重场景中的工程实践能力。

218

2026.03.05

PHP高性能API设计与Laravel服务架构实践
PHP高性能API设计与Laravel服务架构实践

本专题围绕 PHP 在现代 Web 后端开发中的高性能实践展开,重点讲解基于 Laravel 框架构建可扩展 API 服务的核心方法。内容涵盖路由与中间件机制、服务容器与依赖注入、接口版本管理、缓存策略设计以及队列异步处理方案。同时结合高并发场景,深入分析性能瓶颈定位与优化思路,帮助开发者构建稳定、高效、易维护的 PHP 后端服务体系。

420

2026.03.04

AI安装教程大全
AI安装教程大全

2026最全AI工具安装教程专题:包含各版本AI绘图、AI视频、智能办公软件的本地化部署手册。全篇零基础友好,附带最新模型下载地址、一键安装脚本及常见报错修复方案。每日更新,收藏这一篇就够了,让AI安装不再报错!

168

2026.03.04

Swift iOS架构设计与MVVM模式实战
Swift iOS架构设计与MVVM模式实战

本专题聚焦 Swift 在 iOS 应用架构设计中的实践,系统讲解 MVVM 模式的核心思想、数据绑定机制、模块拆分策略以及组件化开发方法。内容涵盖网络层封装、状态管理、依赖注入与性能优化技巧。通过完整项目案例,帮助开发者构建结构清晰、可维护性强的 iOS 应用架构体系。

222

2026.03.03

C++高性能网络编程与Reactor模型实践
C++高性能网络编程与Reactor模型实践

本专题围绕 C++ 在高性能网络服务开发中的应用展开,深入讲解 Socket 编程、多路复用机制、Reactor 模型设计原理以及线程池协作策略。内容涵盖 epoll 实现机制、内存管理优化、连接管理策略与高并发场景下的性能调优方法。通过构建高并发网络服务器实战案例,帮助开发者掌握 C++ 在底层系统与网络通信领域的核心技术。

33

2026.03.03

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
php-src源码分析探索
php-src源码分析探索

共6课时 | 0.5万人学习

进程与SOCKET
进程与SOCKET

共6课时 | 0.4万人学习

微信小程序开发--云开发篇
微信小程序开发--云开发篇

共15课时 | 0.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号