<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      GlusterFS之內存池(mem-pool)使用實例分析

      我的新浪微博:http://weibo.com/freshairbrucewoo

      歡迎大家相互交流,共同提高技術。

       

      上一篇博客詳細分析了GlusterFS之內存池的實現技術,今天我們看看GlusterFS是怎么使用這個技術的。

      第一步:分配和初始化:

      cli進程在初始化的過程中會涉及到內存池的建立和初始化,具體涉及到內存池初始化的代碼如下(在cli.c文件中的glusterfs_ctx_defaults_init函數):

       1 /* frame_mem_pool size 112 * 64 */  
       2 pool->frame_mem_pool = mem_pool_new (call_frame_t, 32);//為調用針對象分配內存池對象,對象類型是call_frame_t,32個這樣的內存塊  
       3 if (!pool->frame_mem_pool)  
       4         return -1;  
       5   
       6 /* stack_mem_pool size 256 * 128 */  
       7 pool->stack_mem_pool = mem_pool_new (call_stack_t, 16);//為調用堆棧對象分配內存池對象,對象類型是call_stack_t,16個這樣的內存塊  
       8   
       9 if (!pool->stack_mem_pool)  
      10         return -1;  
      11   
      12 ctx->stub_mem_pool = mem_pool_new (call_stub_t, 16);  
      13 if (!ctx->stub_mem_pool)  
      14         return -1;  
      15   
      16 ctx->dict_pool = mem_pool_new (dict_t, 32);  
      17 if (!ctx->dict_pool)  
      18         return -1;  
      19   
      20 ctx->dict_pair_pool = mem_pool_new (data_pair_t, 512);  
      21 if (!ctx->dict_pair_pool)  
      22         return -1;  
      23   
      24 ctx->dict_data_pool = mem_pool_new (data_t, 512);  
      25 if (!ctx->dict_data_pool)  
      26         return -1;  

       

      由上面的代碼可以看出:集合系統中各種結構體對象可能實際會用到的數量來預先分配好,真正需要為對象內存的時候直接從這些內存池中取就可以了,用完之后又放回內存池,這樣減少了分配和釋放內存的額外系統開銷,分配內存往往需要從用戶態到內核態切換,這些都是很耗時間的,當然相同的對象還減少了初始化的時間。

       

      代碼分配內存調用的函數是mem_pool_new,而不是在上一篇博客結束的mem_pool_new_fn函數,那是因為mem_pool_new是定義的宏函數,就是調用mem_pool_new_fn函數,函數參數分別表示對象所占內存大小、數量和名稱(為分配的內存起一個名字,就是對象的名稱);

       

      1 #define mem_pool_new(type,count) mem_pool_new_fn (sizeof(type), count, #type)  

       

      第二步:從內存池中取出一個對象內存塊:

       

      1 call_stub_t *new = NULL;  
      2   
      3 GF_VALIDATE_OR_GOTO ("call-stub", frame, out);  
      4   
      5 new = mem_get0 (frame->this->ctx->stub_mem_pool);//從內存池中拿出一個對象內存塊  

       

      如下面代碼取出一個調用存根的對象內存塊(call_stub_t):

       

       

      同樣使用的函數不是我們介紹的mem_get,而是mem_get0函數,mem-get0封裝了mem_get,做參數判斷并且把需要使用的內存初始化為0,代碼如下:

       

       1 void*  
       2 mem_get0 (struct mem_pool *mem_pool)  
       3 {  
       4         void             *ptr = NULL;  
       5   
       6         if (!mem_pool) {  
       7                 gf_log_callingfn ("mem-pool", GF_LOG_ERROR, "invalid argument");  
       8                 return NULL;  
       9         }  
      10   
      11         ptr = mem_get(mem_pool);//得到一個內存對象塊  
      12   
      13         if (ptr)  
      14                 memset(ptr, 0, mem_pool->real_sizeof_type);//初始化0  
      15   
      16         return ptr;  
      17 }  

       

       

      第三步:放回對象內存塊到內存池中:

      當我們使用完一個對象以后就會重新放回內存池中,例如還是以調用存根對象(call_stub_t)

       

       1 void  
       2 call_stub_destroy (call_stub_t *stub)  
       3 {  
       4         GF_VALIDATE_OR_GOTO ("call-stub", stub, out);  
       5   
       6         if (stub->wind) {  
       7                 call_stub_destroy_wind (stub);  
       8         } else {  
       9                 call_stub_destroy_unwind (stub);  
      10         }  
      11   
      12         stub->stub_mem_pool = NULL;  
      13         mem_put (stub);//放回對象內存塊到內存池中  
      14 out:  
      15         return;  
      16 }  

       

      第四步:銷毀內存池:

      如果整個內存池對象都不需要了,那么銷毀掉這個內存池,實現這個功能的函數是mem_pool_destroy:

       

       1 void  
       2 mem_pool_destroy (struct mem_pool *pool)  
       3 {  
       4         if (!pool)  
       5                 return;  
       6   
       7         gf_log (THIS->name, GF_LOG_INFO, "size=%lu max=%d total=%"PRIu64,  
       8                 pool->padded_sizeof_type, pool->max_alloc, pool->alloc_count);  
       9   
      10         list_del (&pool->global_list);//從全局內存池對象中拖鏈  
      11   
      12         LOCK_DESTROY (&pool->lock);//銷毀鎖  
      13         GF_FREE (pool->name);//釋放名字占用的內存  
      14         GF_FREE (pool->pool);//釋放內存池分配的內存,就是提供給用戶使用的那一段內存  
      15         GF_FREE (pool);//釋放內存池對象占用的內存  
      16   
      17         return;  
      18 }  

       

       

      一般情況下內存池對象會在程序退出的時候才會釋放和銷毀,還有一種情況是臨時分配的內存池也有可能在系統運行期間釋放和銷毀,因為不能保證一個預先分配的內存池就能夠滿足整個系統運行期間那個對象所需要的內存,可能在每一個階段這個對象使用特別多,以至于把內存池預先分配的對象內存塊使用完了,這時就需要臨時分配內存池對象,過了這一段時間可能這個對象需要的個數就減少了,這時就需要釋放掉臨時分配的,已還給系統內存。

       

      OK!內存池管理技術是提供內存使用率和效率的重要手段,Glusterfs使用的內存池技術采用的是linux內核管理小內存塊的分配算法slab,就是基于對象分配內存的技術。可以先去熟悉slab的原理,就能更好的理解Glusterfs的內存池技術了!

      posted @ 2012-04-28 14:39  薔薇理想人生  閱讀(3394)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 午夜精品极品粉嫩国产尤物| 影音先锋啪啪av资源网站| 中文字幕第一页亚洲精品| 国产精品国产三级国AV | 精品国产丝袜自在线拍国语| 亚洲av永久无码精品天堂久久| 好吊视频一区二区三区| 久久久久蜜桃精品成人片公司| 临高县| 一个色综合亚洲热色综合| 国产精品久久国产精麻豆99网站 | 久久久久国色av免费观看性色 | 蜜臀久久精品亚洲一区| 1区2区3区4区产品不卡码网站| 欧美精品国产综合久久| 亚洲欧美人成人让影院| 国内精品伊人久久久久777| 久久青草国产精品一区| japanese无码中文字幕| 成人亚洲av免费在线| 悠悠人体艺术视频在线播放| 国产欧美日韩在线在线播放| 日韩高清在线亚洲专区不卡| 国产精品视频中文字幕| 偷拍精品一区二区三区| 国模冰莲自慰肥美胞极品人体图| 日韩一区二区三区精品区| 波多野结衣久久一区二区| 边添小泬边狠狠躁视频| 麻豆一区二区中文字幕| 亚洲av永久无码天堂影院| 黑色丝袜脚交视频麻豆| 国产精品SM捆绑调教视频| 国产精品无码一区二区三区电影| 精品国产精品午夜福利| 国精品91人妻无码一区二区三区 | 丁香花成人电影| 成全世界免费高清观看| 国产一区二区三区我不卡| 成年在线观看免费人视频| 四虎成人在线观看免费|