Memory pool (线程池) 与 malloc/free

什么是内存池

(Memory Pool)是一种内存分配方式。

内存池则是在真正使用内存之前,先申请分配一定数量的、大小相等(一般情况下)的内存块留作备用。当有新的内存需求时,就从内存池中分出一部分内存块,若内存块不够再继续申请新的内存。这样做的一个显著优点是,使得内存分配效率得到提升。

在内核中有不少地方内存分配不允许失败. 作为一个在这些情况下确保分配的方式, 内核开发者创建了一个已知为内存池(或者是 "mempool" )的抽象. 一个内存池真实地只是一类后备缓存, 它尽力一直保持一个空闲内存列表给紧急时使用.

malloc/free的缺点

通常我们习惯直接使用new、malloc等API申请分配内存,这些函数通常是线程安全的,可是,这样做的缺点在于:由于所申请内存块的大小不定,当频繁使用时会造成大量的内存碎片并进而降低性能(malloc/free函数会导致用户态和核态的切换,加锁解锁等操作)。

顺带马克一下好文:http://m.blog.csdn.net/blog/chhuach2005/23863625

时间: 2024-10-25 06:57:25

Memory pool (线程池) 与 malloc/free的相关文章

Linux线程池在服务器上简单应用

一.问题描述 现在以C/S架构为例,客户端向服务器端发送要查找的数字,服务器端启动线程中的线程进行相应的查询,将查询结果显示出来. 二.实现方案 1. 整个工程以client.server.lib组织,如下图所示: 2. 进入lib, socket.h.socket.c /** @file socket.h @brief Socket API header file TCP socket utility functions, it provides simple functions that h

C 实现有追求的线程池 后续

引言 -_- 还是老套路开局 很久以前写过一个有追求的线程池 -> C 实现有追求的线程池 探究 讲述的是一种思路, 并且实现了. 可以一用. 最近在详细搞simplec 框架. 准备发布个正式版. 刚好顺带优化一下这个线程池.优化的结果有如下几个方面. 1). 更加美观合理的api 2). pthread线程api 优化 3). 在解决惊群的基础上, 更进一步, 精度定位. 4). 增加了更多的安全性代码 扯淡一点, 线程池对于历史语言C, C++中应用的场景并不多. 可以用线程解决的, 都可

0726------Linux基础----------线程池

#ifndef __DEF_H__ #define __DEF_H__ #include <stddef.h> #include <pthread.h> #include <stdio.h> #define TRUE 1 #define FALSE 0 //任务结构体 typedef struct{ void (*thread_function_ptr_) (void*); void *arg_; }task_t; //队列结构体 typedef struct node

Linux线程池在server上简单应用

一.问题描写叙述 如今以C/S架构为例.client向server端发送要查找的数字,server端启动线程中的线程进行对应的查询.将查询结果显示出来. 二.实现方案 1. 整个project以client.server.lib组织.例如以下图所看到的: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2FuZ3poaWNoZW5nMTk4Mw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolv

简介Linux C的线程池

前言:前面有篇博客已经介绍了线程.线程的信号量和互斥锁,请参考博客:http://www.cnblogs.com/liudw-0215/p/8966645.html,接下来将介绍线程池. 一.理解 线程池能有效的处理多个线程的并发问题,避免大量的线程因为互相强占系统资源导致阻塞现象,能够有效的降低频繁创建和销毁线程对性能所带来的开销. 大多数的网络服务器,包括Web服务器都具有一个特点,就是单位时间内必须处理数目巨大的连接请求,但是处理时间却是比较短的.在传统的多线程服务器模型中是这样实现的:一

Mysql线程池优化笔记

Mysql线程池优化我是总结了一个站长的3篇文章了,这里我整理到一起来本文章就分为三个优化段了,下面一起来看看. Mysql线程池系列一(Thread pool FAQ) 首先介绍什么是mysql thread pool,干什么用的?使用线程池主要可以达到以下两个目的:1.在大并发的时候,性能不会因为过载而迅速下降.2.减少性能抖动 thread pool的工作原理?线程池使用分而治之的方法来限制和平衡并发性.与默认的thread_handling不同,线程池将连接和线程划分开,所以连接数量和执

线程池小结2

关于线程池的介绍,请看上一篇博客:http://www.cnblogs.com/DarrenChan/p/5774921.html 1. 线程池的5中创建方式 1) Single Thread Executor : 只有一个线程的线程池,因此所有提交的任务是顺序执行, 代码: Executors.newSingleThreadExecutor() 2)  Cached Thread Pool : 线程池里有很多线程需要同时执行,老的可用线程将被新的任务触发重新执行,如果线程超过60秒内没执行,那

java线程池分析和应用

比较 在前面的一些文章里,我们已经讨论了手工创建和管理线程.在实际应用中我们有的时候也会经常听到线程池这个概念.在这里,我们可以先针对手工创建管理线程和通过线程池来管理做一个比较.通常,我们如果手工创建线程,需要定义线程执行对象,它实现的接口.然后再创建一个线程对象,将我们定义好的对象执行部分装载到线程中.对于线程的创建.结束和结果的获取都需要我们来考虑.如果我们需要用到很多的线程时,对线程的管理就会变得比较困难.我们手工定义线程的方式在时间和空间效率方面会存在着一些不足.比如说我们定义好的线程

mysql线程池与连接池

线程池与连接池 连接池通常实现在Client端,是指应用(客户端)创建预先创建一定的连接,利用这些连接服务于客户端所有的DB请求.如果某一个时刻,空闲的连接数小于DB的请求数,则需要将请求排队,等待空闲连接处理.通过连接池可以复用连接,避免连接的频繁创建和释放,从而减少请求的平均响应时间,并且在请求繁忙时,通过请求排队,可以缓冲应用对DB的冲击.线程池实现在server端,通过创建一定数量的线程服务DB请求,相对于one-conection-per-thread的一个线程服务一个连接的方式,线程