- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
64 位寻址的地址空间绝对是巨大的。我有一个程序可以mmap
几个内存块,每个内存块大约为 100 - 500 MB。我将不可避免地重新映射几次,这可能会导致可用连续空间出现一些碎片。
无论发生什么空间碎片,就可用地址空间而言,它肯定会非常小。
我的问题是:鉴于这些约束,在正常情况下,我可以期望所有 mmap
请求都成功(即不会因碎片而失败)吗?他们失败的原因可能是什么?
我知道堆本身并没有全部空间,但我想它拥有绝大多数空间。
Mac 操作系统/Linux。
最佳答案
请注意,“64 位操作系统”的地址空间大小不一定涵盖整个 64 位范围。
例如,在 x64(64 位 x86,又名“AMD64”)上,实际可用的虚拟地址范围“仅”为 2x128TB,即两个不相交的 47 位 block 中的 48 位。在某些 SPARC 系统上,它是 2x2TB 或 2x8TB(41/44 位)。这是由于 MMU 在这些平台上的工作方式。
除了这些架构限制之外,操作系统布局地址空间的方式也在这里发挥作用。
例如,x64 上的 64 位 Windows 将(甚至 64 位)应用程序的虚拟地址大小限制为 8TB(每个内核和用户端 1 )。
在 UN*X 系统(包括 Linux、MacOSX 和 *BSD)上,有一个可以通过 getrlimit()
查询的 RLIMIT_AS
,并且 - 在系统内-特定限制 - 通过 setrlimit
进行调整。 ulimit
命令使用这些。不过,它们返回/设置上限,即允许的总虚拟地址空间,包括进程可以创建的所有映射(通过 mmap()
或 malloc
后端, sbrk()
)。但是总的地址空间大小与单个映射的最大大小不同...
鉴于此,即使在 64 位 Linux 上耗尽虚拟地址空间也不难;只需尝试 mmap()
相同的 500GB 文件进行测试,比方说,200 次。 mmap 最终会失败。
简而言之:
mmap()
肯定会在虚拟地址空间不足时失败。令人惊讶的是,这在许多“64 位”架构上是可以实现的,因为虚拟地址可能少于 64 个有效位。确切的截止值取决于您的 CPU 和操作系统,上限可以通过 getrlimit(RLIMIT_AS)
查询或通过 setrlimit(RLIMIT_AS)
设置。 mmap()
/munmap()
,地址空间碎片可能会在 64 位上发生。这最终将限制您可以映射为单个 block 的最大大小。很难准确预测这种情况何时会发生,因为它取决于您的“映射历史记录”和操作系统的虚拟地址空间分配算法。如果 ASLR(地址空间布局随机化)由操作系统完成,则细节可能无法预测,并且无法完全重现。malloc()
也将在达到总 VA 限制之前失败,在系统(如 Linux)上,过度使用允许您“请求”比系统(物理)内存更多的内存+ 交换)。malloc()
和 mmap()
都带有 MAP_ANON
和/或 MAP_PRIVATE
将在物理 + 交换空间耗尽时失败,因为这些类型的映射需要通过实际内存或交换空间进行后备存储。小技术更新:与上面提到的 x86 和 sparc 一样,新的 ARMv8(64 位 ARM,在 Linux 中称为“AArch64”)MMU 也有一个“拆分”地址空间/地址空间空洞 - 在一个 64 位中地址,只有 40 个是相关的。 Linux 为用户提供 39 位,虚拟地址 0 ...
起,为内核提供 39 位,虚拟地址 ... 0xFFFFFFFF.FFFFFFFF
,因此限制为 512GB(减去什么在应用程序尝试 mmap
时已经在使用中)。
参见 comments here (来自 AArch64 架构启用内核补丁系列)。
关于c - 在 64 位进程中,我的 mmap/malloc 请求会被拒绝吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4923116/
我正在尝试从该网站抓取历史天气数据: http://www.hko.gov.hk/cis/dailyExtract_uc.htm?y=2016&m=1 在阅读了 AJAX 调用后,我发现请求数据的正确
我有两个 postman 请求 x,y,它们命中了两个不同的休息 api X,Y 中的端点。 x 会给我一个身份验证 token ,这是发出 y 请求所必需的。如何在请求 y 中发出请求 x ?也就是
我使用请求库通过 API 与其他服务器进行通信。但现在我需要同时发送多个(10 个或更多)POST 请求,并且只有在所有响应都正确的情况下才能进一步前进。通常语法看起来有点像这样: var optio
背景:当用户单击按钮时,其类会在class1和class2之间切换,并且此数据是通过 AJAX 提交。为了确认此数据已保存,服务器使用 js 进行响应(更新按钮 HTML)。 问题:如果用户点击按钮的
我正在将 Node.js 中的请求库用于 Google 的文本转语音 API。我想打印出正在发送的请求,如 python example . 这是我的代码: const request = requi
我经常使用requests。最近我发现还有一个 requests2 和即将到来的 requests3 虽然有一个 page其中简要提到了 requests3 中的内容,我一直无法确定 requests
我正在尝试将图像发送到我的 API,然后从中获取结果。例如,我使用发送一个 bmp 图像文件 file = {"img": open("img.bmp)} r = requests.post(url,
我发现 Google Cloud 确保移出其物理环境的任何请求都经过强制加密,请参阅(虚拟机到虚拟机标题下的第 6 页)this link Azure(和 AWS)是否遵循类似的程序?如果有人能给我指
我有一个 ASP.NET MVC 应用程序,我正在尝试在 javascript 函数中使用 jQuery 来创建一系列操作。该函数由三部分组成。 我想做的是:如果满足某些条件,那么我想执行同步 jQu
我找不到如何执行 get http 请求,所以我希望你们能帮助我。 这个想法是从外部url(例如 https://api.twitter.com/1.1/search/tweets.json?q=tw
我的应用只需要使用“READ_SMS”权限。我的问题是,在 Android 6.0 上,当我需要使用新的权限系统时,它会要求用户“发送和查看短信”。 这是我的代码: ActivityCompat.re
我的前端代码: { this.searchInput = input; }}/> 搜索 // search method: const baseUrl = 'http://localho
我有一个由 AJAX 和 C# 应用程序使用的 WCF 服务, 我需要通过 HTTP 请求 header 发送一个参数。 在我的 AJAX 上,我添加了以下内容并且它有效: $.ajax({
我正在尝试了解如何使用 promises 编写代码。请检查我的代码。这样对吗? Node.js + 请求: request(url, function (error, response, body)
如果失败(除 HTTP 200 之外的任何响应代码),我需要重试发送 GWT RPC 请求。原因很复杂,所以我不会详细说明。到目前为止,我在同一个地方处理所有请求响应,如下所示: // We
当用户单击提交按钮时,我希望提交表单。然而,就在这种情况发生之前,我希望弹出一个窗口并让他们填写一些数据。一旦他们执行此操作并关闭该子窗口,我希望发出 POST 请求。 这可能吗?如果可能的话如何?我
像 Facebook 这样的网站使用“延迟”加载 js。当你必须考虑到我有一台服务器,流量很大时。 我很感兴趣 - 哪一个更好? 当我一次执行更多 HTTP 请求时 - 页面加载速度较慢(由于限制(一
Servlet 容器是否创建 ServletRequest 和 Response 对象或 Http 对象?如果是ServletRequest,谁在调用服务方法之前将其转换为HttpServletReq
这是维基百科文章的摘录: In contrast to the GET request method where only a URL and headers are sent to the serv
我有一个循环,每次循环时都会发出 HTTP post 请求。 for(let i = 1; i console.log("succes at " + i), error => con
我是一名优秀的程序员,十分优秀!