内存管理

RT_Thread应用18—内存管理2

ぐ巨炮叔叔 提交于 2019-12-28 01:37:54
第二十四章 内存管理(第二部分) 六、静态内存管理的函数接口 静态内存管理函数的使用——开发流程: 规划一片内存区域作为静态内存池。 调用 rt_mp_create()函数。进行静态内存使用前的创建。 调用 rt_mp_alloc()函数。系统内部将会从空闲链表中获取第一个空闲块,并返回该块的用户空间地址。 调用 rt_mp_free()函数。将该块内存加入空闲块链表,进行内存的释放。 对内存池的操作包含:创建 / 初始化内存池、申请内存块、释放内存块、删除 / 脱离内存池,但不是所有的内存池都会被删除,这与设计者的需求相关,但是使用完的内存块都应该被释放。 1、静态内存控制块 1 struct rt_mempool { 2 struct rt_object parent ; /**<继承自 rt_object */ ( 1 ) * * 静态内存会在自身结构体里面包含一个对象类型的成员,通过这 个成员可以将内存挂到系统对象容器里面。 * * 3 4 void * start_address ; /**< 内存池起始地址 */ ( 2 ) * * 内存池开始地址 * * 5 rt_size_t size ; /**< 内存池大小 */ ( 3 ) * * 内存池大小 * * 6 7 rt_size_t block_size ; /**< 内存块大小 */ ( 4 ) * *

操作系统概述(二)

妖精的绣舞 提交于 2019-12-28 00:36:43
这一章主要讲操作系统的内存管理 操作系统内存管理 内存管理包括内存管理和虚拟内存管理。 内存管理包括程序装入等概念、交换技术、连续分配管理方式和非连续分配管理方式(分页、分段、段页式)。 虚拟内存管理包括虚拟内存概念、请求分页管理方式、页面置换算法、页面分配策略、工作集。 我们先来了解一下什么是内存: 内存是计算机系统的一个重要组成部分,只有在内存中的程序才能被CPU所执行,而且CPU运行时所需要的数据和程序运行空间都是从内存中获取,所以内存性能的好坏直接影响我们计算机性能的好坏. 讲到内存我们可以讲一下关于存储器的分类: 存储器按照功能分配可以分为高速缓冲存储器(cache),主存储器(内存),外存储器(外存): 高速缓冲存储器(cache):cache又分为一级cache和二级cache,一级cache是位于CPU内部的存储器,它负责存储并向CPU传递需要的数据和指令,二级cache位于CPU和主存储器(DRAM)之间,二级的作用就是存储那些CPU处理时需要用到、一级缓存又无法存储的数据。CPU读取数据时,先从一级cache中寻找,找不到再从二级cache中寻找,有时还需要从三级cache中寻找.它们的共同点是读取速度都比CPU慢比内存快,内存容量小,价格高. 缓存的出现主要是为了解决CPU运算速度与内存 读写速度不匹配的矛盾,因为CPU运算速度要比内存读写速度快很多

内存管理之智能指针unique_ptr&weak_ptr

妖精的绣舞 提交于 2019-12-27 07:37:50
unique_ptr: 1.unique_ptr与shared_ptr不同,某个时刻只能有一个unique_ptr指向给定的对象,当unique_ptr被销毁时,其所指向的对象也被销毁,和shared_ptr一样,unique_ptr默认使用delete释放指向的对象 2.unique_ptr初始化 1.不初始化,返回一个内容为nullptr的unique_ptr unique_ptr<类型> 指针名; 2.使用内置类型指针直接初始化 unique_ptr<类型> 指针名(内置类型指针p); 这里的p --> 类型* p = new 类型() unique_ptr<类型> 指针名(new<类型>())//unique_ptr与new结合使用 3.unique_ptr独占指向的对象,不支持赋值和拷贝操作 例子: unique_ptr<string> p1(new string("hello,world")); // 正确,直接初始化 unique_ptr<string> p2(p1); // 错误,unique_ptr不支持拷贝操作 unique_ptr<string> p3; // 正确,返回一个内容为nullptr的unique_ptr p3 = p1; // 错误,unique_ptr不支持赋值操作 4.了解reset()和release()方法 虽然不能拷贝或者赋值

内存管理

会有一股神秘感。 提交于 2019-12-27 02:17:03
内存分配方式 一、分配方式简介 在C++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。 1. 栈:在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。 2. 堆:就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收,分配函数来实现(brk函数也是从这里分配内存)。 3. 自由存储区:就是那些由malloc等分配的内存块,他和堆是十分相似的,不过它是用free来结束自己的生命的。 4. 全局/静态存储区:全局变量和静态变量被分配到同一块内存中,在以前的C语言中,全局变量又分为初始化的和未初始化的,在C++里面没有这个区分了,他们共同占用同一块内存区。 常量存储区:这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改。 二、明确区分堆与栈 void f() { int* p=new int[5]; } 分析:条短短的一句话就包含了堆与栈,看到new,我们首先就应该想到,我们分配了一块堆内存,那么指针p呢?他分配的是一块栈内存,所以这句话的意思就是:在栈内存中存放了一个指向一块堆内存的指针p

深入理解C语言内存管理

北慕城南 提交于 2019-12-27 02:10:21
之前在学Java的时候对于Java虚拟机中的内存分布有一定的了解,但是最近在看一些C,发现居然自己对于C语言的内存分配了解的太少。 问题不能拖,我这就来学习一下吧,争取一次搞定。 在任何程序设计环境及语言中,内存管理都十分重要。 内存管理的基本概念 分析C语言内存的分布先从Linux下可执行的C程序入手。现在有一个简单的C源程序hello.c 1 #include <stdio.h> 2 #include <stdlib.h> 3 int var1 = 1; 4 5 int main(void) { 6 int var2 = 2; 7 printf("hello, world!\n"); 8 exit(0); 9 } 经过gcc hello.c进行编译之后得到了名为a.out的可执行文件 [tuhooo@localhost leet_code]$ ls -al a.out -rwxrwxr-x. 1 tuhooo tuhooo 8592 Jul 22 20:40 a.out ls命令是查看文件的元数据信息 [tuhooo@localhost leet_code]$ file a.out a.out: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs),

Java内存模型和JVM内存管理

柔情痞子 提交于 2019-12-26 22:38:25
Java内存模型 和 JVM内存管理 一、 Java内存模型: 1、 主内存和工作内存(即是本地内存):    Java内存模型的主要目标是定义程序中各个变量的访问规则,即在JVM中将变量存储到内存和从内存中取出变量这样的底层细节。此处的变量与Java编程里面的变量有所不同步,它包含了实例字段、静态字段和构成数组对象的元素,但不包含局部变量和方法参数,因为后者是线程私有的,不会共享,当然不存在数据竞争问题(如果局部变量是一个reference引用类型,它引用的对象在Java堆中可被各个线程共享,但是reference引用本身在Java栈的局部变量表中,是线程私有的)。为了获得较高的执行效能,Java内存模型并没有限制执行引起使用处理器的特定寄存器或者缓存来和主内存进行交互,也没有限制即时编译器进行调整代码执行顺序这类优化措施。 JMM规定了所有的变量都存储在 主内存( Main Memory) 中。每个线程还有自己的 工作内存( Working Memory) ,线程的工作内存中保存了该线程使用到的变量的主内存的副本拷贝,线程对变量的所有操作(读取、赋值等)都必须在工作内存中进行,而不能直接读写主内存中的变量(volatile变量仍然有工作内存的拷贝,但是由于它特殊的操作顺序性规定,所以看起来如同直接在主内存中读写访问一般)。不同的线程之间也无法直接访问对方工作内存中的变量

操作系统知识系列之基础篇

為{幸葍}努か 提交于 2019-12-26 08:34:34
一、操作系统概述 特性 1. 并发: 同一时间间隔内支持执行多个任务, 对于一个核则是交替执行; 2. 共享: 硬件资源或数据资源支持多个进程共享; 3. 异步: 并发情况下, 一个程序会陆陆续续被执行,完成时间不可预知; 4. 虚拟: 物理实体转化为逻辑实体,如虚拟内存。 基本功能 CPU管理:对处理器的管理和调度最终归结为对进程和线程的管理和调度,包括进程控制和管理,线程控制和管理,确定处理器调度策略,设计处理器调度算法,做好处理器分配和回收。 存储管理:存储管理的主要任务是管理内存资源,为多道程序运行提供有力支撑,提高存储空间利用率,具体来说有内存分配与回收,地址转换与存储保护,内存共享与存储扩充等。 设备管理:设备管理的除妖任务是管理各种外部设备,完成用户提出的I/O请求;加快数据传输速度,发挥设备的并行性,提高设备的利用率;提供设备驱动程序和中断处理请求。 文件管理:文件库案例的主要任务有提供文件逻辑组织方法,提供文件物理组织方法,提供文件存取和使用方法,实现文件目录管理,实现文件共享和安全性控制,实现文件存储空间管理等。 体系结构 大内核:将操作系统作为一个整体放在内核当中。 微内核:将操作系统的功能进行详细划分,只有微内核在内核态中存在,其他的在用户态。由于存在用户态和内核态的切换所以会影响系统整体性能。 补充 用户栈: 进程在用户空间时创建的栈

深入了解tcmalloc(一):windows环境下无缝拦截技术初探

三世轮回 提交于 2019-12-26 02:07:58
概述: 又到了一个总结提炼的阶段,这次想具体聊聊游戏引擎中使用的内存管理模块tcmalloc组件的使用心得。项目的前期曾经遇到过内存瓶颈,特别是windows系统下的客户端程序在经历长时间运行之后会出现内存占用率很高疑似泄漏的现象,排查了很久都没有找到原因,甚至一度无法定位问题出自游戏脚本层还是引擎层,后来在引擎中链接了tcmalloc组件,通过实时dump程序的内存信息最终找出了泄漏的元凶。tcmalloc的另一个优势就是通过高效率内存分配来提高游戏运行时性能,不得不说在使用tcmalloc之后,整个游戏的稳定性和效率都有了很大的提升。为了今后更有效和稳定地使用tcmalloc组件,就在这里深入剖析一下这个神器。Tcmalloc是 Google Perftools 中的一个组件,提供一整套高效健壮的内存管理方案,比传统glibc的内存分配和释放要快数倍;其次,基于tcmalloc之上的heapprofiler可以实时dump程序中heap的使用信息,是一个很好的检测内存泄漏的辅助工具;同时tcmalloc的使用又是极其方便,只需要在编译时增加一个链接选项,就可以无缝拦截(patch)原生操作系统运行库中的内存分配和释放接口,而无需修改已经完成的项目工程代码,大大减少移植整合的成本。 在windows平台下,tcmalloc可以通过静态库或者动态库(DLL)的形式嵌入到工程里面

C#内存管理和垃圾回收机制

淺唱寂寞╮ 提交于 2019-12-25 11:03:38
数据类型 垃圾回收机制 一、数据类型 C#中的数据类型分为 值类型 (Value type) 和 引用类型(reference type) , 值 类 型: 所有的值类型都集成自 System.ValueType 上,除非加声明?否则不可为null,保存在 堆栈( Stack,先进后出 ) 上,常见的值类型有:整形、浮点型、bool、枚举等。 引用类型: 所有的引用类型都继承自System.Object 上,引用类型保存在 托管堆(Head,先进先出) 上,常见的类型有:数组、字符串、接口、委托、object等。 拆箱和装箱:引用类型和值类型的相互转换叫做拆装箱操作。 拆箱: 拆箱就是将一个引用型对象转换成任意值型!比如: int i=0; System.Object obj=i; int j=(int)obj; 装箱: 装箱就是隐式的将一个值型转换为引用型对象。比如: int i=0; Syste.Object obj=i; 二、垃圾回收机制 GC   1、简介 C#中和Java一样是一种系统自动回收释放资源的语言,在C#环境中通过 GC(Garbage Collect)进行系统资源回收,在数据基本类型中介绍到,C#数据类型分为引用类型和值类型, 值类型保存在Stack上,随着函数的执行作用域执行完毕而自动出栈,所以这一类型的资源不是GC所关心 对象

python的内存管理机制

和自甴很熟 提交于 2019-12-24 04:27:33
python的内存管理机制 先从较浅的层面来说,Python的内存管理机制可以从三个方面来讲 (1)垃圾回收 (2)引用计数 (3)内存池机制 垃圾回收 python不像C++,Java等语言一样,他们可以不用事先声明变量类型而直接对变量进行赋值。对Python语言来讲,对象的类型和内存都是在运行时确定的。这也是为什么我们称Python语言为动态类型的原因(这里我们把动态类型可以简单的归结为对变量内存地址的分配是在运行时自动判断变量类型并对变量进行赋值)。 1、当内存中有不再使用的部分时,垃圾收集器就会把他们清理掉。它会去检查那些引用计数为0的对象,然后清除其在内存的空间。当然除了引用计数为0的会被清除,还有一种情况也会被垃圾收集器清掉:当两个对象相互引用时,他们本身其他的引用已经为0了。 2、垃圾回收机制还有一个循环垃圾回收器, 确保释放循环引用对象(a引用b, b引用a, 导致其引用计数永远不为0)。 引用计数 在Python中是通过引用计数来保持对内存中的变量追踪的,也就是做Python内部记录中所有在使用对象各有多少个引用。Python中有个内部跟踪变量叫做引用计数器,每个变量有多少个引用,简称引用计数。当某个对象的引用计数为0时,就列入了垃圾回收队列。 引用计数增加的情况: 一个对象分配一个新名称 将其放入一个容器中(如列表、元组或字典) 引用计数减少的情况: