Linux内存介绍(局部性原理,段页)

简介: Linux内存介绍(局部性原理,段页)

内存


每一个要运行的程序,必须先进入内存然而,每一台计算机的内存容 量都是有限而宝贵的。存储管理的任务是方便用户使用存储资源,在有限的物理空间内使更多的用户进程高效地获得和使用尽可能多的存储空间,从而提高系统 的整体性能。现代操作系统中普遍采用基于虚拟存储器的概念来统一管理内存和外存,实现逻辑上的大容量存储空间。


本节首先介绍虚拟存储器的基本概念及使用虚拟存储器的依据和出发点——局部性原理,即在程序的运行过程中,总是集中地访问某一个程序段。


根据 这样的原理,可以把物理内存按照一定的规则划分为小部分,每次只装入某个进 程必要的一部分内容就开始运行,在运行过程中,再根据需要装入新的内容。 不同的划分规则形成不同的存储管理技术,我们简单介绍分区、页式、段 式和段页式管理的基本思想。接着介绍Intel 80386硬件存储管理机制,最后学 习Linux系统在这种硬件平台的基本存储管理机制。


1虚拟储存区


计算机系统的存储器分为内存(主存)和外存(硬盘)。内存的价格昂贵,速度高,存储容量有限;外存价格便宜,速度慢,存储容量很大,适合于存放大量数据。为了使更多的用户进程合理、充分地使用存储资源,操作系统统一管理内存和外存,即把内存中暂时不用的内容放在硬盘上,内存中就可以腾出一部分空间,可以从硬盘装入其他迫切需要的内容。因此,从效果上看,计算机系统好像为用户提供了一个其存储容量比实际主存大得多的存储器。人们称这个存储器为虚拟存储器.


定义:一种将主存用作辅助存储器高速缓存的技术


2局部性原理


实验证明,在几乎所有进程的执行过程中,某一个特定的时间段 中,CPU不是随机地访问整个程序或数据,而是集中地访问程序或数据的某一个部分。进程的这种访问特性称为局部性原理


与CPU访问该局部内的数据和代码的次数相比,局部段的变化很缓 慢,正是基于这样的原理,我们才有可能实现虚拟存储管理。把进程的 所有内容划分为一个个小的部分,首先只把系统所必需的部分数据装入 内存,其余部分就放在外存中,开始运行之后,再把所需要的其他部分 换入内存,同时把不再需要的部分从内存中换到硬盘或者清除掉。当然,与之相配合,实际的内存也要划分为对应的小部分。


3 虚拟地址 和 虚拟地址空间


每一个进程都具有各自独立的虚拟地址空间,而整个系统只有一个物理地址空间。


任何一个要执行的进程,都必须进入真正的内存中,在内存 的物理空间中存在,这就需要在虚拟地址空间和物理地址空间之间建立 适当的映射关系。


通过这种映射关系,逐部分地把存在于虚拟地址空间 中的进程要执行的 。


物理地址(physical address):主存储器的地址。


缺页(page fault):访问的 而不在主存储器中。


虚拟地址(virtual address):虚拟空间的地址,当需要 访问主存时需要通过地址 。


地址转换(address translation):也称为地址映 射,在访问内存时将虚拟地址映射为物理地址的整个过程 。


页表(page table):保存虚拟地址和物理地址之间转换关系的表,页表保存在主存 中, 通常使用虚页号来索引,如果这个虚页当前在主存中, 页表中对应项 将包含虚夜对应的物理页号。


4内存管理方式


虚拟存储的每一个要运行的程序,都必须首先进入内存,但是,每一台计算机的内存容量都是有限而宝贵的。管理技术,通常是基于局部性原理的,即把整个进程的虚拟地址空间划分为小的部分,同时把内存也划分为小的部分,在虚拟地址空间和物理地址空间之间建立特定的映射关系,进程的内容分批分期进入内存中特定的位置,其余部分在外存中,在需要的时候再传递到内存,用内存和外存的统一管理来实现内存扩充。在虚拟存储技术的发展过程中,使用了不同的地址空间划分方法和映射关系,这些不同的划分和映射对应于不同的存储管理方式.


5 页(了解)


把进程的虚拟地址空间划分为相等大小的部分,每个部分称为页(page),同时把物理内存空间也按照页的大小划分为小的部分,称为页面(page frame,也称为页架或页框)。对于80386体系,页和页面的大小都为4K字节。


页式管理: 页表(左)及相应的页、页面对应关系(右)示意图


内存中同时存在多个进程,每个进程的地址都是以0地址作为起始 地址的虚拟地址空间,这个虚地址空间可以是线性的(一维的),也可 以是多维的,这要取决于系统采用的存储管理方式。进程中的每一个指 令和数据在这样的虚地址空间中都有一个惟一确定的地址,即虚拟地 址。


6 段页※(掌握)


段页式存储管理,综合利用段式和页式管理的思想,把整个二维虚拟空 间先分段,然后在段内分页。以页为最小的存储管理单位来实现虚拟存储。


一方面可以按照程序的逻辑关系来划分进程空间的段,另一方面使 用页来存放每一个段的内容,内外存交换以统一格式和大小的页来进 行。


这种管理模式下,虚拟地址要包括三个部分:段号、页号和页内偏移地址,地址变换也要经过两层次映射才能够实现,首先从二维虚拟空 间映射到一个线性虚拟空间,然后再从线性空间映射到物理空间。


可以想象,整个变换过程更为复杂,需要大量的硬件支持和系统开销。


定义


代码段: 代码段是用来存放可执行文件的操作指令, 也就是说它可以是可 执行程序在内存中的镜像. 代码段需要防止正在运行时被非法修改, 所以 只准许读取操作, 不允许写入操作


