一文讲解,Linux内核——内存管理(建议收藏)

news2025/8/13 13:15:00

一.内存的基础知识:

1.写程序到程序运行的过程:

(1)编译:由编译程序将用户代码编译成若干个目标模块(把高级语言翻译成机器语言)

(2)链接:由链接程序将编译后形成的一组目标模块以及所需的函数链接在一起,形成一个完整的模块

(3)装入:由装入程序将装入模块装入到内存运行。

2.链接的三种方式:

(1)静态链接:装入前链接成一个完整的装入模块

(2)装入时动态链接:运行前变装入边链接

(3)运行时动态装入:运行时目标模块才装入并链接

3.装入的三种方法:

(1)绝对装入:编译产生绝对地址。

(2)可重定位装入:装入时将逻辑地址转为物理地址。

(3)动态运行时装入:运行时将逻辑地址转为物理地址,需设置重新定位寄存器。

二.内存管理的基本概念

地址转换:操作系统负责实现逻辑地址到物理地址的转换。

存储保护:保证各进程在自己的内存空间内运行,不会越界访问。两种实现方式:设置上下限寄存器和利用重定位寄存器界地址寄存器进行判断。

三.覆盖与交换

1.覆盖技术:

思想:将程序分成多个段(多个模块)。不可能同时被访问程序段共享一个覆盖区,覆盖区中的程序段在运行的过程中会根据需要调入调出。

2.交换技术:

思想:内存空间紧张的时候,系统将内存中的某些进程暂时换出外存,把外存中的某些已具备运行条件的进程换入内存(进程在内存与磁盘间的动态调度)。暂时换出外存等待的进程状态为挂起状态。

(1)具有交换功能的操作系统中,通常把磁盘空间分为文件区和对换区两部分。文件区主要用于存放文件,采用离散分配的方式;对换区空间只占磁盘的小部分,被换出的进程就放在对换区。对换区采用连续分配方式。兑换区的I/O速度比文件区的更快。

(2)交换通常在许多进程吃紧且内存吃紧时进行。

(3)可优先换出阻塞进程;可换出优先级较低的进程(PCB会常驻内存,不会被换出外存)。

3.覆盖与交换的区别:覆盖是在同一个程序或者进程中,交换是在不同的进程(或作业)之间的。

【文章福利】小编在群文件上传了一些个人觉得比较好得学习书籍、视频资料,有需要的可以进群【977878001】领取!!!额外赠送一份价值699的内核资料包(含视频教程、电子书、实战项目及代码)

内核资料直通车:Linux内核源码技术学习路线+视频教程代码资料

学习直通车(腾讯课堂免费报名):Linux内核源码/内存调优/文件系统/进程管理/设备驱动/网络协议栈

四.连续分配管理方式

1.单一连续分配:

内存被分为系统区和用户区,系统区通常位于内存的低地址部分,用于存放操作系统的数据,用户区用于用户进程的相关数据。内存中只能有一道程序,用户程序独占整个用户空间。

(1)优点:实现简单,无外部碎片,可以用覆盖技术扩充内存。

(2)缺点:只能用于单用户,单任务的操作系统中,有内部碎片,存储器利用率极低。

2.固定分区分配:

将用户空间分为若干个固定大小的分区,在每个分区中知装入一道作业。又分为分区大小相等和分区大小不等的。

分区大小相等的:缺乏灵活性,适合于一台计算机控制多个相同的对象的场合。

分区大小不等的:增加了灵活性,可以满足不同大小进程的需求。

操作系统需要建立一个数据结构——分区说明表,来实现各个分区的分配和回收。

(1)优点:实现简单,无外部碎片。

(2)缺点:当用户程序太大时,所有的分区都不能满足需求。会产生内部碎片。

3.动态分区分配(又称可变分区分配):

不会预先划分内存分区,根据进程的大小动态的建立分区,并使分区的大小正好适合进程的需要,系统分区的大小和数目是可变的。

两种常用的数据结构:空闲分区表和空闲分区链

动态分区分配没有内部碎片,但是有外部碎片。

内部碎片:分配给某进程的内存区域中,有些部分没有用上。

外部碎片:是指内存中的某些空闲分区由于太小而难以利用。

五.动态分区分配算法

1.首次适应算法:

(1)算法思想:每次都从低地址开始查找,找到一个能满足大小的空闲分区。

(2)实现:空闲分区以地址递增的次序排列,每次分配内存时顺序查找空闲分区链(或空闲分区表),找到大小能满足要求的第一个空闲分区。

2.最佳适应算法

(1)算法思想:为保证大进程到来的时候有连续的大片空间,可以尽可能的留下大片的空闲区,优先使用更小的空闲区。

(2)实现:空闲分区按容量递增的次序链接,每次分配内存时顺序查找空闲分区链(或空闲分区表),找到大小能够满足要求的第一个空闲分区。

(3)缺点:每次都选最小的分区进行分配,会留下越来越多的,很小的,难以利用的内存块,会产生很多的外部碎片。

3.最坏适应算法

(1)算法思想:为解决最坏适应算法的问题。可以在每次分配的时候优先使用最大的连续空闲区,这样剩余的空闲区就不会太小,更方便使用。

(2)实现:空闲分区按容量递减次序链接,每次分配内存时顺序查找空闲分区链(或者空闲分区表),找到大小能够满足要求的第一个空闲分区。

(3)缺点:每次选最大的分区进行分配,会导致较大的连续的空闲区被迅速用完,如果有大进程到达,就没有内存分区可用了。

4.邻近适应算法

(1)算法思想:每次都从上次查找结束的位置开始检索。

(2)实现:空闲分区以地址递增的顺序排列(可排成一个循环链表),每次分配内存时从上次查找结果的位置开始查找空闲分区链(或空闲分区表),找到大小满足要求的第一个空闲分区。

(3)缺点:会使高地址的大分区被用完。

六.基本分页存储管理的基本概念

1.分页存储的概念:

将内存分为一个个大小相等的区,每一个分区就是一个页框(页框=页帧=内存块=物理块=物理页面),每一个页框有一个编号,即页框号,页框号从0开始。

将进程的逻辑地址分为与页框大小相等的一个个部分,每个部分称为一个页或者页面,每个页面有一个编号,即页号,从0开始。

如何确定一个逻辑地址所对应的页号,页内偏移量:

如果每个页面的大小为2^kB,用二进制数表示逻辑地址,则末尾k位即为页内偏移量,其余部分就是页号。

每个页表项占的字节数:

如何实现地址的转换:

(1)计算出逻辑地址对应的页号和页内偏移量

(2)找到对应页面在内存中的存放位置

(3)物理地址=页面起始地址+页内偏移量

七.基本地址变换机构(用于实现逻辑地址到物理地址的转换的一组硬件结构)

基本地址变换机构:通常在系统中设置一个页表寄存器,存放页表在内存中的起始地址F和页面长度M。进程未执行时,页表起始地址和页表长度存放在进程控制块PCB中,当进程被调用时,操作系统内核会把它们放到页表寄存器中。

逻辑地址到物理地址的转换过程如下:

(1)计算页号P和页内偏移量W(2)比较页号P和页表长度M若P>=M,则产生越界中断,否则继续执行。

(3)页表中页号P对应的页表项地址=页表起始地址F+页号P*页表项长度

(4)计算E=B*L+W,用得到的物理地址E去访问。

八.具有快表的地址转换机构:

1.快表和慢表

快表:又称联想寄存器(TLB),是一种访问速度比内存快很多的高速缓存,用来存放最近访问的页表项的副本。

慢表:内存中的页表常称为慢表。

2.引入快表后地址的变换过程:

