内存碎片

转:C++内存池

半城伤御伤魂 提交于 2020-02-13 08:17:30
#ifndef _MEMPOOL_H_ #define _MEMPOOL_H_ /* 本类封装了一个内存池,采用模板类, 模板参数就是内存池中分配的对象类型 本类主要用链表来实现,适用于固定大小的内存块分配 */ #include <vector> using std::vector; template<typename T> class CMemPool { struct _MemNode { _MemNode *pPrev; char data[sizeof(T) - sizeof(_MemNode*)]; }; struct _MemBlock { _MemBlock *pPrev; _MemNode *pNode; }; _MemBlock *m_pBlockHeader; //大内存块链表头指针 _MemNode *m_FreeNodeHeader; //空闲的小块头指针 int m_BlockSize; //当前小内存块数量 private: void AllocBlocks(); //分配内存块 void ReallocBlocks(); //扩大内存池大小 public: //构造函数,nInitSize为初始内存块数 CMemPool(int nInitSize = 128) : m_BlockSize(nInitSize), m_pBlockHeader

面试中那些操作系统常考问题

限于喜欢 提交于 2020-02-12 19:43:47
1. 进程和线程以及其区别? 1、进程是系统进行资源调度和分配的的基本单位,是程序的一次动态执行过程,可实现操作系统的并发;线程是系统资源调度的在最小单位,可实现进程内部的并发; 2、一个程序至少包含一个进程,一个进程至少包含一个线程,线程是进程的子任务; 3、进程有自己独立的内存单元,线程没有,多个线程共享一个进程的内存; 2. 进程间通信的方式? 1、 管道 :内存中固定大小的缓冲区;一个管道只能实现半双工通信,要实现全双工通信需要两个管道;数据没读空不能写,没写满不能读; 优缺点:简单,能保证数据确实已经被取出了(因为没读空是不能写的),但效率低。如a进程给b进程传输数据,只能等到b取出数据后才能返回。因此,其不适合频繁通信的进程。 能否将进程的数据放在某个内存之后不用等待其他进程来取就返回呢? 2、 消息队列 :a进程给b进程传输数据,把消息放在对应的消息队列即可,无需等待。 优缺点:如果a进程发送的数据占用内存较大,且两进程通信特别频繁,消息队列就不合适了。因为此时大量时间花费在内存的拷贝上。 如何解决上述拷贝耗时问题呢? 3、 共享内存 :a和b进程各自拿出一块虚拟内存地址空间,然后映射到同一个物理内存中,实现内存共享机制。 但是上述共享内存机制存在多进程竞争内存的问题,如何解决呢? 4、 信号量 :本质是计数器,用来实现进程之间的互斥和同步。比如信号量初值为1

JVM虚拟机 与 GC 垃圾回收

懵懂的女人 提交于 2020-02-12 16:31:24
一、JVM体系结构概述 1、JVM 与系统、硬件 ​ JVM 是运行在操作系统之上的,它与硬件没有直接的交互 2、JVM 体系结构概览 ​ 3、类装载器ClassLoader 执行原理 负责加载class文件,class文件在文件开头有特定的文件标示,并且ClassLoader只负责class文件的加载,至于它是否可以运行,则由Execution Engine决定 ​ 4、类装载器ClassLoader装载流程(双亲委派) ​ 虚拟机自带的加载器 启动类加载器(Bootstrap)C++ 扩展类加载器(Extension)Java 应用程序类加载器(AppClassLoader)Java 也叫系统类加载器,加载当前应用的classpath的所有类 用户自定义加载器 Java.lang.ClassLoader的子类,用户可以定制类的加载方式 注 : Execution Engine执行引擎负责解释命令,提交操作系统执行。 ​ 5、Native Interface本地接口 本地接口的作用是融合不同的编程语言为 Java 所用,它的初衷是融合 C/C++程序,Java 诞生的时候是 C/C++横行的时候,要想立足,必须有调用 C/C++程序,于是就在内存中专门开辟了一块区域处理标记为native的代码,它的具体做法是 Native Method Stack中登记 native方法

JVM 垃圾收集器CMS相关参数

℡╲_俬逩灬. 提交于 2020-02-10 20:21:23
CMS相关参数 -XX:+UseConcMarkSweepGC 使用CMS内存收集 测试中配置这个以后,-XX:NewRatio=4的配置失效了,原因不明.所以,此时年轻代大小最好用-Xmn设置.??? -XX:+AggressiveHeap 试图是使用大量的物理内存 长时间大内存使用的优化,能检查计算资源(内存, 处理器数量) 至少需要256MB内存 大量的CPU/内存, (在1.4.1在4CPU的机器上已经显示有提升) -XX:CMSFullGCsBeforeCompaction 多少次后进行内存压缩 由于并发收集器不对内存空间进行压缩,整理,所以运行一段时间以后会产生"碎片",使得运行效率降低.此值设置运行多少次GC以后对内存空间进行压缩,整理. -XX:+CMSParallelRemarkEnabled 降低标记停顿 -XX+UseCMSCompactAtFullCollection 在FULL GC的时候, 对年老代的压缩 CMS是不会移动内存的, 因此, 这个非常容易产生碎片, 导致内存不够用, 因此, 内存的压缩这个时候就会被启用。 增加这个参数是个好习惯。 可能会影响性能,但是可以消除碎片 -XX:+UseCMSInitiatingOccupancyOnly 使用手动定义初始化定义开始CMS收集 禁止hostspot自行触发CMS GC -XX

MySQL my.cnf详解

你说的曾经没有我的故事 提交于 2020-02-10 12:27:14
1 #*** client options 相关选项 ***# 2 #以下选项会被MySQL客户端应用读取。注意只有MySQL附带的客户端应用程序保证可以读取这段内容。如果你想你自己的MySQL应用程序获取这些值。需要在MySQL客户端库初始化的时候指定这些选项。[client] 3 port = 3306 4 socket = /usr/local/mysql/tmp/mysql.sock 5 [mysqld]!include /usr/local/mysql/etc/mysqld.cnf 6 #包含的配置文件 ,把用户名,密码文件单独存放 7 port = 3306 8 bind-address = 0.0.0.0 9 server-id = 1 10 #表示是本机的序号为1,唯一 11 socket = /usr/local/mysql/tmp/mysql.sock 12 pid-file = /usr/local/mysql/var/mysql.pid 13 basedir = /usr/local/mysql/ 14 datadir = /usr/local/mysql/var/ 15 tmpdir = /usr/local/mysql/tmp/ 16 #此目录被 MySQL用来保存临时文件.例如,它被用来处理基于磁盘的大型排序,和内部排序一样,以及简单的临时表

第七章 内存管理

风流意气都作罢 提交于 2020-02-10 09:00:14
在单道程序设计系统中,内存被划分成两个部分:一部分供操作系统使用(驻留监控程序、内核),一部分供当前正在执行的程序使用。在多道程序设计系统中,必须在内存中进一步细分出“用户”部分,以满足多个进程的要求。细分的任务由操作系统动态完成,这称为内存管理。 有效的内存管理在多道程序设计系统中是至关重要的。如果只有少量进程在内存中,所有进程大部分时间都用来等待IO,这种情况下,处理器也处于空闲状态。因此,必须有效地分配内存来保证有适当数目的就绪进程可以占用这些可用的处理时间。 一、内存管理的需求 1 重定位 在多道程序设计系统中,可用的内存空间通常被多个进程共享。 通常情况下,程序员并不能事先知道在某个程序执行期间会有其他哪些程序驻留在内存中。此外还希望通过提供一个巨大的就绪进程池,能够把活动进程换入或换出内存,以便使处理器的利用率最大。 一旦程序被换出磁盘,当下一次被换入时,需要把进程重定位到内存的不同区域。因此,我们事先不知道程序将会被放置到哪个区域,并且我们必须允许程序通过交换技术在内存中移动。 操作系统需要知道进程控制信息和执行栈的位置,以及该进程开始执行程序的入口点。 2 保护 每个进程都应该受到保护,以免被其他进程有意无意地干涉。因此,该进程以外的其他进程中的程序不能未经授权地访问(进程读操作或写操作)该进程的内存单元。 通常,用户进程不能访问操作系统的任何部分

JVM内存模型

寵の児 提交于 2020-02-10 00:57:43
个人博客 http://www.milovetingting.cn JVM内存模型 前言 本文为学习Java相关知识所作笔记,参考以下资料: https://github.com/Snailclimb/JavaGuide ,感谢原作者的分享! 基本概念 JVM是可运行Java代码的虚拟计算机,包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收器、堆和一个存储方法域。JVM运行在操作系统之上,它与硬件没有直接交互。 Java源文件,通过编译器,能够生产相应的class文件,也就是字节码文件,字节码文件通过Java虚拟机中的解释器,编译成特定机器上的机器码。 Java源文件-->编译器-->字节码文件 字节码文件-->JVM-->机器码 每一种平台的解释器是不同的,但是实现的虚拟机是相同的,这也就是 Java 为什么能够跨平台的原因了 ,当一个程序从开始运行,这时虚拟机就开始实例化了,多个程序启动就会存在多个虚拟机实例。程序退出或者关闭,则虚拟机实例消亡,多个虚拟机实例之间数据不能共享。 线程 这里所说的线程指程序执行过程中的一个线程实体。JVM 允许一个应用并发执行多个线程。Hotspot JVM 中的 Java 线程与原生操作系统线程有直接的映射关系。当线程本地存储、缓冲区分配、同步对象、栈、程序计数器等准备好以后,就会创建一个操作系统原生线程。Java 线程结束

操作系统7:内存管理

瘦欲@ 提交于 2020-02-09 23:13:42
内存管理 基本概念 内存管理主要分为连续区管理和非连续区管理 注意汇编语言也需要翻译下 ,但不是编译,因为它基本上就是一对一的翻译了下,比编译任务简单的多 base表示该进程的最小的地址位置,limit表示最大的 由存储管理单元在地址送往地址总线之前进行逻辑地址到物理地址的转换 : 两种方法可以实现运行时不将所有代码装入内存: 动态连接提供系统级的支持,操作系统升级时,动态链接库可以直接升级,不需要重新编译应用程序 存储管理的基本内存就是逻辑地址和物理地址之间的映射 交换 后备存储空间一般是一个单独划出的存储空间,要提供直接访问机制 来源: https://zhidao.baidu.com/question/72920995.html 内存交换(对换)的基本思想是,把处于等待状态(或在 CPU 调度原则下被剥夺运行权利) 的程序从内存移到辅存,把内存空间腾出来,这一过程又叫换出;把准备好竞争 CPU 运行的程序从辅存移到内存,这一过程又称为换入。   有关交换需要注意以下几个问题:   1、交换需要备份存储,通常是快速磁盘。它必须足够大,并且提供对这些内存映像的直接访问。   2、为了有效使用 CPU ,需要每个进程的执行时间比交换时间长,而影响交换时间的主要是转移时间。转移时间与所交换的内存空间成正比。   3、如果换出进程,必须确保该进程是完全处于空闲状态。   4

深入理解JVM之垃圾收集算法

 ̄綄美尐妖づ 提交于 2020-02-09 05:18:07
垃圾收集算法 1标记-清除算法(Mark-Sweep)   实现:先标记后清除   算法分为“标记”和“清除”两个阶段:首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象。   主要缺点:内存碎片   它的主要不足空间问题,标记清除之后会产生大量不连续的内存碎片,空间碎片太多可能会导致以后在程序运行过程中需要分配较大对象时,无法找到足够的连续内存而不得不提前触发另一次垃圾收集动作。 2复制算法(Copying) 一般用于新生代GC 优点:   避免内存碎片的问题。新生代GC使用此种算法,分为Eden:Survivor1:Survivor2=8:1:1 缺点: 1、存活对象较多时,复制效率低   2、不想浪费50%空间的话,需要有额外的空间担保 实现:   将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用过的内存空间一次清理掉。这样使得每次都是对整个半区进行内存回收,内存分配时也就不用考虑内存碎片等复杂情况,只要按顺序分配内存即可,实现简单,运行高效。只是这种算法的代价是将内存缩小为了原来的一半。 3标记-整理算法(Mark-Compact)   一般用于老年代GC   标记过程与“标记-清除”一样,首先标记出所有需要回收的对象,在标记完成后,后续步骤不是直接对可回收对象进行清理

操作系统知识点

无人久伴 提交于 2020-02-08 23:45:52
操作系统是什么 管理计算机硬件与软件资源的程序,是计算机系统的内核与基石 本质上是运行在计算机上的软件程序 为用户提供一个与系统交互的操作界面 分为内核与外壳,其中内核是能操作硬件的程序,而外壳则是围绕着内核的应用程序 进程调度算法 根据系统资源分配资源所规定的资源分配算法 先来先服务调度算法 FCFS调度算法每次从就绪队列中选择最先进入该队列的进程,将处理机分配给它,使之投入运行,直到完成或因某种原因而阻塞时才释放处理机。 不可剥夺算法。对长作业有利,对短作业不利。有利于CPU繁忙型作业,不利于I/O繁忙型作业 时间片轮转调度法 适用于分时系统 系统将所有就绪进程按到达时间的先后次序排成一个队列,进程调度程序总是选择就绪队列中第一个进程执行,即先来先服务的原则,但仅能运行一个时间片,如100ms。在使用完一个时间片后,即使进程并未完成其运行,它也必须释放出(被剥夺)处理机给下一个就绪的进程,而被剥夺的进程返回到就绪队列的末尾重新排队,等候再次运行。 时间片的大小对系统性能影响很大。如果时间片过短,则处理机在进程间过于频繁切换,处理机的开销增大;若过长,则退化为先来先服务算法 短进程优先调度算法 从就绪队列中选择一个估计运行时间最短的进程,将处理机分配给它,使之立即执行,直到完成或发生某事件而阻塞时,才释放处理机。 非抢占策略。但是长作业不利,不能保证紧迫性作业(进程)被及时处理