910e62b5创建于 1月15日历史提交

Bucket Distribution in PartitionAlloc

In PartitionAlloc, a slab-based memory allocator, a "bucket" serves to categorize different memory allocation sizes. When memory is requested, PartitionAlloc rounds the requested size up to the nearest predefined size class (referred to as slot size). Allocations that map to the same bucket are then grouped together and allocated from a size-segregated slot span.

A bucket, therefore, defines a specific size category. This bucketing strategy is key to how PartitionAlloc manages and organizes memory efficiently, offering several benefits:

  • Increased cache locality for same-size allocations
  • Smaller metadata
  • Easy mapping of address to size
  • Decreased fragmentation over time

This document describes PartitionAlloc's methodology for mapping requested allocation sizes to their corresponding buckets. See //partition_alloc/bucket_lookup.h for implementation details.

Bucket Distribution Types

PartitionAlloc provides two different distributions; Neutral and Denser. As the name tells, Denser offers a more granular set of buckets, roughly doubling the number compared to the Neutral distribution.

  1. Neutral Bucket Distribution (kNeutral)
  • Pro: Results in fewer partially-filled slot spans, potentially reducing fragmentation caused by unused slots in these spans.
  • Con: Allocations are often rounded up to a significantly larger slot size than requested. This increases fragmentation within each allocation due to the larger difference between the requested size and the allocated slot size.
  1. Denser Bucket Distribution (kDenser):
  • Pro: Allocations can more closely match the requested memory size. This reduces fragmentation within each allocation, as the chosen slot size is nearer to the actual need.
  • Con: May lead to more partially-filled slot spans. If these slot spans are not fully utilized, it can increase fragmentation due to more unused slots across these spans.

The Neutral distribution is implemented as a variation of the Denser one, making it straightforward to understand if one understands the Denser layout.

Denser Bucket Distribution: A Closer Look

The Denser distribution itself operates as a hybrid system. For smaller allocation sizes, bucket sizes increase in a simple, linear fashion. Conversely, for larger allocation sizes, the bucket sizes increase exponentially.

Linear Sizing (for Smaller Allocations)

When an allocation request is for a relatively small amount of memory, the system employs a linear scale. This means each subsequent bucket size is larger than the previous one by a fixed increment. This increment is determined by the system's fundamental memory alignment requirement, which might be, for instance, 16 bytes. As an example, if this fixed increment is 16 bytes, the sequence of buckets might represent sizes such as 16 bytes, 32 bytes, 48 bytes, and so on.

Exponential Sizing (for Larger Allocations)

For larger memory requests, the bucket sizes adhere to an exponential pattern. The system divides broad power-of-two ranges, termed "orders," into a fixed number of smaller bucket steps. For instance, the range of sizes from 128 bytes up to, but not including, 256 bytes constitutes an "order," and it would contain a specific number of distinct bucket sizes. The subsequent order, such as 256 to 511 bytes, would be similarly divided.

A fixed number of buckets, for example eight, are used to subdivide each power-of-two range, creating what is known as "Buckets per Order." This configuration results in a logarithmic scale where bucket sizes grow proportionally rather than by a fixed additive amount. To illustrate with an example using 8 buckets per order, sizes just above 128 bytes might be 128 bytes, then approximately 1.125x128 bytes, 1.25x128 bytes, and continue in this manner up to nearly 256 bytes. This pattern then repeats for sizes above 256 bytes, then 512 bytes, and so forth.

Order-Index 0 Order-Index 1 Order-Index 2 Order-Index 3 Order-Index 4 Order-Index 5 Order-Index 6 Order-Index 7
Order 8 (2⁷) 121-128 129-144 145-160 161-176 177-192 193-208 209-224 225-240
Order 9 (2⁸) 241-256 257-288 289-320 321-352 353-384 385-416 417-448 449-480
Order 10 (2⁹) 481-512 513-576 577-640 641-704 705-768 769-832 833-896 897-960

Neutral Bucket Distribution

The Neutral Bucket Distribution offers a sparser alternative, derived from the Denser one. In the range where the Denser distribution uses linear sizing, or for the smallest exponential sizes where alignment naturally limits bucket density, the Neutral and Denser distributions are identical. However, for larger sizes within the exponential sizing range, the Neutral distribution typically uses fewer buckets per "order" compared to the Denser one. It selects every other bucket that the Denser distribution would define, leading to fewer, more widely spaced buckets.

Consider an illustrative conceptual difference: if the Denser distribution has buckets for sizes like ..., 384, 416, 448, 480, 512, ..., the Neutral distribution, in the same range, might only have buckets for ..., 384, then skip 416 to use 448, then skip 480 to use 512, and so on.

Example Distribution

8 Bytes Alignment (Typically 32-bit Systems)

Index Size Bucket Distribution Originating Formula
0 8 kNeutral and kDenser linear [8 x 1]
1 16 kNeutral and kDenser linear [8 x 2]
2 24 kNeutral and kDenser linear [8 x 3]
3 32 kNeutral and kDenser linear [8 x 4]
4 40 kNeutral and kDenser linear [8 x 5]
5 48 kNeutral and kDenser linear [8 x 6]
6 56 kNeutral and kDenser linear [8 x 7]
7 64 kNeutral and kDenser linear [8 x 8] yet exponential [2⁶ x (1 + 0)]
8 72 kNeutral and kDenser linear [8 x 9] yet exponential [2⁶ x (1 + ⅛)]
9 80 kNeutral and kDenser linear [8 x 10] yet exponential [2⁶ x (1 + ¼)]
10 88 kNeutral and kDenser linear [8 x 11] yet exponential [2⁶ x (1 + ⅜)]
11 96 kNeutral and kDenser linear [8 x 12] yet exponential [2⁶ x (1 + ½)]
12 104 kNeutral and kDenser linear [8 x 13] yet exponential [2⁶ x (1 + ⅝)]
13 112 kNeutral and kDenser linear [8 x 14] yet exponential [2⁶ x (1 + ¾)]
14 120 kNeutral and kDenser linear [8 x 15] yet exponential [2⁶ x (1 + ⅞)]
15 128 kNeutral and kDenser linear [8 x 16] yet exponential [2⁷ x (1 + 0)]
16 144 kDenser only exponential [2⁷ x (1 + ⅛)]
17 160 kNeutral and kDenser exponential [2⁷ x (1 + ¼)]
18 176 kDenser only exponential [2⁷ x (1 + ⅜)]
19 192 kNeutral and kDenser exponential [2⁷ x (1 + ½)]
20 208 kDenser only exponential [2⁷ x (1 + ⅝)]
21 224 kNeutral and kDenser exponential [2⁷ x (1 + ¾)]
22 240 kDenser only exponential [2⁷ x (1 + ⅞)]
23 256 kNeutral and kDenser exponential [2⁸ x (1 + 0)]
24 288 kDenser only exponential [2⁸ x (1 + ⅛)]
25 320 kNeutral and kDenser exponential [2⁸ x (1 + ¼)]
26 352 kDenser only exponential [2⁸ x (1 + ⅜)]
27 384 kNeutral and kDenser exponential [2⁸ x (1 + ½)]
28 416 kDenser only exponential [2⁸ x (1 + ⅝)]
29 448 kNeutral and kDenser exponential [2⁸ x (1 + ¾)]
30 480 kDenser only exponential [2⁸ x (1 + ⅞)]
31 512 kNeutral and kDenser exponential [2⁹ x (1 + 0)]
32 576 kDenser only exponential [2⁹ x (1 + ⅛)]
33 640 kNeutral and kDenser exponential [2⁹ x (1 + ¼)]
34 704 kDenser only exponential [2⁹ x (1 + ⅜)]
35 768 kNeutral and kDenser exponential [2⁹ x (1 + ½)]
36 832 kDenser only exponential [2⁹ x (1 + ⅝)]
37 896 kNeutral and kDenser exponential [2⁹ x (1 + ¾)]
38 960 kDenser only exponential [2⁹ x (1 + ⅞)]
39 1024 kNeutral and kDenser exponential [2¹⁰ x (1 + 0)]
40 1152 kDenser only exponential [2¹⁰ x (1 + ⅛)]
41 1280 kNeutral and kDenser exponential [2¹⁰ x (1 + ¼)]
42 1408 kDenser only exponential [2¹⁰ x (1 + ⅜)]
43 1536 kNeutral and kDenser exponential [2¹⁰ x (1 + ½)]
44 1664 kDenser only exponential [2¹⁰ x (1 + ⅝)]
45 1792 kNeutral and kDenser exponential [2¹⁰ x (1 + ¾)]
46 1920 kDenser only exponential [2¹⁰ x (1 + ⅞)]
47 2048 kNeutral and kDenser exponential [2¹¹ x (1 + 0)]
48 2304 kDenser only exponential [2¹¹ x (1 + ⅛)]
49 2560 kNeutral and kDenser exponential [2¹¹ x (1 + ¼)]
50 2816 kDenser only exponential [2¹¹ x (1 + ⅜)]
51 3072 kNeutral and kDenser exponential [2¹¹ x (1 + ½)]
52 3328 kDenser only exponential [2¹¹ x (1 + ⅝)]
53 3584 kNeutral and kDenser exponential [2¹¹ x (1 + ¾)]
54 3840 kDenser only exponential [2¹¹ x (1 + ⅞)]
55 4096 kNeutral and kDenser exponential [2¹² x (1 + 0)]
56 4608 kDenser only exponential [2¹² x (1 + ⅛)]
57 5120 kNeutral and kDenser exponential [2¹² x (1 + ¼)]
58 5632 kDenser only exponential [2¹² x (1 + ⅜)]
59 6144 kNeutral and kDenser exponential [2¹² x (1 + ½)]
60 6656 kDenser only exponential [2¹² x (1 + ⅝)]
61 7168 kNeutral and kDenser exponential [2¹² x (1 + ¾)]
62 7680 kDenser only exponential [2¹² x (1 + ⅞)]
63 8192 kNeutral and kDenser exponential [2¹³ x (1 + 0)]
64 9216 kDenser only exponential [2¹³ x (1 + ⅛)]
65 10240 kNeutral and kDenser exponential [2¹³ x (1 + ¼)]
66 11264 kDenser only exponential [2¹³ x (1 + ⅜)]
67 12288 kNeutral and kDenser exponential [2¹³ x (1 + ½)]
68 13312 kDenser only exponential [2¹³ x (1 + ⅝)]
69 14336 kNeutral and kDenser exponential [2¹³ x (1 + ¾)]
70 15360 kDenser only exponential [2¹³ x (1 + ⅞)]
71 16384 kNeutral and kDenser exponential [2¹⁴ x (1 + 0)]
72 18432 kDenser only exponential [2¹⁴ x (1 + ⅛)]
73 20480 kNeutral and kDenser exponential [2¹⁴ x (1 + ¼)]
74 22528 kDenser only exponential [2¹⁴ x (1 + ⅜)]
75 24576 kNeutral and kDenser exponential [2¹⁴ x (1 + ½)]
76 26624 kDenser only exponential [2¹⁴ x (1 + ⅝)]
77 28672 kNeutral and kDenser exponential [2¹⁴ x (1 + ¾)]
78 30720 kDenser only exponential [2¹⁴ x (1 + ⅞)]
79 32768 kNeutral and kDenser exponential [2¹⁵ x (1 + 0)]
80 36864 kDenser only exponential [2¹⁵ x (1 + ⅛)]
81 40960 kNeutral and kDenser exponential [2¹⁵ x (1 + ¼)]
82 45056 kDenser only exponential [2¹⁵ x (1 + ⅜)]
83 49152 kNeutral and kDenser exponential [2¹⁵ x (1 + ½)]
84 53248 kDenser only exponential [2¹⁵ x (1 + ⅝)]
85 57344 kNeutral and kDenser exponential [2¹⁵ x (1 + ¾)]
86 61440 kDenser only exponential [2¹⁵ x (1 + ⅞)]
87 65536 kNeutral and kDenser exponential [2¹⁶ x (1 + 0)]
88 73728 kDenser only exponential [2¹⁶ x (1 + ⅛)]
89 81920 kNeutral and kDenser exponential [2¹⁶ x (1 + ¼)]
90 90112 kDenser only exponential [2¹⁶ x (1 + ⅜)]
91 98304 kNeutral and kDenser exponential [2¹⁶ x (1 + ½)]
92 106496 kDenser only exponential [2¹⁶ x (1 + ⅝)]
93 114688 kNeutral and kDenser exponential [2¹⁶ x (1 + ¾)]
94 122880 kDenser only exponential [2¹⁶ x (1 + ⅞)]
95 131072 kNeutral and kDenser exponential [2¹⁷ x (1 + 0)]
96 147456 kDenser only exponential [2¹⁷ x (1 + ⅛)]
97 163840 kNeutral and kDenser exponential [2¹⁷ x (1 + ¼)]
98 180224 kDenser only exponential [2¹⁷ x (1 + ⅜)]
99 196608 kNeutral and kDenser exponential [2¹⁷ x (1 + ½)]
100 212992 kDenser only exponential [2¹⁷ x (1 + ⅝)]
101 229376 kNeutral and kDenser exponential [2¹⁷ x (1 + ¾)]
102 245760 kDenser only exponential [2¹⁷ x (1 + ⅞)]
103 262144 kNeutral and kDenser exponential [2¹⁸ x (1 + 0)]
104 294912 kDenser only exponential [2¹⁸ x (1 + ⅛)]
105 327680 kNeutral and kDenser exponential [2¹⁸ x (1 + ¼)]
106 360448 kDenser only exponential [2¹⁸ x (1 + ⅜)]
107 393216 kNeutral and kDenser exponential [2¹⁸ x (1 + ½)]
108 425984 kDenser only exponential [2¹⁸ x (1 + ⅝)]
109 458752 kNeutral and kDenser exponential [2¹⁸ x (1 + ¾)]
110 491520 kDenser only exponential [2¹⁸ x (1 + ⅞)]
111 524288 kNeutral and kDenser exponential [2¹⁹ x (1 + 0)]
112 589824 kDenser only exponential [2¹⁹ x (1 + ⅛)]
113 655360 kNeutral and kDenser exponential [2¹⁹ x (1 + ¼)]
114 720896 kDenser only exponential [2¹⁹ x (1 + ⅜)]
115 786432 kNeutral and kDenser exponential [2¹⁹ x (1 + ½)]
116 851968 kDenser only exponential [2¹⁹ x (1 + ⅝)]
117 917504 kNeutral and kDenser exponential [2¹⁹ x (1 + ¾)]
118 983040 kNeutral and kDenser exponential [2¹⁹ x (1 + ⅞)]

16 Bytes Alignment (Typically 64-bit Systems)

Index Size Bucket Distribution Originating Formula
0 16 kNeutral and kDenser linear [16 x 1]
1 32 kNeutral and kDenser linear [16 x 2]
2 48 kNeutral and kDenser linear [16 x 3]
3 64 kNeutral and kDenser linear [16 x 4]
4 80 kNeutral and kDenser linear [16 x 5]
5 96 kNeutral and kDenser linear [16 x 6]
6 112 kNeutral and kDenser linear [16 x 7]
7 128 kNeutral and kDenser linear [16 x 8] yet exponential [2⁷ x (1 + 0)]
8 144 kNeutral and kDenser linear [16 x 9] yet exponential [2⁷ x (1 + ⅛)]
9 160 kNeutral and kDenser linear [16 x 10] yet exponential [2⁷ x (1 + ¼)]
10 176 kNeutral and kDenser linear [16 x 11] yet exponential [2⁷ x (1 + ⅜)]
11 192 kNeutral and kDenser linear [16 x 12] yet exponential [2⁷ x (1 + ½)]
12 208 kNeutral and kDenser linear [16 x 13] yet exponential [2⁷ x (1 + ⅝)]
13 224 kNeutral and kDenser linear [16 x 14] yet exponential [2⁷ x (1 + ¾)]
14 240 kNeutral and kDenser linear [16 x 15] yet exponential [2⁷ x (1 + ⅞)]
15 256 kNeutral and kDenser linear [16 x 16] yet exponential [2⁸ x (1 + 0)]
16 288 kDenser only exponential [2⁸ x (1 + ⅛)]
17 320 kNeutral and kDenser exponential [2⁸ x (1 + ¼)]
18 352 kDenser only exponential [2⁸ x (1 + ⅜)]
19 384 kNeutral and kDenser exponential [2⁸ x (1 + ½)]
20 416 kDenser only exponential [2⁸ x (1 + ⅝)]
21 448 kNeutral and kDenser exponential [2⁸ x (1 + ¾)]
22 480 kDenser only exponential [2⁸ x (1 + ⅞)]
23 512 kNeutral and kDenser exponential [2⁹ x (1 + 0)]
24 576 kDenser only exponential [2⁹ x (1 + ⅛)]
25 640 kNeutral and kDenser exponential [2⁹ x (1 + ¼)]
26 704 kDenser only exponential [2⁹ x (1 + ⅜)]
27 768 kNeutral and kDenser exponential [2⁹ x (1 + ½)]
28 832 kDenser only exponential [2⁹ x (1 + ⅝)]
29 896 kNeutral and kDenser exponential [2⁹ x (1 + ¾)]
30 960 kDenser only exponential [2⁹ x (1 + ⅞)]
31 1024 kNeutral and kDenser exponential [2¹⁰ x (1 + 0)]
32 1152 kDenser only exponential [2¹⁰ x (1 + ⅛)]
33 1280 kNeutral and kDenser exponential [2¹⁰ x (1 + ¼)]
34 1408 kDenser only exponential [2¹⁰ x (1 + ⅜)]
35 1536 kNeutral and kDenser exponential [2¹⁰ x (1 + ½)]
36 1664 kDenser only exponential [2¹⁰ x (1 + ⅝)]
37 1792 kNeutral and kDenser exponential [2¹⁰ x (1 + ¾)]
38 1920 kDenser only exponential [2¹⁰ x (1 + ⅞)]
39 2048 kNeutral and kDenser exponential [2¹¹ x (1 + 0)]
40 2304 kDenser only exponential [2¹¹ x (1 + ⅛)]
41 2560 kNeutral and kDenser exponential [2¹¹ x (1 + ¼)]
42 2816 kDenser only exponential [2¹¹ x (1 + ⅜)]
43 3072 kNeutral and kDenser exponential [2¹¹ x (1 + ½)]
44 3328 kDenser only exponential [2¹¹ x (1 + ⅝)]
45 3584 kNeutral and kDenser exponential [2¹¹ x (1 + ¾)]
46 3840 kDenser only exponential [2¹¹ x (1 + ⅞)]
47 4096 kNeutral and kDenser exponential [2¹² x (1 + 0)]
48 4608 kDenser only exponential [2¹² x (1 + ⅛)]
49 5120 kNeutral and kDenser exponential [2¹² x (1 + ¼)]
50 5632 kDenser only exponential [2¹² x (1 + ⅜)]
51 6144 kNeutral and kDenser exponential [2¹² x (1 + ½)]
52 6656 kDenser only exponential [2¹² x (1 + ⅝)]
53 7168 kNeutral and kDenser exponential [2¹² x (1 + ¾)]
54 7680 kDenser only exponential [2¹² x (1 + ⅞)]
55 8192 kNeutral and kDenser exponential [2¹³ x (1 + 0)]
56 9216 kDenser only exponential [2¹³ x (1 + ⅛)]
57 10240 kNeutral and kDenser exponential [2¹³ x (1 + ¼)]
58 11264 kDenser only exponential [2¹³ x (1 + ⅜)]
59 12288 kNeutral and kDenser exponential [2¹³ x (1 + ½)]
60 13312 kDenser only exponential [2¹³ x (1 + ⅝)]
61 14336 kNeutral and kDenser exponential [2¹³ x (1 + ¾)]
62 15360 kDenser only exponential [2¹³ x (1 + ⅞)]
63 16384 kNeutral and kDenser exponential [2¹⁴ x (1 + 0)]
64 18432 kDenser only exponential [2¹⁴ x (1 + ⅛)]
65 20480 kNeutral and kDenser exponential [2¹⁴ x (1 + ¼)]
66 22528 kDenser only exponential [2¹⁴ x (1 + ⅜)]
67 24576 kNeutral and kDenser exponential [2¹⁴ x (1 + ½)]
68 26624 kDenser only exponential [2¹⁴ x (1 + ⅝)]
69 28672 kNeutral and kDenser exponential [2¹⁴ x (1 + ¾)]
70 30720 kDenser only exponential [2¹⁴ x (1 + ⅞)]
71 32768 kNeutral and kDenser exponential [2¹⁵ x (1 + 0)]
72 36864 kDenser only exponential [2¹⁵ x (1 + ⅛)]
73 40960 kNeutral and kDenser exponential [2¹⁵ x (1 + ¼)]
74 45056 kDenser only exponential [2¹⁵ x (1 + ⅜)]
75 49152 kNeutral and kDenser exponential [2¹⁵ x (1 + ½)]
76 53248 kDenser only exponential [2¹⁵ x (1 + ⅝)]
77 57344 kNeutral and kDenser exponential [2¹⁵ x (1 + ¾)]
78 61440 kDenser only exponential [2¹⁵ x (1 + ⅞)]
79 65536 kNeutral and kDenser exponential [2¹⁶ x (1 + 0)]
80 73728 kDenser only exponential [2¹⁶ x (1 + ⅛)]
81 81920 kNeutral and kDenser exponential [2¹⁶ x (1 + ¼)]
82 90112 kDenser only exponential [2¹⁶ x (1 + ⅜)]
83 98304 kNeutral and kDenser exponential [2¹⁶ x (1 + ½)]
84 106496 kDenser only exponential [2¹⁶ x (1 + ⅝)]
85 114688 kNeutral and kDenser exponential [2¹⁶ x (1 + ¾)]
86 122880 kDenser only exponential [2¹⁶ x (1 + ⅞)]
87 131072 kNeutral and kDenser exponential [2¹⁷ x (1 + 0)]
88 147456 kDenser only exponential [2¹⁷ x (1 + ⅛)]
89 163840 kNeutral and kDenser exponential [2¹⁷ x (1 + ¼)]
90 180224 kDenser only exponential [2¹⁷ x (1 + ⅜)]
91 196608 kNeutral and kDenser exponential [2¹⁷ x (1 + ½)]
92 212992 kDenser only exponential [2¹⁷ x (1 + ⅝)]
93 229376 kNeutral and kDenser exponential [2¹⁷ x (1 + ¾)]
94 245760 kDenser only exponential [2¹⁷ x (1 + ⅞)]
95 262144 kNeutral and kDenser exponential [2¹⁸ x (1 + 0)]
96 294912 kDenser only exponential [2¹⁸ x (1 + ⅛)]
97 327680 kNeutral and kDenser exponential [2¹⁸ x (1 + ¼)]
98 360448 kDenser only exponential [2¹⁸ x (1 + ⅜)]
99 393216 kNeutral and kDenser exponential [2¹⁸ x (1 + ½)]
100 425984 kDenser only exponential [2¹⁸ x (1 + ⅝)]
101 458752 kNeutral and kDenser exponential [2¹⁸ x (1 + ¾)]
102 491520 kDenser only exponential [2¹⁸ x (1 + ⅞)]
103 524288 kNeutral and kDenser exponential [2¹⁹ x (1 + 0)]
104 589824 kDenser only exponential [2¹⁹ x (1 + ⅛)]
105 655360 kNeutral and kDenser exponential [2¹⁹ x (1 + ¼)]
106 720896 kDenser only exponential [2¹⁹ x (1 + ⅜)]
107 786432 kNeutral and kDenser exponential [2¹⁹ x (1 + ½)]
108 851968 kDenser only exponential [2¹⁹ x (1 + ⅝)]
109 917504 kNeutral and kDenser exponential [2¹⁹ x (1 + ¾)]
110 983040 kNeutral and kDenser exponential [2¹⁹ x (1 + ⅞)]