(1)CPU给出逻辑地址,由某个硬件算得页号,页内偏移量,将页号和快表中的所有页号进行比较

(2)如果找到匹配的页号,说明要访问的页表项在快表中有副本,则直接取出该页对应的内存块号,再将内存块号与页内偏移量拼接形成物理地址,最后访问物理地址对应的内存单元。若在快表中,则访问某个逻辑地址仅需要一次访存即可。

(3)如果没有找到匹配的页号,则需要访问内存中的页表,找到对应的页表项,得到页面存放的内存块号,再将内存块号与业内偏移量拼接成物理地址,最后,访问该物理地址对应的内存单元,因此,若快表未命中,则访问某个逻辑地址需要两次访存。

3.TLB和Cache的区别:

TLB中只有页表项的副本,而普通的Cache中可能会有其他的各种数据的副本。

九.两级页表:

1.解决单级页表的问题:

将长长的页表进行分组,使每个内存块刚好可以放入一个分组,为离散分配的页表建立一张页表,称为页目录表或顶层页表。

2.实现地址变换的过程:

(1)将逻辑地址结构分为三部分

(2)从PCB中读出页目录表地址,再根据一级页号查页目录表,找到下一级页表在内存中的存放位置

(3)根据耳机页号查表,找到最终的访问内存块号

(4)结合页内偏移量找到物理地址

注:(1)多级页表中,各级页表的大小不能超过一个页面,若两级页表不够,可以分更多级。

​ (2)多及页表的访存次数(没有快表),N级页表访存次数为N+1次访存。

十.基本分段存储管理:

1.分段的基本概念

(1)将空间地址按照程序自身的逻辑关系划分为若干个段,每段从0开始编址。

(2)每个段在内存中占连续的单元,但各段之间可以不相邻

(3)逻辑地址结构:段号+段内地址

2.段表:

每个段对应一个段表项,各段表项长度相同,由段号,段长,基地址组成,记录逻辑段到实际存储地址的映射关系。

3.地址变换:

(1)由逻辑地址得到段号,段内地址

(2)段号与段表寄存器中的段长度作比较,检查是否越界

(3)由段表始址,段号找到对应的段表项

(4)根据段表中记录的段长,检查段内地址是否越界

(5)由段表中的基地址+段内地址得到最终的物理地址

(6)访问目标单元

4.分页和分段的对比:

(1)分页对用户不可见,分段对用户可见

(2)分页的地址空间是一维的,分段的空间地址是二维的

(3)分段更容易实现信息的共享和保护

(4)分页(单级页表),分段访问一个逻辑地址都需要两次访存,分段存储中也可以引入快表机构

十一.段页式管理方式:

1.基本概念:(分段+分页)

(1)将地址空间按照程序的自身的逻辑关系划分为如干个段,再将各段分为大小相等的页面。

(2)将内存空间分为与页面大小相等的一个个内存块,系统以块为单位为进程分配内存

2.页表和段表:

(1)每一个段对应一个段表项。各段表项长度相同,由段号(隐含),页表长度,页表存放地址组成。

(2)每一个页对应一个页表项。若页表项长度相同,由页号(隐含),页面存放的内存块号组成。

3.地址变换的过程:

(1)由逻辑地址得到段号,页号,页内偏移量

(2)段号与段表寄存器中的段长度进行比较,检查是否越界

(3)由段表始址,段号找到对应的段表项

(4)根据段表中记录的页表长度,检查页号是否越界

(5)由段表中的页表地址,页号得到查询页表,找到相应的页表项

(6)由页表存放的内存块号,页内偏移量得到最终的物理地址

(7)访问目标单元

4.访问一个逻辑地址所需的访存次数:第一次查段表,第二次查页表,第三次访问目标单元

十二.虚拟内存:

1.传统的存储管理方式的特征:

(1)一次性:作业数据必须一次全部调入内存。(2)驻留性:作业数据在整个运行期间都会常驻内存

