- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
在 musl 库 malloc() 实现中,MMAP_THRESHOLD 值为 229376 字节,因此 bin_index(用于查找存储在“mal.bins”中的空闲 block 以供以后请求使用的索引)的范围为 0 到 63。我想增加 MMAP_THRESHOLD到 1GB,我是否需要增加 bin_index 的范围...?
最佳答案
我研究了 musl 库 malloc() 的实现。根据我的两个理解,bin 索引计算为以 2 为底的 log 大小。即当大小用 2 的幂表示时的指数部分。
下面是函数 bin_index() 函数的代码片段。
static int bin_index(size_t x)
{
x = x / SIZE_ALIGN - 1;
if (x <= 32) return x;
if (x > 0x1c00) return 63;
return ((union { float v; uint32_t r; }){(int)x}.r>>21) - 496;
}
在上面的函数中,在计算bin索引时,首先将大小除以32来计算x,如果x值小于或等于32,则使用bin[0]到bin[32]。但如果 x 大于 32,则通过将 x 转换为 32 位(IEEE 754 标准)浮点表示来计算索引。在 32 位表示中,1 位用作符号位,8 位用于指数,23 位用于尾数。如果您在上面的代码中看到,x 值被右移 21 而不是 23(使用了尾数部分的两个额外位)来找到指数。这背后的原因是将两个对数点转换为四步(线性)然后减去偏差496得到指数(bin index)。
为什么是 496...?当我们使用尾数部分的两个额外位时,指数将为 10 位。因此 10 位指数的偏差值为 -512(对于负数)和 511(对于正数)。即可以用 10 位表示的最大数量。在这种情况下,偏差将为 511,因为所有值都将为正。然后从511中减去15(索引偏移量),将bin索引从32调整为63。511 - 15 = 496
当 MMAP_THRESHOLD 值为 229376 字节时,bin 索引在对数点之间使用四个线性步长。但是,如果我们将 MMAP_THRESHOLD 增加到 1GB,则可以在 bin_index() 中使用从 0 到 63 的相同 bin 索引,只需稍作修改。您应该用 64 位浮点表示而不是 32 位来表示数字,并且不需要使用两个对数点之间具有四个线性步长的 bin 索引,如下所示
static int bin_index(size_t x)
{
x = x / SIZE_ALIGN - 1;
if (x <= 32) return x;
if (x > 0x2000000) return 63;
return ((union { double v; uint64_t r; }){(int64_t)x}.r>>52) - 996;
}
关于linux - musl 库 malloc() 实现如何决定 bin 索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51130950/
我正在尝试编译各种程序,例如使用 musl 的 MariaDB工具链。也就是说,我不想在编译完成后对 glibc 或 GNU 的链接器有任何依赖。 到目前为止,我一直在使用 musl 的 GCC 包装
Grpc版本:1.24.2 在部署我的 Node.js 应用程序时,我遇到了 grpc package 的二进制文件问题. 错误: Error: Failed to load gRPC binary
musl 团队声称不需要检测 musl libc 的方法,因为它们只实现标准功能并且没有需要检测的怪癖。 直到今天,这种说法很可能是正确的,但它不再是正确的。正常功能检测不起作用,因为该功能存在但已损
我们有基于 alpine linux 的 docker 文件。我想让构建的容器检查 musl 库的版本,我的意思是运行容器并在 RT 中检查 musl 版本我该怎么做? 我试过类似的东西 docker
我想要实现的是使用 musl 编译一个 GNU 独立且隔离的 LLVM 工具链作为clib。 最近LLVM 4.0已发布,具有许多新的炫酷功能,包括生产就绪 LLD ,因此链接步骤也可以由 LLVM
我必须用 musl-gcc 包装器编译一些 c++ 程序,所以我需要 c++ 头文件和库。在我使用它们之前,我想我必须使用 musl-gcc 本身针对 musl 编译 libstdc++ 源代码。 我
我有一个 C99 共享库,我想将其链接到一些静态静态库中(通过 --whole-archive)。 注意:所有静态库都是用-fPIC构建的 我也想构建一个通用的 linux 二进制文件,因此决定使用
所以我正在玩 Alpine Linux,它使用 musl 与 glibc。 我发现由于这个选择,我无法运行 Oracle Java 或在 glibc 下构建的静态二进制文件。 musl 是否应该与更广
我将按照此处显示的示例为Rust包创建一个Dockerfile:https://alexbrand.dev/post/how-to-package-rust-applications-into-min
我正在尝试使用 GHC 为用 Haskell 编写的基于 CGI 的 Web 应用程序构建静态二进制文件,并将其部署在共享服务器上。 我想使用musl ,如this answer所述. 不幸的是,这不
我正在尝试使用 GHC 为用 Haskell 编写的基于 CGI 的 Web 应用程序构建静态二进制文件,并将其部署在共享服务器上。 我想使用musl ,如this answer所述. 不幸的是,这不
我正在尝试让 Rust 在 Docker 中运行以将其用于 32 位 musl 构建。自从我更新它以使用新的 URL 来拉取 rustup 后,我在使用 bash 交互式运行容器时遇到了这个问题: r
我正在尝试在 Alpine 上运行我的 rust 应用程序,但我在使用 musl 作为目标或使用 glibc 的兼容层时遇到了问题。当我尝试从 libc6-compat 使用时,我遇到了这个问题: E
我需要针对 musl-libc 编译一个 C 程序,以使其在嵌入式设备上运行。但是,我无法编译该程序。源取决于我传递给链接器的几个库: /usr/local/musl/bin/musl-gcc app
我在为目标 x86_64-unknown-linux-musl 编译时遇到错误。 这是我的做法: cargo new foo cd foo rustup target add x86_64-unkno
我正在尝试调试在具有 MIPS cpu 的板上远程运行的程序,使用 musl 作为其 libc。 如果我在板上启动 gdbserver,通过 set sysroot /path/to/sysroot
我正在尝试构建 musl-libc在运行 OS X 10.11.5 的计算机上。不幸的是,我在运行 make 时收到以下错误: clang: warning: optimization flag '-
我有一个用 musl libc 编译的共享库 $ readelf -d ./libinterop_d.so Dynamic section at offset 0x8ecb0 contains 22
我正在使用 Nix 作为 Rust 程序的依赖管理器。我有以下 default.nix(简化但有效): rec { pkgs = import {}; hello = pkgs.stdenv
在 musl 库 malloc() 实现中,MMAP_THRESHOLD 值为 229376 字节,因此 bin_index(用于查找存储在“mal.bins”中的空闲 block 以供以后请求使用的
我是一名优秀的程序员,十分优秀!