内存管理

内存管理-----虚拟内存

谁说胖子不能爱 提交于 2020-01-20 19:06:56
前言 在8086/80186时还没有操作系统,把它称之为 实地址模式 。 那么怎么将地址表示出来呢? 比如:数据寄存器DS中的值是16位,要转换成20位的地址。怎么转换呢? 所以左移四位后则低四位变为0了,然后再加上IP寄存器中的偏移值,就是物理地址。 DS << 4 + IP (即偏移值) = 物理地址 没有操作系统则它的空间就称为物理空间(上图的空间) DS( 基地址 ) IP( 偏移地址、偏移量、逻辑地址 ) IP寄存器中最多存16位,则偏移量最多为2^16=64K. 因为 起始位置必须是16的倍数 ,则 整个段大小在16B-64K之间 ,则它的真实 大小就不确定 ,就可能导致 如果别人恶意修改这个IP寄存器 中的值,则 段的大小就会发生改变 ,就会导致访问无法访问的空间。 因此为了解决这样的问题,所以我们就需要 保存记录 基地址 段大小 以及 访问权限 。 所以在有了操作系统以后, 因为要向上兼容 ,所以 上述寄存器不改变 ,而添加 GDTR(全局段描述表寄存器) 和 LDTR(局部段描述符表寄存器) 。 我们这里先从GDTR分析,是在 内存存储 的 全局段描述表 (相当于数组) GDTR存储了这些,那么DS、CS、SS(ES)这些寄存器做什么呢? 存储 段描述符表的下标 段描述符表的类别 以及权限位 当操作系统启动时,默认占据12个描述符表项,而用户进程最多只能用8192

memcache内存管理

做~自己de王妃 提交于 2020-01-20 16:57:30
1、memcache启动参数 memcached -h memcached 1.4.20 -p < num > TCP端口,默认为11211,可以不设置 -U < num > UDP端口,默认为11211,0为关闭 -s < file > UNIX socket-a < mask > access mask for UNIX socket, in octal ( default: 0700 ) -l < addr > 监听的 IP 地址,本机可以不设置此参数 -d 以守护程序(daemon)方式运行 -u 指定用户,如果当前为 root ,需要使用此参数指定用户 -m < num > 最大内存使用,单位MB。默认64MB -M 禁止LRU策略,内存耗尽时返回错误,而不是删除项 -c < num > 最大同时连接数,默认是1024 -v verbose ( print errors/warnings while in event loop ) -vv very verbose ( also print client commands/reponses ) -vvv extremely verbose ( also print internal state transitions ) -h 帮助信息 -i print memcached and libevent license -P

计算机操作系统-内存管理

老子叫甜甜 提交于 2020-01-20 10:27:13
虚拟内存 虚拟内存的目的是为了让物理内存扩充成更大的逻辑内存,从而让程序获得更多的可用内存。 为了更好的管理内存,操作系统将内存抽象成地址空间。每个程序拥有自己的地址空间,这个地址空间被分割成多个块,每一块称为一页。这些页被映射到物理内存,但不需要映射到连续的物理内存,也不需要所有页都必须在物理内存中。当程序引用到不在物理内存中的页时,由硬件执行必要的映射,将缺失的部分装入物理内存并重新执行失败的指令。 从上面的描述中可以看出,虚拟内存允许程序不用将地址空间中的每一页都映射到物理内存,也就是说一个程序不需要全部调入内存就可以运行,这使得有限的内存运行大程序成为可能。例如有一台计算机可以产生 16 位地址,那么一个程序的地址空间范围是 0~64K。该计算机只有 32KB 的物理内存,虚拟内存技术允许该计算机运行一个 64K 大小的程序。 分页系统地址映射 内存管理单元(MMU)管理着地址空间和物理内存的转换,其中的页表(Page table)存储着页(程序地址空间)和页框(物理内存空间)的映射表。 一个虚拟地址分成两个部分,一部分存储页面号,一部分存储偏移量。 下图的页表存放着 16 个页,这 16 个页需要用 4 个比特位来进行索引定位。例如对于虚拟地址(0010 000000000100),前 4 位是存储页面号 2,读取表项内容为(110 1)

Theano教程:Python的内存管理

