[LIB ] memory pooling (libapr)
這幾天對libapr稍為好奇了一下:)
大致上試用了一下memory pooling的功能。
libapr - apache portable runtime
是一整組c/cpp用的library
<%
The mission of the Apache Portable Runtime (APR) project is to create and
maintain software libraries that provide a predictable and consistent
interface to underlying platform-specific implementations. The primary goal
is to provide an API to which software developers may code and be assured of
predictable if not identical behaviour regardless of the platform on which
their software is built, relieving them of the need to code special-case
conditions to work around or take advantage of platform-specific deficiencies
or features.
%>
簡單的來講,就是提供一套library讓c/cpp在做port到各平台時
所產生的疼痛達到最小的目的
============================================================ 謎樣的分隔線 =
而什麼是memory pool
http://en.wikipedia.org/wiki/Memory_pool
簡單說,我們雖然可以在需要memory時用malloc/new等方式即時取得。但是在配置記憶
體的代價(程式與系統要資源的溝通時間與轉手的時間)仍是不容小覷,所以較有效率的
方法是事件配置一大塊memory,在需要的時候直接由這些區塊中取用。在沒有超過預設
配置大小的前提下,與系統打交道的時間應該只剩預配與交還的時間:)
============================================================ 謎樣的分隔線 =
請先準備材料:
a your favorite editor (or ide)
c/cpp compiler
install libapr
============================================================ 謎樣的分隔線 =
一點使用前先講的小[常]識,在用libapr時,不管你要做什麼之前一定要先呼叫:
rect = apr_initialize ();
他有一個傳回值,type是apr_status_t
可以用下列判斷成功與否
if (rect != APR_SUCCESS)
{
assert (0);
return -1;
}
用完了之後要叫一下:
apr_terminate ();
============================================================ 謎樣的分隔線 =
為了使我們compile順利,請先查一下你的header與lib放在那叫什麼名字
依俺的為例
header file在/usr/include/apr-0目錄下
lib在/usr/lib/libapr-0.a (依國際慣例-l要填淺藍的部分lib(.*).a)
為了避免出現極為可怕的#include
所以俺決定偷懶一下,寫了一個簡單的makefile
qrtt1@ubuntu:~/test/apr$ cat makefile
CFLAG = -I /usr/include/apr-0
LIB = -lapr-0
CC = g++
test:
$(CC) $(CFLAG) $(LIB) test.c
============================================================ 謎樣的分隔線 =
#include <apr.h>
#include <apr_general.h>
#include <stdio.h>
#include <assert.h>
#include <apr_pools.h>
apr_status_t rect;
int
main ()
{
rect = apr_initialize ();
if (rect != APR_SUCCESS)
{
assert (0);
return -1;
}
/* create memory pool. */
// 宣告一下pool用的type
// apr的type都是以_t為suffix
// 開頭是apr_這是傳統的c name space慣例
apr_pool_t *mem;
// 配置記憶體"池", 第二個參數是parent :)
// 因為apr的設計, pool是有階層性的,所以只要祖先有人被回起來了
// 下面的小人、小小人都會被收起來,這裡填NULL是因為沒有parent
rect = apr_pool_create (&mem, NULL);
if (rect != APR_SUCCESS)
{
assert (0);
return -1;
}
char *buf;
// 跟pool要記憶體
buf = (char *) apr_palloc (mem, 1024);
// 試看看會不會segment fault
for (int i = 0; i < 1024; i++)
{
buf[i] = i + 3;
printf ("%d ", (int) buf[i]);
}
// 用完了,丟棄他、催毀他 :)
apr_pool_destroy (mem);
// 結束時要跟apr講一聲 拜
apr_terminate ();
return 0;
}
============================================================ 謎樣的分隔線 =
btw. 看教學文件講,pool預設大小是8K,並設pool的設計不是用來大量的存取的
所以您如果有"一秒鐘幾十萬上下"的大事業可能還是用mmap比較好呦
REFERENCE
1. APR project
http://apr.apache.org/
2. APR api doc
:: Memory Pool Functions
http://apr.apache.org/docs/apr/group__apr__pools.html
:: MMAP (Memory Map) Routines
http://apr.apache.org/docs/apr/group__apr__mmap.html
3. tutorials
:: Programming with Memory Pools (for svn hacker)
http://svnbook.red-bean.com/en/1.1/ch08s05.html
:: libapr tutorial - memory mapping
http://dev.ariel-networks.com/apr/apr-tutorial/html/apr-tutorial-11.html
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 210.59.94.3
推
11/16 11:52, , 1F
11/16 11:52, 1F
推
12/27 02:04, , 2F
12/27 02:04, 2F
LinuxDev 近期熱門文章
PTT數位生活區 即時熱門文章