内存管理

Linux 内存管理图,程序运行中各数据的存储位置

荒凉一梦 提交于 2019-11-29 09:54:15
一直以来都对进程在计算机内存中的存放位置比较模糊,这次索性查阅资料,总结后画个草图方便理解。 画图思路主要从内存划分、内存分配方式入手。 1.内存划分: ①内核:linux的内核内存管理是一个比较复杂的部分,建议将此部分单独拎出来分析,这里不做分析,可参考https://blog.csdn.net/haidao2009/article/details/8973484 理解。 ②栈区(自动分配):栈区可以说是程序运行中最常用,调用最频繁的区域,该区域主要存放 自动局部变量、函数形参、命令行参数、环境变量 。 该区的特点是数据以高地址优先方式存储(方便释放,提高空间利用效率),在该区未初始化的变量默认值为垃圾值,故最好在定义 时就初始化。该区变量生命周期为一个函数内(准确来说是一个花括号 {} 内)。 ③数据段(静态区):该区也为自动分配方式,主要用来存放 全局变量、静态局部变量、常量 。该区域可再细分为两个小区,一个未初始化区,一个初始化区,不同于栈区,在该去未初始化的变量默认值将为0,而不是垃圾值;且在未初始化区数据以高地址优先方式存储,在初始化区数据以低地址优先方式存储。生命周期为整个程序运行期间。 ④堆区(动态分配):该区空间由用户分配,用户释放,一般用 malloc()、calloc() 函数来分配空间,用 free() 函数来释放空间。注意

总结

*爱你&永不变心* 提交于 2019-11-29 08:24:18
目录 1.pycharm快捷键 2.变量 a.什么是变量 b.变量的组成 c.变量的命名规范 d.定义变量的两种形式 3.python内存管理 a.变量的引用计数 b.变量的垃圾回收机制 c.小整数池 d.变量的内存管理 1.pycharm快捷键 ctrl+c拷贝 ctrl+v黏贴 ctrl+a全选 ctrl+/整体注释 ctrl+enter换行 ctrl+f查找,选中批量修改 ctrl+z撤销 shift+ctrl+z反撤销 ctrl+backspace删除一个单词 ctrl+y删除整行 ctrl+w选中一个单词 ctrl+shift+l格式化代码 home回到行首 end回到行尾 2.变量 a.什么是变量 定义世间万物变化的状态 b.变量的组成 变量名(描述变量,接受变量的值) 赋值符号(把变量值传递给变量名) 变量值(具体的值) c.变量的命名规范 变量名必须具有描述意义 必须以字母,数字和下划线组成 不能以关键字来命名 d.定义变量的两种形式 下划线形式(必须) 驼峰体 3.python内存管理 a.变量的引用计数 变量的引用计数就是变量的引用次数 b.变量的垃圾回收机制 当变量的引用计数为0的时候,就会启动垃圾回收机器,将该变量进行回收 c.小整数池 当python启动的时候,会自动定义[-5,256]这些数字的整数变量,它们在内存之间的位置是写死的 d.变量的内存管理

内存管理2

和自甴很熟 提交于 2019-11-29 08:15:48
 可能产生外部碎片的是段式和可变分区 可能参数内部碎片的是页式段页式 固定分区 在虚拟存储方案中 常用的页面调入策略有两种请求调页和预调页 移动技术可以解决外部碎片不能解决内部碎片 页面置换策略中先进先出页面置换算法(FIFO)总是选择最先换入的页面调出 最近不常用页面置换算法(LFU)是根据页面的被调用次数来选择的 这种方法总数选择被访问次数最少的页面调出 理想页面置换算法(OPT)总数选用以后不再需要或最长时间以后才会用到的页面调出 最近最少使用页面置换算法(LRU)总是选用最长时间内来访问过的页面调出 页式存储管理方案中 将内存逻辑地址分为页号和地址两个部分 一个字节八位 三个字节24位所以地址长度为24位由于页面地址占10位所以页号占用14位 2^14=16384即进程最多有16384个页面 在某页式存储管理方案中 页面大小2kb=2^11 进程地址空间2^29=512MB 页号就占29-11=18 2^18个 固定分配局部地区置换的分配方案是基于进程的类型 为每一进程分配固定的页数的内存空间 在整个运行期间 都不再改变 采用该策略时 如果进程在运行中出现缺页 则只能从该进程的N个页面选择一个换出 然后再进入一页 以保证分配给该进程的内存空间不变 可变分区进程运行中 其内存页面可以动态增长或者减少 为每一个进程分配一定数目的内存页面 全部置换是运行的过程当其页面不够时

jdk1.6内存管理

走远了吗. 提交于 2019-11-29 06:22:30
原文http://rdc.taobao.com/team/jm/archives/654 分为使用篇、调优篇和实现篇三个部分,使用篇为填鸭式,调优篇为pattern式,实现篇为启发式,三个PPT的目标为: 1.掌握Sun JDK的内存区域的划分; 2.掌握Sun JDK垃圾收集器的使用方法和触发时机; 3.掌握OOM的解决方法; 4.掌握一些基本的GC调优的方法; 5.了解自动内存管理的常见实现方法,以及Sun JDK所做的优化。 感兴趣的同学可以看下,:) 先行放上使用篇和调优篇,实现篇以及slides中的cases后续放上。 使用篇: Sun JDK 1.6内存管理 -使用篇 调优篇: Sun JDK 1.6内存管理 -调优篇 [url]http://www.slideshare.net/BlueDavy/sun-jdk-16[/url] [url]http://www.slideshare.net/BlueDavy/sun-jdk-16-6266092[/url] 来源: CSDN 作者: crystaeye01 链接: https://blog.csdn.net/crystaeye01/article/details/83849646

内存管理

佐手、 提交于 2019-11-29 05:40:01
如何进行内存管理 为了让每个进程认为 独占 地使用内存,并且让每个进程看到的内存是 一致 的,操作系统对物理内存、磁盘进行了 抽象 ,抽象出 虚拟内存 。并且把虚拟内存、物理内存以相同固定大小的 页 进行切分管理( 分页 ),虚拟内存中叫页,物理内存中的叫页帧。 每个进程虚拟地址空间是独立的。用户访问的是虚拟内存的地址,即虚拟地址。需要通过 CPU 芯片上的 内存管理单元 MMU 硬件根据页表 翻译 成物理地址,才能真正访问内存。 页表 :每个进程都有它的独立的页表(放在内存里),用来存对虚拟页、物理页的 映射 。页表可以有多级页表,以时间换取空间(实际上,多级页表的地址翻译,并不比单级页表慢很多)。 为什么用分页机制 如果直接按一个个程序加载到内存,会出现内存 碎片 。 后来出现 分段 机制,按程序的各段来存储,从而减少碎片,但是还是有很多。 所以引出分页,把程序分成更小的页(一般大小为 4KB )来管理内存。分得更小,会增加负荷,但实际上利大于弊。 硬件关系 通过虚拟地址 访问 数据: MMU 先通过它里面的 TLB 缓存查询,如果没有,则去内存中的 页表 进行查询。成功翻译成物理地址后,访问 一级缓存 获取数据。如果没有则访问 二级缓存 (可能还有三级缓存)。还是没有就访问 内存 。 物理内存 不够 时: 将不用的页面换出到磁盘中的 swap 分区 里。 内存空间布局

java 内存管理 堆和栈的理解

£可爱£侵袭症+ 提交于 2019-11-29 05:29:00
在JVM中,内存分为两个部分,Stack(栈)和Heap(堆),这里,我们从JVM的内存管理原理的角度来认识Stack和Heap,并通过这些原理认清Java中静态方法和静态属性的问题。 一般,JVM的内存分为两部分:Stack和Heap。 Heap(堆)是JVM的内存数据区。Heap 的管理很复杂,每次分配不定长的内存空间,专门用来保存对象的实例。在Heap 中分配一定 的内存来保存对象实例,实际上也只是保存对象实例的属性值,属性的类型和对象本身的类型标记等,并不保存对象的方法(方法是 指令,保存在Stack中),在Heap 中分配一定的内存保存对象实例和对象的序列化比较类似。而对象实例在Heap 中分配好以后,需要 在Stack中保存一个4字节的Heap 内存地址,用来定位该对象实例在Heap 中的位置,便于找到该对象实例。 Stack的内存管理是顺序分配的,而且定长,不存在内存回收问题;而Heap 则是随机分配内存,不定长度,存在内存分配和回收 的问题;因此在JVM中另有一个GC进程,定期扫描Heap ,它根据Stack中保存的4字节对象地址扫描Heap ,定位Heap 中这些对象,进 行一些优化(例如合并空闲内存块什么的),并且假设Heap 中没有扫描到的区域都是空闲的,统统refresh(实际上是把Stack中丢 失了对象地址的无用对象清除了)。

我是如何学习写一个操作系统(完结):总结和系列索引

半腔热情 提交于 2019-11-29 03:51:35
前言 从一开始的引导程序到现在的文件系统已经有十篇了,算是自己对操作系统的学习的一个笔记,原本是想结合自己之前写的玩具操作系统 FragileOS ,但是之后就转到了结合Linux 0.11的代码去写这个笔记。 因为现在是马上开学了,后劲不足,也有点焦虑,所以这个系列写得非常乱。没有之前那个 从零写编译器的系列学习笔记 写得顺畅,收获也没有那么多。所以之后开学后可能会打算再读一下Linux 0.11的源码。 索引 我是如何学习写一个操作系统(一):开篇 我是如何学习写一个操作系统(二):操作系统的启动之Bootloader 我是如何学习写一个操作系统(三):操作系统的启动之保护模式 我是如何学习写一个操作系统(四):操作系统之系统调用 我是如何学习写一个操作系统(五):故事的高潮之进程和线程1 我是如何学习写一个操作系统(六):进程的调度 我是如何学习写一个操作系统(七):进程的同步与信号量 我是如何学习写一个操作系统(八):内存管理和段页机制 我是如何学习写一个操作系统(九):文件系统 总结 一个完整的操作系统至少包含这几个部分:进程管理、内存管理和文件系统,如果严格来说的话可以从引导程序开始说 引导程序 对于X86架构的计算机,开机时一共做这几件事 开机时的CS = 0xFFFF, IP = 0x0000 这时候的CPU处理实模式,也就是寻址的方式是CS:IP

