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

					2011$BG/(B01$B7n(B11$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-2010/2011-01-11
$B$"$k$$$O!" http://www.coins.tsukuba.ac.jp/~yas/
http://www.cs.tsukuba.ac.jp/~yas/

$B"#O"Mm;v9`(B

Softlab $B8&5f<<>R2p(B

$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(order)
    include/linux/gfp.h
    
     302:	static inline struct page *
     303:	alloc_pages(gfp_t gfp_mask, unsigned int order)
     304:	{
    ...
     306:	}
     316:	extern unsigned long __get_free_pages(gfp_t gfp_mask, unsigned int order);
     314:	#define alloc_page(gfp_mask) alloc_pages(gfp_mask, 0)
    
     328:	extern void __free_pages(struct page *page, unsigned int order);
     329:	extern void free_pages(unsigned long addr, unsigned int order);
     333:	#define free_page(addr) free_pages((addr), 0)
    

    $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

    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(B(gfp_t)

    kmalloc() $B$d(B __get_free_pages(), alloc_pages(), alloc_page() $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$kI,MW@-!#(B
    • $B%9%j!<%W$9$k2DG=@-$,$"$k$+$J$$$+$,=EMW!#(B
    • $B%a%b%j$,3NJ]$G$-$J$$;~$K$O!"%Z!<%8%"%&%H$7$F3NJ]$9$k2DG=@-$,$"$k!#(B
    • $B%Z!<%8%"%&%H$K$O!"F~=PNO$,H<$&!#F~=PNOCf$O!"%W%m%;%9$O!"(B $B%9%j!<%W$9$k!J(Bblocked$B>uBV$K$J$k!K!#(B
    • $B3d$j9~$_%O%s%I%i!Jl=j$,$"$k!#(B
    • $BF~=PNO=hM}$N$?$a$K%a%b%j$,I,MW$K$J$C$F!"%a%b%j$r3NJ]$9$k$3$H$,$"$k!#(B
    • $B%a%b%j$,3NJ]$G$-$J$$;~$K$O!"%Z!<%8%"%&%H$7$F3NJ]$9$k2DG=@-$,$"$k!#(B
    • $B%Z!<%8%"%&%H$K$O!"F~=PNO$,H<$&!#(B
    • $BF~=PNO=hM}$N$?$a$K%a%b%j$,I,MW$K$J$C$F!"%a%b%j$r3NJ]$9$k$3$H$,$"$k!#(B
    • $B%a%b%j$,3NJ]$G$-$J$$;~$K$O!"%Z!<%8%"%&%H$7$F3NJ]$9$k2DG=@-$,$"$k!#(B
    • $B%Z!<%8%"%&%H$K$O!"F~=PNO$,H<$&!#(B
    • $BF~=PNO=hM}$N$?$a$K%a%b%j$,I,MW$K$J$C$F!"%a%b%j$r3NJ]$9$k$3$H$,$"$k!#(B
    • $B%a%b%j$,3NJ]$G$-$J$$;~$K$O!"%Z!<%8%"%&%H$7$F3NJ]$9$k2DG=@-$,$"$k!#(B
    • $B%Z!<%8%"%&%H$K$O!"F~=PNO$,H<$&!#(B
    • $B!&!&!&!#(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
    • $B9=B$BN$r3d$jEv$F$k;~$K$O!"(Bfree list $B$+$i free list $B$,6u$J$i!"9=B$BN$,J#?tF~$k$h$&$JBg$-$J%a%b%j(B($B%Z!<%8C10L(B)$B$r(B $B3dEv$F!"(Bfree list $B$K$D$J$0!#(B
    • $B9=B$BN$,;H$o$l$J$/$J$C$?$i!"(Bfree list $B$K$D$J$0!#(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)
    
    $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

    $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"!MxMQNc(B(task_struct)

    kernel/fork.c
     112:	static struct kmem_cache *task_struct_cachep;
    ...
     202:	void __init fork_init(unsigned long mempages)
     203:	{
    ...
     206:	#define ARCH_MIN_TASKALIGN      L1_CACHE_BYTES
    ...
     209:	        task_struct_cachep =
     210:	                kmem_cache_create("task_struct", sizeof(struct task_struct),
     211:	                        ARCH_MIN_TASKALIGN, SLAB_PANIC | SLAB_NOTRACK, NULL);
    ...
     110:	# define alloc_task_struct()    kmem_cache_alloc(task_struct_cachep, GFP_KERNEL)
     111:	# define free_task_struct(tsk)  kmem_cache_free(task_struct_cachep, (tsk))
    

    $B"!(Bstruct slab

    mm/slab.c
     200:	struct slab {
     201:	        struct list_head list;
     202:	        unsigned long colouroff;
     203:	        void *s_mem;            /* including colour offset */
     204:	        unsigned int inuse;     /* num of objs active in slab */
     205:	        kmem_bufctl_t free;
    ...
     207:	};
    

    slabs_partial$B!

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

    $B"!(Bkmem_list3

    mm/slab.c
     269:	struct kmem_list3 {
     270:	        struct list_head slabs_partial; /* partial list first, better asm code */
     271:	        struct list_head slabs_full;
     272:	        struct list_head slabs_free;
    ...
     281:	};
    
    $B%9%i%V$NJ,N`(B

    slabs_partial$B!

    $B?^(B? $B%9%i%V$N%j%9%H(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) Buddy$B%7%9%F%`(B

    $B?^(B1 Buddy$B%7%9%F%`$K$h$k6u$-%Z!<%8$N4IM}(B $B
  • 1$B%Z!<%8$N3NJ](B
  • 1$B%Z!<%8$N3NJ](B
  • 1$B%Z!<%8$N3NJ](B
  • 1$B%Z!<%8$N3NJ](B
  • 1$B%Z!<%8$N3NJ](B

    $B!zLdBj(B(403) 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(404) $B%9%i%V%"%m%1!<%?(B

    $BLdBj(B(403) $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: 2011/01/11 14:19:55
    Yasushi Shinjo / <yas@is.tsukuba.ac.jp>