内存管理

c++ 对象注册到lua 内存管理 tolua_cclass 中的内存释放 记一次闪退bug查找 此次闪退 可能发生在任何时机 难以查找

Deadly 提交于 2020-01-26 15:32:56
首先要了解lua的垃圾回收机制,lua中的垃圾回收机制是每隔一段时间清除不再被引用的对象,也就是说一个对象如果不再被使用就会在下次的gc中被回收掉,这个不需要我们管理,是lua中的自动回收机制。接下来看一下c++注册到lua的接口: TOLUA_API void tolua_cclass (lua_State* L, const char * lname, const char * name, const char * base, lua_CFunction col) { char cname[128] = "const "; char cbase[128] = "const "; strncat(cname,name,120); strncat(cbase,base,120); mapinheritance(L,name,base); mapinheritance(L,cname,name); mapsuper(L,cname,cbase); mapsuper(L,name,base); lua_pushstring(L,lname); push_collector(L, name, col); /* luaL_getmetatable(L,name); lua_pushstring(L,".collector"); lua_pushcfunction(L,col); lua

操作系统核心原理-5.内存管理(上):基本内存管理

夙愿已清 提交于 2020-01-24 23:02:55
   操作系统的两个角色分别是魔术师和管理者,在管理者这个角色中,除了CPU之外,内存是操作系统要管理的另外一个重要资源。内存管理需要达到两个目标:一是地址保护,即一个程序不能访问另一个程序的地址空间。二是地址独立,即程序发出的地址应该与物理主存地址无关。这两个目标就是衡量一个内存管理系统是否完善的标准,它是所有内存管理系统必须提供的基本抽象。 一、内存管理二三事 1.1 内存管理的目标   (1) 地址保护 :一个程序不能访问另一个程序地址空间。   (2) 地址独立 :程序发出的地址应该与物理主存地址无关。   这两个目标是衡量一个内存管理系统是否完善的标准,它是所有内存管理系统必须提供的基本抽象。  1.2 虚拟内存的概念   虚拟内存的中心思想是将物理主存扩大到便宜、大容量的磁盘上,即将磁盘空间看做主存空间的一部分。可以理解为是 将书桌上的比较老的文件先暂时收到抽屉里,用空出来的地方来摊开新的文件 。在计算机中,体现在在内存容量不足时将不经常访问的内存空间中的数据写入硬盘,以增加“账面上”可用内存容量的手段(想想我们的内存和硬盘容量对比就知道了)。   但是,如果在书桌和抽屉之间频繁进行文件的交换,工作效率肯定会下降。如果每次要看一份文件都要先收拾书桌再到抽屉里面拿的话,那工作根本就无法进行了。   虚拟内存的优点在于除了让程序员感觉到内存容量大大增加之外

内存管理

柔情痞子 提交于 2020-01-24 20:02:59
  在Intel 80x86体系结构中,Linux内核的内存管理程序采用了分页管理机制.利用页目录和页表结构处理内核中其他部分代码对内存的申请和释放操作.内存的管理是以内存页面为单位进行的,一个内存页面是指在地址连续的4KB内存.通过也目录项和页表项,可以寻址和管理指定页面的使用情况.   在Intel 80x86 CPU中,程序在寻址过程中使用的是由段和偏移值构成的地址.该地址并不能直接用来寻址物理内存地址,因为被称为 虚拟地址 .为了能寻址物理内存,就需要一种地址转换机制将虚拟地址映射或转换到物理内存中,这种地址转换机制就是内存管理的主要功能之一.内存管理的另外一个重要功能就是内存的值保护机制.虚拟地址通过段管理机制首先变换成一种中间地址形式–CPU32位的线性地址,然后使用内存管理机制将此线性地址映射到物理地址.   在Intel 80x86的系统中,内存管理是通过 页目录表 和 内存页表 所组成的二级表进行.    其中页目录表和页表的结构是一样的,表项结构也相同的.页目录表中的每个表项4B用来寻址一个页表,而每个页表项4B用来指定一页物理内存页面.因此,当指定了一个页目录项和一个页表项,我们就可以唯一确定所对应的物理内存页.页目录表占用一页内存,因此最多可以寻址1024个页表.而每个页表也同样占用一页内存,因此以页表可以寻址最多1024个物理内存页面.这样在80386中

从零开始学习UCOSII操作系统15--总结篇

我只是一个虾纸丫 提交于 2020-01-24 03:30:59
https://msd.misuland.com/pd/3626730720442974994 前言:在大学的时候,我们班级上面都有很多人觉得学习UCOSII(包括UCOSIII)是没什么厉害的,因为很多人都喜欢去学习Linux 操作系统 ,但是,但是,真实的对整个UCOSII操作系统进行学习,我可以保证,如果你是基于源码级别的阅读的话,绝对是不简单的。仅仅是调用几个API的话,是永远用不好UCOSII的操作系统的。还有你真正学通了UCOSII操作系统的话,那么你对Linux操作系统的内核也不会有太大的难度。 参考:嵌入式实时操作系统UCOSII原理与应用 1、UCOSII操作系统是怎么管理任务的? 用图是最能表现的: (1)任务控制块是来管理任务的。 (2)其中UCOSII把所有的任务都是通过双向链表来连接到一起的,为什么?我难道不能使用数组来分配空间吗? 关键原因:在整个操作系统中,因为我们不知道用户到底需要多少个任务,所以使用链表的话,在编译后才确认的话,数组的方式优秀很多。 我个人认为这张图其实是有一些错误的: 比如里面写了指向任务的指针,我觉得是应该放置在任务堆栈里面的,因为创建任务的时候,是将任务的函数名,传递给任务堆栈,然后任务堆栈再传到CPU的SR寄存器中,实现任务切换的。 所谓的指向任务的指针:其实就是任务的函数的函数名。 2、UCOSII操作系统是怎么运行的?

操作系统核心原理-5.内存管理(中):分页内存管理

北城余情 提交于 2020-01-23 21:24:23
   在上一篇介绍的几种多道编程的内存管理模式中,以交换内存管理最为灵活和先进。但是这种策略也存在很多重大问题,而其中最重要的两个问题就是空间浪费和程序大小受限。那么有什么办法可以解决交换内存存在的这些问题呢?答案是分页,它是我们解决交换缺陷的“不二法门”。 一、分页内存管理 1.1 解决问题之道   为了解决交换系统存在的缺陷,分页系统横空出世。分页系统的核心在于: 将虚拟内存空间和物理内存空间皆划分为大小相同的页面,如4KB、8KB或16KB等,并以页面作为内存空间的最小分配单位,一个程序的一个页面可以存放在任意一个物理页面里 。   (1)解决空间浪费碎片化问题   由于将虚拟内存空间和物理内存空间按照某种规定的大小进行分配,这里我们称之为页(Page),然后按照页进行内存分配,也就克服了外部碎片的问题。   (2)解决程序大小受限问题   程序增长有限是因为一个程序需要全部加载到内存才能运行,因此解决的办法就是使得一个程序无须全部加载就可以运行。使用分页也可以解决这个问题,只需将当前需要的页面放在内存里,其他暂时不用的页面放在磁盘上,这样一个程序同时占用内存和磁盘,其增长空间就大大增加了。而且,分页之后,如果一个程序需要更多的空间,给其分配一个新页即可(而无需将程序倒出倒进从而提高空间增长效率)。 1.2 虚拟地址的构成与地址翻译   (1)虚拟地址的构成   在分页系统下

Linux内存管理概述

a 夏天 提交于 2020-01-23 05:56:03
Linux内存管理概述 2020年悄悄的来了,新年初始正是立flag的好时候,今年的flag是总结完linux内存管理和进程管理两大模块,想法是好的,希望能坚持下去,废话到此为止,今天先来介绍linux内存管理的概述,后续内存相关文章都围绕今天的内容展开。 内存管理架构图 先上图: 用户空间 应用程序并没有直接调用系统调用申请内存,是调用glibc的库函数malloc和free申请和释放内存,malloc和free是glibc的ptmalloc分配器提供的接口,ptmalloc使用系统调用brk和mmap向内核以页为单位申请内存,然后划分成小的内存块分配给用用程序。 除了glibc的ptmalloc,还有google公司的tcmalloc和FreeBSD的jemalloc。 Note: GUN C指的是glibc,ANSI C指的是libc,是标准C库,glibc对libc做了扩展,一般只用于linux 内核空间 虚拟内存管理负责为进程分配虚拟页,内存采用延迟分配虚拟页的策略,进程第一次申请内存页时,会发生页错误异常,异常处理程序从页分配器中分配物理页,并把虚拟页和物理页的映射条目更新到页表中。 页分配器负责分配物理页,内核有多种页分配器,不连续内存页分配器、连续页分配器、引导内存分配器等。 连续内存页分配器(CMA):DMA可以不需要cpu直接控制内存,但是一般需要连续的内存

Python内存管理以及数据类型

只谈情不闲聊 提交于 2020-01-22 01:13:26
一.内存管理 1.Cpython解释器的垃圾回收机制 什么是垃圾:当一个值身上没有绑定任何变量名(该值的引用计数=0)时,该值就是一个垃圾。 Cpython解释器就会自动回收这样的垃圾。 #引用计数增加 #age=18 # 18的引用计数=1 #x=age # 18的引用计数=2 #引用计数减少 #age=19 # 18的引用计数=1 #del x # 18的引用计数=0 2.变量值的三个特征: id:反映的内存地址 # age=18 type::数据类型 # print(id(age)) 值:数据 # orint(age) 总结:id相同,值一定相同;值相同,id可以不同。 例:x='my name is wangke' y='my name is wangke' print(id(x),id(y)) # 40702000 40702216 3. is 与 == ==:值是否相等 is :id是否相等 4.可变类型与不可变类型 不可变类型:值改变,id也变,证明根本不是在改变原值,是创建了新值,原值就是不可变类型 例:x=10 print(id(x)) x=11 print(id(y)) # 1435266816 1435266848 可变类型:值改变,id不变,证明就是在改变原值,原值是可变类型 例:l=['a','b','c'] print(id(l)) l[0]='A'

JVM的内存管理 Ⅰ

…衆ロ難τιáo~ 提交于 2020-01-21 22:06:42
最近在看Java优化这方面的书,那必然会涉及到内存管理,我想和大家共同提高,于是写出来,如果有问题,希望能提出来,共同进步嘛!呵呵,不说这些了,好,现在开始你的知识之旅吧! 在做Java开发的时候常用的JVM内存管理有两种,一种是堆内存,一种是栈内存。堆内存主要用来存储程序在运行时创建或实例化的对象与变量,例如:我们通过new MyClass()创建的类MyClass的对象。而栈内存则是用来存储程序代码中声明为静态(或非静态)的方法。下面我给大家举个例子: 代码 1 public class Test{ 2 static Vector list = new Vector(); 3 static void makeThings(){ 4 Object object = new Object(); 5 list.add(object); 6 } 7 public static void main(){ 8 makeThings(); 9 }10 } 就拿上面的例子来说,放在栈内存中的有:main,makeThings,放在堆内存中有:Test,list,object。 JVM中对象的生命周期大致可以分为7个阶段:创建阶段、应用阶段、不可视阶段、不可到达阶段、可收集阶段、终结阶段与释放阶段。 1.创建阶段: (1)为对象分配存储空间。 (2)开始构造对象。 (3)递归调用其超类的构造方法

linux内存管理之vmalloc函数分析

谁说胖子不能爱 提交于 2020-01-21 09:05:54
2017-07-09 今天周末,闲来无事聊聊linux内核内存分配那点事……重点在于分析vmalloc的执行 流程 以传统x86架构为例,内核空间内存(3G-4G)主要分为三大部分:DMA映射区,一致映射区、高端内存区。其中前两者占据低端892M,而剩下的128M作为高端内存区。DMA映射区涉及到外部设备,咱们暂且不讨论,那么就剩下一致映射区和高端内存区。一致映射区的虚拟地址均一一对应了物理页框,因此此区间虚拟地址的访问可以直接通过偏移量得到物理内存而不需进行页表的转换。但是1G内核地址空间说实话有些捉襟见肘,如果都用作一致映射,那么当物理内存大于4G时,内核仍然无法利用。鉴于此,留下128M的地址空间作为高端内存,扮演着临时映射的作用。回想下PAE模式的原理,是不是有些相似呢?一致映射区既然都已经关联了物理内存就可以通过slab缓存来管理,以加速分配。而高端内存这点有些类似于用户进程的内存分配,但又并不完全相同,后面咱们会讲到。在这里咱们先回忆下用户空间内存分配流程,一个普通的进程调用malloc函数分配一段地址空间,有可能在 堆中,如果内存过大海有可能在mmap映射区,同时会由一个vm_area_struct记录下本次分配出去的地址空间信息,如大小,起始地址等由于进程独享虚拟地址空间,所以这些vm_area_struct都是按照进程为单位进行管理的。这也没毛病

Linux的内存管理

荒凉一梦 提交于 2020-01-20 20:42:16
Linux的内存管理,实际上跟windows的内存管理有很相像的地方,都是用虚拟内存这个的概念,说到这里不得不骂MS,为什么在很多时候还有很大的物理内存的时候,却还是用到了pagefile. 所以才经常要跟一帮人吵着说Pagefile的大小,以及如何分配这个问题,在Linux大家就不用再吵什么swap大小的问题,我个人认为,swap设个512M已经足够了,如果你问说512M的SWAP不够用怎么办?只能说大哥你还是加内存吧,要不就检查你的应用,是不是真的出现了memory leak. 夜也深了,就不再说废话了。 在Linux下查看内存我们一般用command free [root@nonamelinux ~]# free total used free shared buffers cached Mem: 386024 377116 8908 0 21280 155468 -/+ buffers/cache: 200368 185656 Swap: 393552 0 393552 下面是对这些数值的解释: 第二行(mem): total:总计物理内存的大小。 used:已使用多大。 free:可用有多少。 Shared:多个进程共享的内存总额。 Buffers/cached:磁盘缓存的大小。 第三行(-/+ buffers/cached): used:已使用多大。 free