linux内存管理

大兔子大兔子 提交于 2019-11-28 22:44:20
在linux下,使用top,vmstat,free等命令查看系统或者进程的内存使用情况时,经常看到buff/cache memeory,swap,avail Mem等,他们都代表什么意思呢?这篇文章将来聊一聊Linux下的内存管理并解答这个问题。 讨论Linux下的内存管理其实就是讨论Linux下虚拟内存的实现方式,本人不是内核专家,所以这篇文章只会介绍一些概念性的东西,不会深入实现细节,有些地方描述的有可能不精确。 在早些时候,物理内存比较有限,人们希望程序可以使用的内存空间能超过实际物理内存,于是出现了虚拟内存的概念,不过随着时间的推移,虚拟内存的意义已经远远的超过了最初的想法。 1、虚拟内存 虚拟内存是Linux管理内存的一种技术。它使得每个应用程序都认为自己拥有独立且连续的可用的内存空间(一段连续完整的地址空间),而实际上,它通常是被映射到多个物理内存段,还有部分暂时存储在外部磁盘存储器上,在需要时再加载到内存中来。 每个进程所能使用的虚拟地址大小和CPU位数有关,在32位的系统上,虚拟地址空间大小是4G,在64位系统上,是2^64=?(算不过来了)。而实际的物理内存可能远远小于虚拟地址空间的大小。 虚拟地址和进程息息相关,不同进程里的同一个虚拟地址指向的物理地址不一定一样,所以离开进程谈虚拟地址没有任何意义。 注意 : 网上很多文章将虚拟内存等同于交换空间

Js内存管理

被刻印的时光 ゝ 提交于 2019-11-28 21:49:57
简介 像C语言这样的底层语言一般都有底层的内存管理接口,比如 malloc() 和 free() 。相反,JavaScript是在创建变量(对象,字符串等)时自动进行了分配内存,并且在不使用它们时“自动”释放。 释放的过程称为垃圾回收。这个“自动”是混乱的根源,并让JavaScript(和其他高级语言)开发者错误的感觉他们可以不关心内存管理。 内存生命周期 不管什么程序语言,内存生命周期基本是一致的: 分配你所需要的内存 使用分配到的内存(读、写) 不需要时将其释放\归还 所有语言第二部分都是明确的。第一和第三部分在底层语言中是明确的,但在像JavaScript这些高级语言中,大部分都是隐含的。 JavaScript 的内存分配 值的初始化 为了不让程序员费心分配内存,JavaScript 在定义变量时就完成了内存分配。 var n = 123; // 给数值变量分配内存 var s = "azerty"; // 给字符串分配内存 var o = { a: 1, b: null }; // 给对象及其包含的值分配内存 // 给数组及其包含的值分配内存(就像对象一样) var a = [1, null, "abra"]; function f(a){ return a + 2; } // 给函数(可调用的对象)分配内存 // 函数表达式也能分配一个对象 someElement

物理内存 虚拟内存

我是研究僧i 提交于 2019-11-28 18:18:06
1.物理内存的概念,虚拟内存的概念? 物理内存,真实的插在板子上的内存是多大就是多大了。而对CPU来说,物理内存就是CPU的地址线可以直接进行寻址的内存空间大小。比如8086只有20根地址线,那么它的寻址空间就是1MB,我们就说8086能支持1MB的物理内存,及时我们安装了128M的内存条在板子上,我们也只能说8086拥有1MB的物理内存空间。同理我们现在大部分使用的是32位的机子,32位的386以上CPU就可以支持最大4GB的物理内存空间了。 2.虚拟内存和物理内存的区别? 正在运行的一个进程,他所需的内存是有可能大于内存条容量之和的,比如你的内存条是256M,你的程序却要创建一个2G的数据区,那么不是所有数据都能一起加载到内存(物理内存)中,势必有一部分数据要放到其他介质中(比如硬盘),待进程需要访问那部分数据时,在通过调度进入物理内存。所以,虚拟内存是进程运行时所有内存空间的总和,并且可能有一部分不在物理内存中,而物理内存就是我们平时所了解的内存条。有的地方呢,也叫这个虚拟内存为内存交换区。 关键的是不要把虚拟内存跟真实的插在主板上的内存条相挂钩,虚拟内存它是“虚拟的”不存在,假的啦,它只是内存管理的一种抽象! 3.什么是虚拟内存地址和物理内存地址? 假设你的计算机是32位,那么它的地址总线是32位的,也就是它可以寻址0~0xFFFFFFFF(4G)的地址空间