2.局部性原理:

(1)时间局部性:现在访问的指令,数据在不久后很可能会被再次访问

​ (2)空间局部性:现在访问的内存单元周围的内存空间,很可能不久后会访问

​ (3)空间缓存技术:使用频繁的数据放到更高速的存储器中

3.虚拟内存的定义及其特征:

程序不需要全部装入即可运行,运行的时候根据需要动态调入数据,若内存不够,还需要换出一些数据。

特征:(1)多次性:无需在作业运行时一次全部装入内存,而是允许被分成多次调入内存的。

​ (2)对换性:无需在作业运行时一直常驻内存,而是允许在作业运行的过程中,将作业换入,换出。

​ (3)虚拟性:从逻辑上扩充了内存的容量,使用用户看到的内存容量,远大于实际的容量。

4.虚拟内存技术的实现:

(1)访问的信息不在内存时,由操作系统系统负责将所需的信息从外存调入内存(请求调页功能)

(2)内存空间不够时,将内存中的暂时用不到信息换出到外存(页面置换功能)

(3)虚拟内存的实现:请求分页存储管理,请求分段存储管理,请求段页式存储管理

十三.请求分页管理方式:

1.页表机制:

在基本分页的基础上增加了几个表项

(1)状态位:表示页面是否在内存当中

(2)访问字段:记录最近被访问的次数,或记录上次访问的时间

(3)修改位:表示页面调入内存后是否被修改过,只有修改过的页面才需要在置换时写回外存

(4)外存地址:页面在外存当中的存放位置

2.缺页中断机构:

(1)找到页表项后检查页面是否已在内存中,若没在,产生缺页中断

(2)缺页中断处理中,需要将目标页面调入内存中,有必要时还需要换出页面

(3)缺页中断属于内中断,属于内中断中的故障,即可能被系统修复的异常

(4)一条指令在执行的过程中可能产生多次缺页中断

3.地址变换与基本分页的不同之处:

(1)找到页表项是需要检查页面是否在内存中

(2)若页面不在内存中,需要请求调页

(3)若内存空间不够,还需要换出页面

(4)页面调入内存后,需要修改相应的页表项

十四.页面置换算法:

1.最佳置换算法(0PT):

2.先进先出置换算法(FIFO):

3.最近最久未使用置换算法(LRU):

4.时钟置换算法( CLOCK):

十五.页面分配策略

1.驻留集:指请求分页存储管理中给进程分配的内存块的集合

2.页面分配,置换策略:

(1)固定分配和可变分配:区别在于运行进程期间驻留集大小是否可变

(2)局部置换和全局置换:区别在于发生缺页时是否只能从进程自己的页面中选择一个换出

(3)固定分配局部置换:进程运行前就分配一定数量的物理块。缺页时只能换出进程自己的某一页

(4)可变分配全局置换:只要缺页就分配新的物理块,可能来自空闲物理块,也可能换出别的进程的页面

(5)可变分配局部置换:频繁缺页的进程,多分配一些物理块;缺页率很低的进程,回收一些物理块,知道缺页率合适

3.调入页面的时机:(1)预调页策略:进程运行前(2)请求调页策略:进程运行时,发现缺页再调页

4.从何处调页:

(1)对换区:采用连续存储方式,速度快。文件区:采用离散存储方式,速度更慢。

(2)对换区足够大:运行将数据从文件区复制到对换区,之后所有的页面调入,调出都是在内存与对换区之间进行。

(3)对换区不够大:不会修改的数据每次都从文件区调入,会修改的数据调出到对换区,需要时再从对换区调入

(4)UNIX的方式:第一次使用的页面都从文件区调入,调出的页面都写回对换区,再次使用从对换区调入

5.抖动(颠簸)现象:页面频繁换入换出的现象,主要原因是分配给进程的物理块不够。