数据段: 数据段用来存放可执行文件中已初始化全局变量, 也就是存放程序静态分配的变量和全局变量


BBS段: BBS段包含程序未初始化的全局变量, 在内存中, BBS段全部置零


堆(heap): 堆是用于存放进程运行中被动态分配的内存段,它的大小并不固定,可以动态扩张或缩减,当进程调用malloc等函数分配内存,新分配的内存就被动态添加到堆中;利用free等函数释放内存。


栈: 栈是.用户存放程序临时创建的局部变量, 也就是{}中定义的变 量(不包括static声明的)


段页纠错小案例


代码:说明各个变量存储的地方


#include<stdio.h>
bool istrue;
int our=555;
int main()
{
char c[]=malloc(10);
static int a=100;
char buf[]="Hello world!";
int i=0;
char *str="Hello world!";
return 0;
}


答案



注意问题:


1.buf str都在栈中存储,但是buf存储的内容在数据段,str存储的内容在代码段(一般来说但凡可以通过下标修改的都在数据段,不可以修改的都在代码段,对象和对象的数据不是一个在一个地方存储)

相关文章
|
8月前
|
机器学习/深度学习 存储 算法
NoProp:无需反向传播,基于去噪原理的非全局梯度传播神经网络训练,可大幅降低内存消耗
反向传播算法虽是深度学习基石,但面临内存消耗大和并行扩展受限的问题。近期,牛津大学等机构提出NoProp方法,通过扩散模型概念,将训练重塑为分层去噪任务,无需全局前向或反向传播。NoProp包含三种变体(DT、CT、FM),具备低内存占用与高效训练优势,在CIFAR-10等数据集上达到与传统方法相当的性能。其层间解耦特性支持分布式并行训练,为无梯度深度学习提供了新方向。
364 1
NoProp:无需反向传播,基于去噪原理的非全局梯度传播神经网络训练,可大幅降低内存消耗
|
3月前
|
缓存 监控 Linux
Linux内存问题排查命令详解
Linux服务器卡顿?可能是内存问题。掌握free、vmstat、sar三大命令,快速排查内存使用情况。free查看实时内存,vmstat诊断系统整体性能瓶颈,sar实现长期监控,三者结合,高效定位并解决内存问题。
358 0
Linux内存问题排查命令详解
|
7月前
|
存储 缓存 Java
【高薪程序员必看】万字长文拆解Java并发编程!(5):深入理解JMM:Java内存模型的三大特性与volatile底层原理
JMM,Java Memory Model,Java内存模型,定义了主内存,工作内存,确保Java在不同平台上的正确运行主内存Main Memory:所有线程共享的内存区域,所有的变量都存储在主存中工作内存Working Memory:每个线程拥有自己的工作内存,用于保存变量的副本.线程执行过程中先将主内存中的变量读到工作内存中,对变量进行操作之后再将变量写入主内存,jvm概念说明主内存所有线程共享的内存区域,存储原始变量(堆内存中的对象实例和静态变量)工作内存。
254 0
|
11月前
|
缓存 Linux
linux 手动释放内存
在 Linux 系统中,内存管理通常自动处理,但业务繁忙时缓存占用过多可能导致内存不足,影响性能。此时可在业务闲时手动释放内存。
556 17
|
9月前
|
安全 Linux
【Linux】阻塞信号|信号原理
本教程从信号的基本概念入手,逐步讲解了阻塞信号的实现方法及其应用场景。通过对这些技术的掌握,您可以更好地控制进程在处理信号时的行为,确保应用程序在复杂的多任务环境中正常运行。
335 84
|
7月前
|
缓存 Linux 数据安全/隐私保护
Linux环境下如何通过手动调用drop_caches命令释放内存
总的来说,记录住“drop_caches” 命令并理解其含义,可以让你在日常使用Linux的过程中更加娴熟和自如。
1285 23
|
9月前
|
监控 Linux Python
Linux系统资源管理:多角度查看内存使用情况。
要知道,透过内存管理的窗口,我们可以洞察到Linux系统运行的真实身姿,如同解剖学家透过微观镜,洞察生命的奥秘。记住,不要惧怕那些高深的命令和参数,他们只是你掌握系统"魔法棒"的钥匙,熟练掌握后,你就可以骄傲地说:Linux,我来了!
335 27
|
10月前
|
消息中间件 Linux
Linux中的System V通信标准--共享内存、消息队列以及信号量
希望本文能帮助您更好地理解和应用System V IPC机制,构建高效的Linux应用程序。
424 48
|
10月前
|
缓存 NoSQL Linux
Linux系统内存使用优化技巧
交换空间(Swap)的优化 禁用 Swap sudo swapoff -a 作用:这个命令会禁用系统中所有的 Swap 空间。swapoff 命令用于关闭 Swap 空间,-a 参数表示关闭 /etc/fstab 文件中配置的所有 Swap 空间。 使用场景:在高性能应用场景下,比如数据库服务器或高性能计算服务器,禁用 Swap 可以减少磁盘 I/O,提高系统性能。
428 3
|
10月前
|
缓存 Linux
Linux查看内存命令
1. free free命令是最常用的查看内存使用情况的命令。它显示系统的总内存、已使用内存、空闲内存和交换内存的总量。 free -h • -h 选项:以易读的格式(如GB、MB)显示内存大小。 输出示例: total used free shared buff/cache available Mem: 15Gi 4.7Gi 4.1Gi 288Mi 6.6Gi 9.9Gi Swap: 2.0Gi 0B 2.0Gi • to
1093 2

热门文章

最新文章