Deprecated: The each() function is deprecated. This message will be suppressed on further calls in /home/zhenxiangba/zhenxiangba.com/public_html/phproxy-improved-master/index.php on line 456
$B%a%b%j4IM}!"(BBuddy$B%7%9%F%`!"(Bkmalloc$B!"%9%i%V%"%m%1!<%?(B
[go: Go Back, main page]

$B%a%b%j4IM}!"(BBuddy$B%7%9%F%`!"(Bkmalloc$B!"%9%i%V%"%m%1!<%?(B

					2012$BG/(B01$B7n(B17$BF|(B
$B>pJs2J3XN`(B $B%*%Z%l!<%F%#%s%0%7%9%F%`(B II

                                       $BC^GHBg3X(B $B%7%9%F%`>pJs9)3X8&5f2J(B 
                                       $B%3%s%T%e!<%?%5%$%(%s%9@l96(B, $BEE;R!&>pJs9)3X7O(B
                                       $B?7>k(B $BLw(B
                                       <yas@is.tsukuba.ac.jp>

$B$3$N%Z!<%8$O!" http://www.coins.tsukuba.ac.jp/~yas/coins/os2-2011/2012-01-17
$B$"$k$$$O!" http://www.coins.tsukuba.ac.jp/~yas/
http://www.cs.tsukuba.ac.jp/~yas/

$B"#:#F|$NBg;v$JOC(B

$B"#%a%b%j4IM}(B

$B"!L\I8(B

$B
  • __free_pages(page,order)
  • free_pages(addr, order)
  • free_page(addr)
    linux-3.1.3/include/linux/gfp.h
    
     296:	static inline struct page *
     297:	__alloc_pages(gfp_t gfp_mask, unsigned int order,
     298:	                struct zonelist *zonelist)
    
     344:	extern unsigned long __get_free_pages(gfp_t gfp_mask, unsigned int order);
    
     324:	static inline struct page *
     325:	alloc_pages(gfp_t gfp_mask, unsigned int order)
    
     358:	extern void __free_pages(struct page *page, unsigned int order);
     359:	extern void free_pages(unsigned long addr, unsigned int order);
     363:	#define free_page(addr) free_pages((addr), 0)
    

    $B"!(Bgfp_t gfp_mask

    __get_free_pages(), alloc_pages(), alloc_page() $B$d!"(B $B8e=R$9$k(B kmalloc() $B$G$O!"(B gfp_t $B$N%U%i%0(B(gfp_mask) $B$H$7$F!" $B7?(B $B@bL@(B GFP_ATOMIC $B9bM%@hEY!#%9%j!<%WIT2D!#3d9~$_%O%s%I%i$d2J,(B(bottom half)$B$G;H$&!#(B GFP_NOIO $B%9%j!<%W2D!"F~=PNOIT2D!#(B GFP_NOFS $B%9%j!<%W2=!"F~=PNO2D!"%U%!%$%kA`:nIT2D!#%U%!%$%k%7%9%F%`$N$N%U%!%$%k%7%9%F%`$NA`:n$r3+;O$7$J$$(B)$B!#(B GFP_KERNEL $B%+!<%M%kMQ%a%b%jDL>o$NJ}K!!#%9%j!<%W2D!#%f!<%6!&%W%m%;%9$N%3%s%F%-%9%H$G;H$&!#(B GFP_USER $B%f!<%66u4VMQ$N%a%b%j$NDL>o$NJ}K!!#%9%j!<%W2D!#(B GFP_HIGHUSER HIGHMEM$B%>!<%s$+$i$N3dEv$F!#%9%j!<%W2D!#(B GFP_DMADMA$B%>!<%s$+$i$N3dEv$F!#%G%P%$%9!&%I%i%$%PEy$,;H$&!#(B $B$3$N$h$&$J%U%i%0$,B8:_$9$k:G$b=EMW$JM}M3$O!"%9%j!<%W$9$k2DG=@-$,$"$k$+(B $B$J$$$+$N0c$$!#(B $B$=$NB>$K!"$I$N%>!<%s$+$i%a%b%j$r3d$jEv$F$k$Y$-$+$rI=$9$b$N$,$"$k!#(B

    $B"!30It%U%i%0%a%s%F!<%7%g%s(B

    $BJ*M}%U%l!<%`$N3dEv$F$H3+J|$r7+$jJV$7$F$$$/$H!"30It%U%i%0%a%s%F!<%7%g%s(B (external fragmentation) $B$,@8$8$k!#A4BN$H$7$F$O6u$-%a%b%j$OB8:_$7$F$$$k(B $B$N$K!">.$5$J%a%b%j!&%U%l!<%`$,$"$A$3$A$KJ,;6$7$F$$$F!"Bg$-$5$N%Z!<%8%U(B $B%l!<%`$,B8:_$7$J$$$?$a$K%a%b%j$,3d$jEv$F$i$l$J$$>uBV$K4Y$k!#(B

    $B"!(BBuddy$B%7%9%F%`(B

    $B!V(BBuddy $B%7%9%F%`!W$O!"(BLinux $B$G;H$o$l$F$$$k30It%U%i%0%a%s%F!<%7%g%s$r5/(B $B$3$7$K$/$$%a%b%j3dEv$F%"%k%4%j%:%`!#(B
    • $BMxMQ2DG=$J%a%b%j!&%V%m%C%/$N%j%9%H$r4IM}$9$k!#(B $B%j%9%H$N?t$O!"(BMAX_ORDER$B8D!#(B
    • $B3F%j%9%H$O!"(B2$B$N$Y$->h$NBg$-$5$N%a%b%j!&%V%m%C%/$rJ];}$9$k(B( 2 0, 2 1, 2 2, ..., 2 (MAX_ORDER-1), )$B!#(B
    • $B%Z!<%8%U%l!<%`$N3dEv$F(B(alloc_pages())$B$G$O!"(B $BI,MW$J:G>.$N%a%b%j!&%V%m%C%/$r3d$jEv$F$k!#(B($BBg$-$J%V%m%C%/$r29B8$9$k!#(B) 2 order $B$,M_$7$$;~$K!"(B $B$=$N%a%b%j$,$"$l$P!"$=$l$rJV$9!#(B $B$J$1$l$P!"(B2 order+1 $B$rC5$7$F!"$=$l$r(B $BH>J,$KJ,3d$7$F!"JV$9!#(B $B!J;H$o$J$+$C$?J,$O!"(B2 order $B$N%j%9%H$K$D$J$0!#!K(B
    • $B%Z!<%8%U%l!<%`$N3+J|(B(__free_pages())$B$G$O!"(B 2 order $B$N%5%$%:$N%V%m%C%/$rMxMQ2DG=$J%j%9%H$K@\B3$9$k!#(B $BF1$8Bg$-$5$N%V%m%C%/$NCf$GO"B3$7$F$$$k$b$N(B(buddy)$B$,$J$$$+$rC5$9!#(B $B$"$l$P!"7k9g$7$FBg$-$J%V%m%C%/(B(2 (order+1)) $B$K$7$F%j%9%H$K@\B3$9$k!#(B

    zone$B!

    $B?^(B1(a) Buddy$B%7%9%F%`$K$h$k6u$-%Z!<%8$N4IM}(B($BO@M}E*$J8+J}(B)

    zone$B!

    $B?^(B1(b) Buddy$B%7%9%F%`$K$h$k6u$-%Z!<%8$N4IM}(B($B@~7A$J8+J}(B)

    $B"!(BBuddy$B%7%9%F%`$N>uBV(B

    /proc/buddyinfo $B$r8+$k$H!"8=:_$N6u$-%Z!<%8$N>uBV$,J,$+$k!#(B
    % cat /proc/buddyinfo [$B
    Node 0, zone      DMA      6      5      3      3      4      2      2      0      1      1      2 
    Node 0, zone   Normal    476   2577    990    354    174    104     65     34     19      1    135 
    Node 0, zone  HighMem   1416   2920   1718   1082    933    504    251    152     87     43     53 
    % []
    
    $B$3$NNc$G$O!"(BDMA $B%>!<%s$N(B 2 0 (4KB) $B$K!"(B6 $B8D!"(B 2 1 (8KB) $B$K!"(B5 $B8D!"!&!&!&!"(B2 10 $B$K(B2$B8D$N6u$-$,$"$k!#(B $B30It%U%i%0%a%s%F!<%7%g%s$,5/$-$k$H!"Bg$-$J2t$,>/$J$/$J$k!#(B

    $B"#(Bkmalloc$B$H(Bkfree

    $BJ*M}%a%b%j$O!"%Z!<%8C10L!J(B4KB$B$N%Z!<%8%U%l!<%`C10L!K$G4IM}$7$F$$$k!#(B $B$7$+$7!"%+!<%M%kFb$N%G!<%?9=B$$O!"(B4KB $B$K$T$C$?$j$O$^$i$J$$!#(B Linux $B$G%Z!<%8C10L$G$O$J$$C10L$G%a%b%j$r3NJ]!&3+J|$G$-$k$K$O!"
  • kmalloc(), kfree(): malloc(), free() $B$HN`;w$N(B API
  • $B%9%i%V!&%"%m%1!<%?(B

    $B"!(Bkmalloc()

    C$B8@8l$N%f!<%66u4V$G;H$($k%i%$%V%i%j(B malloc() $B$K;w$F$$$k!#(B
    void *kmalloc(size_t size, gfp_t flags)
    
    $B0z?t(B $B7k2L(B: $B:GDc8B!"(Bsize $BJ,$N%a%b%j$r3d$jEv$F!"$=$N@hF,$NHVCO!J%+!<%M%kFb$N2>(B $BA[%"%I%l%9!K$rJV$9!#3d$jEv$F$i$l$?%a%b%j$O!"J*M}E*$K$bO"B3$K$J$k!#3dEv(B $B$F$G$-$J$$;~$K$O!"(BNULL $B$rJV$9!#(B

    $B"!(Bkmalloc()$B$N%U%i%0$NA*Br(B

    $B"!(Bkfree()

    void kfree(const void *objp)
    
    C$B8@8l$N%f!<%66u4V$G;H$($k%i%$%V%i%j(B free() $B$H;w$F$$$k!#(B kmalloc() $B$G3d$jEv$F$?%a%b%j$r2rJ|$9$k!#(B

    $B"!(Bvmalloc()$B$H(Bvfree()

    kmallc()/kfree() $B$H;w$F$$$k$,!"3d$jEv$F$i$l$k%a%b%j$OJ*M}E*$KO"B3$7$F$$(B $B$kJ]>Z$O$J$$!#!J%+!<%M%k6u4V$N2>A[%"%I%l%9$H$7$F$OO"B3$7$F$$$k!#!K(B

    $B"#%9%i%V%"%m%1!<%?(B(slab allocator)

    $BF1$8Bg$-$5$N9=B$BN$r3d$jEv$F$k;~$K;H$&!#(B kmalloc(), kfree() $B$h$j$b!"8zN($,$h$$!#(B

    $B"!(Bfree list$BJ}<0$H$=$NLdBjE@(B

    $B9=B$BN$N3dEv$F$K$O!"(Bfree list $BJ}<0$,;H$o$l$k$3$H$b$"$k!#(B $B$3$NJ}K!$G$O!"%a%b%j$K6u$-$,$"$C$F$b!"2rJ|$G$-$k$+4JC1$K$O$o$+$i$J$$!#(B

    free list$B!

    $B?^(B? $B%U%j!<%j%9%H$NNc(B

    $B%*%V%8%'%/%H$O!"(B1$B%Z!<%8$K(B2$B8DF~$k!#(B $B%*%V%8%'%/%H$,
  • object 2
  • object 6
  • object 3
  • object 1

    free list$B!

    $B?^(B? $B%U%j!<%j%9%H$NNc(B($B%Z!<%8$r0U<1(B)

    object 2 $B$H(B object 3 $B$NItJ,$O!"(B1$B%Z!<%86u$$$F$$$k!#(B

    $B"!%9%i%V!&%"%m%1!<%?$NL\I8(B

    $B%9%i%V!&%"%m%1!<%?<+?H$O!"(Balloc_pages() $BEy$N%Z!<%8C10L$N%a%b%j3dEv$F(B $B5!G=$r8F=P$7$F%a%b%j$r3NJ]$9$k!#(B

    $B"!%Z!<%8!&%U%l!<%`!"%9%i%V!"%*%V%8%'%/%H$N4X78(B

    $B%Z!<%8%U%l!<%`#3$D!

    $B?^(B? $B%Z!<%8!&%U%l!<%`!"%9%i%V!"%*%V%8%'%/%H$N4X78(B

    $B"!(Bkmem_cache_create()

    struct kmem_cache *
    kmem_cache_create (const char *name, size_t size, size_t align,
            unsigned long flags, void (*ctor)(void *))
    
    $B0z?t(B $B7k2L(B: $B@.8y$7$?;~$K$O!"(Bstruct kmem_cache $B$X$N%]%$%s%?!#(B $B<:GT$9$k$H(BNULL$B!#?7$7$$%Z!<%8$,3d$jEv$F$i$l$?;~$K$O!"(Bctor $B$G(B $B;XDj$5$l$?4X?t$,8F$P$l$k!#(B

    $B"!(Bkmem_cache_destroy()

    void kmem_cache_destroy(struct kmem_cache *c)
    
    kmem_cache_create() $B$G3d$jEv$F$?(B struct kmem_cache *$B$r3+J|$9$k!#(B shutdown ($BEE8;$r@Z$kA`:n(B)$B$G8F$P$l$k$3$H$,$"$k!#(B

    $B"!(Bkmem_cache_alloc()$B$H(Bkmem_cache_free()

    void *kmem_cache_alloc(struct kmem_cache *cachep, gfp_t flags)
    
    void *kmem_cache_alloc_node(struct kmem_cache *cachep,gfp_t flags, int node)
    
    void kmem_cache_free(struct kmem_cache *cachep, void *b)
    
    $B@8@.$7$?(B struct kmem_cache *$B$r;H$C$F%*%V%8%'%/%H$N%a%b%j$r3d$jEv$F$k!#(B $B3d$jEv$F$?%*%V%8%'%/%H$N%a%b%j$O!"(Bkmem_cache_free()$B$G3+J|$9$k!#(B

    kmem_cache_alloc_node() $B$O!"%a%b%j!&%"%/%;%9$,IT6Q$B"!MxMQNc(B(task_struct)

    linux-3.1.3/kernel/fork.c
    
     115:	static struct kmem_cache *task_struct_cachep;
    ...
     210:	void __init fork_init(unsigned long mempages)
     211:	{
    ...
     217:	        task_struct_cachep =
     218:	                kmem_cache_create("task_struct", sizeof(struct task_struct),
     219:	                        ARCH_MIN_TASKALIGN, SLAB_PANIC | SLAB_NOTRACK, NULL);
    ...
     242:	}
    
     111:	# define alloc_task_struct_node(node)           \
     112:	                kmem_cache_alloc_node(task_struct_cachep, GFP_KERNEL, node)
     113:	# define free_task_struct(tsk)                  \
     114:	                kmem_cache_free(task_struct_cachep, (tsk))
    

    $B"!(B/proc/slabinfo

    /proc/slabinfo $B$r8+$k$H!"%9%i%V%"%m%1!<%?$N>uBV$,$o$+$k!#(B

    % cat /proc/slabinfo  [$B
    slabinfo - version: 2.0
    # name            <active_objs> <num_objs> <objsize> <objperslab> <pagesperslab> : tunables <batchcount> <limit> <sharedfactor> : slabdata <active_slabs> <num_slabs> <sharedavail>
    ip_conntrack_expect      0      0    256   15    1 : tunables  120   60    8 : slabdata      0      0      0
    ip_conntrack          22     50    384   10    1 : tunables   54   27    8 : slabdata      5      5      0
    nfs_direct_cache       0      0     68   58    1 : tunables  120   60    8 : slabdata      0      0      0
    nfs_write_data        36     42    512    7    1 : tunables   54   27    8 : slabdata      6      6      0
    ...
    task_struct           84    115   1408    5    2 : tunables   24   12    8 : slabdata     23     23      0
    anon_vma             767   1130     16  226    1 : tunables  120   60    8 : slabdata      5      5      0
    pgd                   54    238     32  119    1 : tunables  120   60    8 : slabdata      2      2      0
    pmd                  123    123   4096    1    1 : tunables   24   12    8 : slabdata    123    123      0
    size-131072(DMA)       0      0 131072    1   32 : tunables    8    4    0 : slabdata      0      0      0
    size-131072            0      0 131072    1   32 : tunables    8    4    0 : slabdata      0      0      0
    size-65536(DMA)        0      0  65536    1   16 : tunables    8    4    0 : slabdata      0      0      0
    size-65536             2      2  65536    1   16 : tunables    8    4    0 : slabdata      2      2      0
    ...
    size-32             8314   8925     32  119    1 : tunables  120   60    8 : slabdata     75     75      0
    kmem_cache           150    150    256   15    1 : tunables  120   60    8 : slabdata     10     10      0
    % []
    
    $B%9%i%V!&%"%m%1!<%?$K$O!"#2
  • $B@lMQ!#$?$H$($P!"(Btask_struct $B$J$i!"(Bsizeof(struct task_struct) $B$H$7$F%-%c%C%7%e$KJ]B8!#(B $BA0H>$KI=<($5$l$k!#(B
  • $BHFMQ!#$$$/$D$+$NBg$-$5$N%a%b%j!#(B32$B!"(B64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768, 65536, 131072$B!#(B $B8eH>$N(B size-$BHV9f(B $B!#(B DMA $B$,IU$$$F$$$k$b$N$O!"(BDMA $B2DG=$J%a%b%j!#(B

    $B"#%/%$%:(B4 $B%a%b%j4IM}!"(BBuddy$B%7%9%F%`!"(Bkmalloc$B!"%9%i%V%"%m%1!<%?(B

    $B!zLdBj(B(401) struct page

    struct page$B$NBg$-$5$O!"%"!<%-%F%/%A%c$d%3%s%Q%$%k;~$N%*%W%7%g%s$K$h$C$F(B $B0[$J$k!#$"$k%7%9%F%`$G!"(Bstruct page$B$NBg$-$5$,(B 40 $B%P%$%H$G$"$C$?$H$9$k!#(B $B$=$N%7%9%F%`$K!"(B1GB $B$N%a%b%j$,Ek:\$5$l$F$$$?;~!"(Bstruct page$B$N$?$a$K!"2?(B MB$B$N%a%b%j$,;H$o$l$k$+!#%Z!<%8%5%$%:$O!"(B4KB$B$H$9$k!#(B

    $B!zLdBj(B(402) kmalloc()$B$H(Bkfree()

    $B0J2<$O!"%f!<%66u4V$G%a%b%j$r3dEv$F!"MxMQ$7!"3+J|$9$k%W%m%0%i%`$N0lIt$G$"$k!#(B
       struct s1 *p;
       p = malloc( sizeof(struct s1) );
       use( p );
       free( p );
    
    $B$3$N%W%m%0%i%`$r!"%+!<%M%kFb$GF0$+$9$3$H$rA[Dj$7$F(Bkmalloc() $B$H(B kfree() $B$r;H$C$F=q$-49$($J$5$$!#$?$@$7!"(Bgfp $B$N%U%i%0$H$7$F$O!"(BGFP_KERNEL $B$r;H$$$J$5$$!#(B
    $BMxMQ(B
       struct s1 *p;
       /*$B2sEz(B*/
       use( p );
       /*$B2sEz(B*/
    

    $B!zLdBj(B(403) $B%9%i%V%"%m%1!<%?(B

    $BLdBj(B(402) $B$N%W%m%0%i%`$r!"%9%i%V%"%m%1!<%?$r;H$C$F=q$-49(B $B$($J$5$$!#$9$J$o$A!"(Bkmem_cache_create()$B!"(Bkmem_cache_alloc()$B!"$*$h$S!"(B kmem_cache_free()$B$r;H$C$F=q$-49$($J$5$$!#$?$@$7!"(Bkmem_cache_create() $B$N(B $BBh(B3$B0z?t$N(Balign $B$H$7$F$O!"(B0$B$r!"Bh(B4$B0z?t$N(Bflags$B$H$7$F$O!"(BSLAB_PANIC$B!"Bh(B5$B0z(B $B?t$N%3%s%9%H%i%/%?$H$7$F$O!"(BNULL $B$r;XDj$7$J$5$$!#(B
    $B=i4|2=(B
       /*$B2sEz(B*/
    
    $BMxMQ(B
       struct s1 *p;
       /*$B2sEz(B*/
       use( p );
       /*$B2sEz(B*/
    

    Last updated: 2012/02/07 17:11:59
    Yasushi Shinjo / <yas@is.tsukuba.ac.jp>