跟風遠走 提交于 2020-01-19 04:43:29
在写大型程序时候的一大挑战是如何保证最少的内存使用率。但是在Python中的内存管理是比较简单的。Python显示分配内存,使用引用计数系统管理对象,当指向某一个对象的引用数变为 0 的时候,该对象所占的内存就会被释放。理论上听起来很不错,也很简单,但是在实践中,我们需要知道一些Python内存管理的知识从而让程序在运行过程中能够更加高效地使用内存。其中一个方面我们需要知道的是基本的Python对象所占空间的大小,另一方面我们需要知道的是Python在内部到底是如何管理内存的。 基本对象 一个 int 对象占多大空间呢? C/C++程序员会说它是由具体的机器决定的,可能是32为或者64位,因此它最多占8个字节(一个字节8位)。那么在Python中也是如此吗? 下面写一个函数来揭示出对象占多大的空间(某些情况下需要递归,比如某一个对象类型不是基本的数据类型): 1 import sys 2 3 def show_sizeof(x, level=0): 4 5 print "\t" * level, x.__class__, sys.getsizeof(x), x 6 7 if hasattr(x, '__iter__'): 8 if hasattr(x, 'items'): 9 for xx in x.items(): 10 show_sizeof(xx, level + 1) 11

小熊派华为物联网操作系统LiteOS内核教程06-内存管理

泄露秘密 提交于 2020-01-19 00:38:13
1. LiteOS内核的内存管理 1.1. 内存管理 在系统运行的过程中,一些内存空间 大小是不确定的 ,比如一些数据缓冲区,所以系统需要提供内存空间的管理能力,用户可以在使用的时候申请需要的内存空间,使用完毕释放该空间,以便再次利用。 Huawei LiteOS 的内存管理模块通过对内存的申请/释放操作,来管理用户和OS对内存的使用,使内存的利用率和使用效率达到最优,同时最大限度地解决系统的内存碎片问题。 1.2. 动态内存管理 动态内存管理,即在内存资源充足的情况下,从系统配置的一块比较大的连续内存(内存池),根据用户需求,分配任意大小的内存块。当用户不需要该内存块时,又可以释放回系统供下一次使用。 与静态内存相比,动态内存管理的好处是按需分配,缺点是内存池中容易出现碎片 。 LiteOS动态内存支持 DLINK 和 BEST LITTLE 两种标准算法。 1.2.1. DLINK 动态内存管理算法 DLINK动态内存管理结构如下图所示: 第一部分 堆内存(也称内存池)的起始地址及堆区域总大小。 第二部分 本身是一个数组,每个元素是一个双向链表,所有free节点的控制头都会被分类挂在这个数组的双向链表中。 第三部分 占用内存池极大部分的空间,是 用于存放各节点的实际区域 。 1.2.2. BEST LITTLE 算法(重点) LiteOS 的动态内存分配支持最佳适配算法,即

python的内存管理机制

落爺英雄遲暮 提交于 2020-01-17 23:54:50
一、python是一个什么样类型的语言   1、python是一种 动态解释性强类型定义的高级、通用性编程 语言。     解释型:执行的时候,才一条一条的解释成机器语言给计算机来执行。如:python、js、ruby、PHP等     编译型:把源程序的每一条语句都编译成机器语言,并保存成二进制文件,这样运行时计算机可以直接以机器语言来运行此程序,速度快。如:C、C++、go等     动态语言:动态类型的语言编程时,永远也不用给任何变量指定数据类型,该语言会在你第一次赋值给变量时,在内部将数据类型记录下来     静态语言:与动态类型语言刚好相反,它的数据类型是在编译其间检查的,也就是说在写程序时要声明所有变量的数据类型     强类型定义语言:一旦一个变量被指定了某个数据类型,如果不经过强制转换,那么它就永远是这个数据类型     弱类型定义语言:数据类型可以被忽略的语言。它与强类型定义语言相反, 一个变量可以赋不同数据类型的值 二、python的内存管理机制     python的内存管理机制:引用计数、垃圾回收、内存池机制   1、变量与对象               1、变量:通过变量指针引用对象         变量指针:指向具体对象的内存空间,取对象的值。     2、对象, 类型已知,每个对象都包含一个头部信息(头部信息:类型标识符和引用计数器)        

LKD:内存管理

99封情书 提交于 2020-01-16 10:02:22
内核本身不能像用户空间那样奢侈地使用内存。 页:内核把物理页作为内存管理的基本单位。 MMU:内存管理单元,管理内存并把虚拟地址转换为物理地址的硬件。 内核用struct page结构表示系统中的每个物理页。 区:由于硬件的限制,内核并不能对所有页一视同仁。内核把页划分为不同的区。Linux必须处理两种由于硬件缺陷而引起的内存寻址问题: 一些硬件只能用某些特定的内存地址来执行DMA 一些体系结构的内存的物理寻址范围比虚拟地址范围大的多,因此就有一些内存无法永久的映射到内核空间。 Linux主要使用四种区: ZONE_DMA:包含的页能用来执行DMA。 ZONE_DMA32:和ZONE_DMA类似,该区包含的页可以用来执行DMA操作,不同在于,这些页面只能被32位设备访问。 ZONE_NORMAL:能正常映射的页。 ZONE_HIGHEM:高端内存,其中的页并不能永久地映射到内核空间。 每个区用struct zone表示。 获得页:struct page * alloc_pages(gfp_t gfp_mask, unsigned int order) kmalloc:获取字节为单位的内存。 gfp_mask标志:行为修饰符、区修饰符及类型。 vmalloc():分配的内存虚拟地址是连续的,而物理地址则无需连续。kmalloc确保页在物理地址上是连续的(虚拟地址自然也是连续的)。

自动内存管理机制

谁说我不能喝 提交于 2020-01-16 06:03:10
对于Java程序员来说,在虚拟机自动内存管理机制的帮助下,不需要在为每个new操作去写配对的delete/free代码,不容易出现内存泄漏和内存溢出的问题,Java程序员把内存控制的权力交给了Java虚拟机 运行时数据区域 Java虚拟机在执行java程序的过程中会把他所管理的内存划分为若干个不同的数据区域 程序计数器 (program counter register) 概念: 当前线程所执行的字节码的行号解释器 在虚拟机的概念模型里,字节码解释器工作时通过改变计数器的值选取下一条要执行的字节码指令 在物理上,通过寄存器来实现(读取快) 特点: ① 线程私有,每个线程有一个互不影响,用于线程切换后恢复到正确的执行位置 ② 不存在内存溢出 虚拟机栈 (Java Virtual Machine Stacks) 概念: 栈:栈是线程运行时所需要的内存空间 栈帧:栈里面有一个一个的栈帧,栈帧是每个方法运行时所需的内存,所有的方法再执行时创建一个栈帧,用于存储 ① 局部变量表,② 操作数栈(对应当前的指令,栈帧对应的是方法),③ 动态链接, 方法出口等信息 每调用执行一个方法就会往栈里面压入相应的栈帧,执行完再弹出 局部变量表:存放着编译期间可知的各个基本数据类型,对象引用和returnAddress类型(指向一条字节码指令的地址) 对应着当前正在执行的方法的栈帧叫做活动栈帧 特点: ①

nRF 内存管理相关

老子叫甜甜 提交于 2020-01-15 20:59:34
勾选 sdk_config.h --> nRF_Libraries --> MEM_MANAGER,然后在其中设置XXS到XXL的块大小及块数量,注:若设置块大小为40个字节 块数量为10块,即便只申请32个字节的大小,也只能申请到10块。 添加 mem_manager.c 文件,main.c中调用 UNUSED_VARIABLE(nrf_mem_init()); 进行初始化,使用 nrf_malloc 申请内存,注意申请的大小!!! 例如: typedef struct slv_msg_lsg { struct slv_msg_lsg *next; slv_msg_t data; // int32_t upload_time; // bool update_flag; // June6 int32_t to bool } slv_msg_lst_t; slv_msg_lst_t *node = NULL; node = (slv_msg_lst_t *)nrf_malloc(sizeof(slv_msg_lst_t)); 特别注意:内存块大小要遵循内存字节对齐规则(4个字节,即内存块大小要是4的倍数) 来源: CSDN 作者: June_doubling_6 链接: https://blog.csdn.net/qq_37258637/article/details

HBase 内存管理理解

。_饼干妹妹 提交于 2020-01-14 23:09:22
1. 基础知识 1.1 Region Server内存布局 参考[2] 1.2 堆内内存 物理内存少于20G,建议只配置堆内内存 配置参数: hbase-env.sh 的参数 HBASE_HEAPSIZE ,默认1G 为 on-heap BlockCache 的实现,称之为 LruBlockCache ,也称 L1 Cache 默认开启,可在表的列族级关闭, desc 'table' 查看 BLOCKCACHE => 'false' 设置 hbase.block.data.cachecompressed 为 true 可开启BlockCache压缩。性能影响 HBASE-11331 :吞吐率增加50%,延迟增加30%,gc增加80%,CPU负载增加2%。 1.3 堆外内存 物理内存大于20G,建议配置堆外内存 off-heap BlockCache 称为 BucketCache ,也称 L2 Cache 堆外内存总大小由 -XX:MaxDirectMemorySize=20G 参数配置,或者 hbase-env.sh 的参数 HBASE_OFFHEAPSIZE hbase.bucketcache.size 配置 BucketCache 的占堆外内存比例(若 <1.0 )或大小( >=1 ,单位 MB ) hbase.bucketcache.ioengine 设置为 offheap