亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 1179 | 回復: 3
打印 上一主題 下一主題

[內核入門] 關于SLUB分配器的一個疑惑 [復制鏈接]

論壇徽章:
0
跳轉到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2015-12-07 20:04 |只看該作者 |倒序瀏覽
本帖最后由 626788149 于 2015-12-08 11:37 編輯

問題已經(jīng)解決。




最近一直在寫操作系統(tǒng),寫到內存管理那塊了。想實現(xiàn)一個SLUB分配器。
差不多實現(xiàn)完成了,不過出現(xiàn)了SMP的同步問題,還沒被釋放的對象可能會被分配出去,我差不多是按照linux的SLUB系統(tǒng)寫的。
如果在SLUB分配接口加上一把大鎖,同步問題就不會出現(xiàn)。

我一直沒看懂第27行。
c->page->inuse = c->page->objects;  

可能同步問題跟inuse這個值有關。

誰能告訴我c->page->inuse = c->page->objects; 這行是啥意思?
  1. static void *__slab_alloc(struct kmem_cache *s, gfp_t gfpflags, int node,  
  2.               unsigned long addr, struct kmem_cache_cpu *c)  
  3. {  
  4.     void **object;  
  5.     struct page *new;  
  6.   
  7.     /* We handle __GFP_ZERO in the caller */  
  8.     gfpflags &= ~__GFP_ZERO;  
  9.   
  10.     if (!c->page)/*本地CPU的slab結構中沒有存儲可分配的內存,則要為其尋找新的slab*/  
  11.         goto new_slab;  
  12.   
  13.     slab_lock(c->page);  
  14.     if (unlikely(!node_match(c, node)))//節(jié)點不匹配   
  15.         goto another_slab;  
  16.   
  17.     stat(c, ALLOC_REFILL);  
  18.   
  19. load_freelist:  
  20.     object = c->page->freelist;//獲取一個對象   
  21.     if (unlikely(!object))  
  22.         goto another_slab;  
  23.     if (unlikely(SLABDEBUG && PageSlubDebug(c->page)))  
  24.         goto debug;  
  25.   
  26.     c->freelist = object[c->offset]; //更新freelist   
  27.     c->page->inuse = c->page->objects;  
  28.     /*一旦slab從partial slab鏈表轉移到本地CPU,則page_freelist不再負責維護空閑對象了,
  29.       因此設為NULL*/  
  30.     c->page->freelist = NULL;  
  31.     c->node = page_to_nid(c->page);  
  32. unlock_out:  
  33.     slab_unlock(c->page);  
  34.     stat(c, ALLOC_SLOWPATH);  
  35.     return object; //返回對象   
  36.   
  37. another_slab:  
  38.     deactivate_slab(s, c);//將本地CPU的slab移回partial slab鏈表   
  39.   
  40. new_slab:  
  41.     /*從partial slab鏈表中尋找一個slab*/  
  42.     new = get_partial(s, gfpflags, node);  
  43.     if (new) {/*獲取成功則直接將該slab交給本地CPU*/  
  44.         c->page = new;  
  45.         stat(c, ALLOC_FROM_PARTIAL);  
  46.         goto load_freelist;  
  47.     }  
  48.   
  49.     if (gfpflags & __GFP_WAIT)  
  50.         local_irq_enable();  
  51.   
  52.     /*如果partial slab鏈表中已無法獲取slab則創(chuàng)建新的slab*/  
  53.     new = new_slab(s, gfpflags, node);  
  54.   
  55.     if (gfpflags & __GFP_WAIT)  
  56.         local_irq_disable();  
  57.   
  58.     if (new) {//創(chuàng)建成功   
  59.         c = get_cpu_slab(s, smp_processor_id());//獲取本地CPU的slab信息結構   
  60.         stat(c, ALLOC_SLAB);  
  61.         if (c->page)//本地CPU中存在slab,則移除該slab   
  62.             flush_slab(s, c);  
  63.         slab_lock(new);  
  64.         __SetPageSlubFrozen(new);//凍結slab,表明slab處于本地CPU中   
  65.         c->page = new;//本地CPU中的slab設置為新創(chuàng)建的slab   
  66.         goto load_freelist;  
  67.     }  
  68.     if (!(gfpflags & __GFP_NOWARN) && printk_ratelimit())  
  69.         slab_out_of_memory(s, gfpflags, node);  
  70.     return NULL;  
  71. debug:  
  72.     if (!alloc_debug_processing(s, c->page, object, addr))  
  73.         goto another_slab;  
  74.   
  75.     c->page->inuse++;  
  76.     c->page->freelist = object[c->offset];  
  77.     c->node = -1;  
  78.     goto unlock_out;  
  79. }
復制代碼

論壇徽章:
20
程序設計版塊每日發(fā)帖之星
日期:2015-08-17 06:20:00程序設計版塊每日發(fā)帖之星
日期:2016-07-16 06:20:00程序設計版塊每日發(fā)帖之星
日期:2016-07-18 06:20:00每日論壇發(fā)貼之星
日期:2016-07-18 06:20:00黑曼巴
日期:2016-12-26 16:00:3215-16賽季CBA聯(lián)賽之江蘇
日期:2017-06-26 11:05:5615-16賽季CBA聯(lián)賽之上海
日期:2017-07-21 18:12:5015-16賽季CBA聯(lián)賽之青島
日期:2017-09-04 17:32:0515-16賽季CBA聯(lián)賽之吉林
日期:2018-03-26 10:02:16程序設計版塊每日發(fā)帖之星
日期:2016-07-15 06:20:0015-16賽季CBA聯(lián)賽之江蘇
日期:2016-07-07 18:37:512015亞冠之薩濟拖拉機
日期:2015-08-17 12:21:08
2 [報告]
發(fā)表于 2015-12-08 16:48 |只看該作者
大概是說page上的objects全被使用了(處于frozen狀態(tài)?)
或者說,page上剩余的objects全部被本地cache接管了。

論壇徽章:
0
3 [報告]
發(fā)表于 2015-12-08 17:47 |只看該作者
回復 2# nswcfd


    謝謝您的回復,我已經(jīng)想通了,差不多就是您說的意思

論壇徽章:
0
4 [報告]
發(fā)表于 2015-12-08 21:27 |只看該作者
通俗講,如果c->page->objects大于0,則c->page->inuse為真,否則就為0了。
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復

  

北京盛拓優(yōu)訊信息技術有限公司. 版權所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關心和支持過ChinaUnix的朋友們 轉載本站內容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP