看板 LinuxDev 關於我們 聯絡資訊
這幾天對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
dozer:什麼樣的應用會需要這種東西呀 11/16 11:52
andytzeng:個人認為,需要頻繁的 memory dynamic 動作時非常有用 12/27 02:04