【发布时间】:2016-10-07 03:16:31
【问题描述】:
我是否正确假设当进程调用 malloc 时,可能涉及 I/O(交换缓存等)以使内存可用,这反过来意味着它可能会阻塞相当长的时间?因此,我们不应该在 linux 中有两个版本的 malloc,一个说“fast_malloc”,它适用于获取较小的块并保证不会阻塞(但当然可能仍然会因 OUT_OF_MEMORY 而失败)和另一个我们可以要求任意的 async_malloc -size 空间但需要回调?
示例:如果我需要一小块内存来为链表中的项目腾出空间,我可能更喜欢传统的内联 malloc,因为我知道操作系统应该能够在 99.999% 的时间内满足它,或者只是失败。另一个例子:如果我是一个数据库服务器,试图分配一个相当大的块来放入索引,我可能会选择 async_malloc 并处理“回调复杂性”。
我提出这个问题的原因是我希望创建每秒处理数十万个 Web 请求的高并发服务器,并且通常避免使用线程来处理这些请求。换句话说,无论何时发生 I/O,我都希望它是异步的(比如基于 libevent)。不幸的是,我意识到大多数 C API 缺乏对并发使用的适当支持。例如,无处不在的 MySQL C 库是完全阻塞的,而这只是我的服务器广泛使用的一个库。同样,我总是可以通过卸载到另一个线程来模拟非阻塞,但这远不如通过完成回调等待结果便宜。
【问题讨论】:
-
调用
malloc本质上不会导致更多的IO。也许您对返回的内存的使用与仅将内存分配给您感到困惑。仅仅因为你要求 100MB 并不意味着malloc会立即触发 100MB 的交换。只有当您访问内存时才会发生这种情况。 -
C没有指定
malloc()的计时性能。当然,这不是第一个有时间问题的应用程序。主要操作系统中的典型malloc()确实避免长时间阻塞,而是仅在使用时分配。 stackoverflow.com/q/19991623/2410359.
标签: c++ c multithreading concurrency libevent