6.工作集:在某段时间间隔内,进程实际访问的页面的集合,驻留集大小一般不能小于工作集的大小。

知道缺页率合适

3.调入页面的时机:(1)预调页策略:进程运行前(2)请求调页策略:进程运行时,发现缺页再调页

4.从何处调页:

(1)对换区:采用连续存储方式,速度快。文件区:采用离散存储方式,速度更慢。

(2)对换区足够大:运行将数据从文件区复制到对换区,之后所有的页面调入,调出都是在内存与对换区之间进行。

(3)对换区不够大:不会修改的数据每次都从文件区调入,会修改的数据调出到对换区,需要时再从对换区调入

(4)UNIX的方式:第一次使用的页面都从文件区调入,调出的页面都写回对换区,再次使用从对换区调入

5.抖动(颠簸)现象:页面频繁换入换出的现象,主要原因是分配给进程的物理块不够。

6.工作集:在某段时间间隔内,进程实际访问的页面的集合,驻留集大小一般不能小于工作集的大小。

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

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

相关文章

头歌平台-MongoDB 之滴滴、摩拜都在用的索引

第1关:了解并创建一个简单索引 > use test switched to db test > db.student.insert([{_id:1,name:"王小明",age:15,score:90},{_id:2,name:"周晓晓",age:18,score:86},{_id:3,name:"王敏",age:20,score:96},{_id:4,name:&qu…

kudu集群数据节点(tserver)扩容(缩容)

背景: 4个数据节点有数据倾斜,rebalance后依旧如此,检查分片数量和分布情况也是均衡的。最后发现相同的分片在其中一个节点存储消耗的磁盘资源比其他节点要大很多,导致了这个节点磁盘消耗较快。于是决定更换节点的磁盘 操作计划如…

【freeRTOS】操作系统之一-任务调度

一. 任务调度 ​ FreeRTOS操作系统支持三种调度方式:抢占式调度,时间片调度和合作式调度。实际应用主要是抢占式调度和时间片调度,合作式调度用到的很少。 挂起/阻塞/就绪/运行 三种基本状态 进程在运行中不断地改变其运行状态。通常&…

智能网联汽车网络安全攻击与防御技术概述

作者 | 王博文 上海控安可信软件创新研究院研究员 来源 | 鉴源实验室 01 引言 在汽车电动化、网联化、智能化和共享化等新四化的发展趋势下,智能网联汽车(Intelligent Connected Vehicles,ICVs)已经是新时代的必然产物。在智能网…

【学习笔记】浅谈闵可夫斯基和

学这东西主要是 这道题 要用 233 定义:给定两个凸包AAA,BBB,定义C{ab∣a∈A,b∈B}C\{ab|a\in A,b\in B\}C{ab∣a∈A,b∈B} ,其中aaa,bbb均为坐标。 不好意思图是嫖的 首先我们感性认识一下。可以直接将一个凸包的顶点换成另一个凸包&#x…

实现登陆模块时Cookie,Session,Token的理解

目录引言一、简化版登陆(不保存登录状态)二、Session 登陆三、CookieSession 实现登录四、Token登陆引言 先思考问题: 1、如何实现登陆? (1)表单输入账号密码 (2)后台数据库验证 …

治愈系书单|林曦《只生欢喜不生愁》

《只生欢喜不生愁》是水墨画家林曦的艺术生活随笔集,谈艺术之道,论无用之美。      全书按主题分为六辑:“艺可通道”“观照世间”“得自在禅”“心安之所”“写给时间”“赤子之心”,文字轻盈、意境优雅。林曦以手艺人之道&a…

Java#13(String Builder介绍及其常用办法)

目录 一.String Builder 1.理解:可以将String Builder当作一个容器,创建之后的内容是可以变的 2.作用:可以提高字符串的操作效率 二. StringBuilder中的常用方法 1.public StringBuilder append (任意类型) 添加数据,并返回对象本身 2.public StringBuild…

Keysight是德科技e5063A网络分析仪-安泰测试

Keysight E5063A ENA 是一款经济适用的台式矢量网络分析仪,可用于测试简单的无源元器件,例如频率最高达到 18 GHz 的天线、滤波器、电缆或连接器。 作为业界闻名的 ENA 系列中的一员,它传承了一致的测量框架,以便提高效率和生产率…

大学生静态HTML鲜花网页设计作品 DIV布局网上鲜花介绍网页模板代码 DW花店网站制作成品 web网页制作与实现

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

RabbitMQ初步到精通-第二章-RabbitMQ介绍

第二章 RabbitMQ介绍 1、RabbitMQ简介 RabbitMQ 是一个由 Erlang 语言开发的 AMQP 的开源实现。RabbitMQ最初起源于金融系统,用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。 rabbit- 兔子,兔子的特点是什么? 轻…

图解https读书笔记

7.确保Web安全的HTTPS 7.2 HTTP 加密 认证 完整性保护 HTTPS https http ssL(Secure socket layer)client: 使用servcer端的publickey对消息加密-----》server:收到消息,用privatekey进行解密参考:彻底搞懂HTTPS的加密原理_峰子2012的博…

VS+QT错误集合

主要是使用VSQT时遇到等一些问题,现在使用等是VS2015(专业版) QT5.13.1 这章主要解决遇到的无法解析等外部符号这类问题 1、LNK2001 无法解析的外部符号 "public: virtual struct QMetaObject const * __cdecl Process::metaObject…

【分析笔记】Linux 4.9 backlight 子系统分析

相关信息 内核版本:Linux version 4.9.56 驱动文件:lichee\linux-4.9\drivers\video\backlight\backlight.c 驱动作用 对上,面对应用层提供统一的设备节点入口同级,面对驱动层提供设备驱动加载卸载通知事件,以及背光…

闲人闲谈PS之三十二——业务工程预算和PS成本计划

惯例闲话:年底,又要开始忙了,今年这一年,收获还不错,至少规划了第三年实现的目标——工程行业彩虹图,在今年居然奇迹般的实现了,看样子闲人还是保守了。还是应验了那句话,只要标准化…

React插槽

在开发中,我们抽取了一个组件,但是为了让这个组件具备更强的通用性,我们不能将组件中的内容限制为固定的div、span等等这些元素。我们应该让使用者可以决定某一块区域到底存放什么内容。这里可以使用插槽。 而在React中,我们可以通…

Spring Cloud Circuit Breaker 使用示例

Spring Cloud Circuit Breaker 使用示例 作者: Grey 原文地址: 博客园:Spring Cloud Circuit Breaker 使用示例 CSDN:Spring Cloud Circuit Breaker 使用示例 说明 Spring Cloud Circuit breaker提供了一个跨越不同断路器实现…

留学Essay写作怎么注意具体结构?

留学生都知道Essay一般分为Introduction,Main Body和Conclusion这三个部分,Introduction说明了文章的整体内容,但本身并没有提出任何论点;Conclusion通常简要地概括了正文的要点,并建议进一步研究给出一些或结论性的想法&#xff…

Springboot实现ENC加密

目录1. 为什么要用ENC加密2. jasypt实现ENC加密1. 实现流程2. 说明1. 自定义加密秘钥1. 盐、前缀、后缀2. 自定义加密方案2. 部署方案1. 为什么要用ENC加密 以下是未经过加密的数据库配置,密码均是采用明文密码,很容易导致数据库泄露。 spring:datasou…

gitlab 简单优化 gitlab cpu高,内存高 gitlab 负载飙高

1.首先要说得是,优化不能解决根本问题,机器小水管,再优化还是不行。 我感觉4核8g应该可以,截图这机器是阿里云送的免费一个月 4核8g 内存,不知是不是送得问题,感觉也是hold不住。 负载逛逛升,8…