Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C mmap是否总是返回更高的地址_C_Linux_64 Bit_X86_Mmap - Fatal编程技术网

C mmap是否总是返回更高的地址

C mmap是否总是返回更高的地址,c,linux,64-bit,x86,mmap,C,Linux,64 Bit,X86,Mmap,mmap(使用MAP_匿名调用时,即用于分配内存)是否总是返回比上一次调用更高的内存地址?如果不是这样,有没有办法让它总是返回更高的地址?默认情况下,mmap可以以任何顺序返回页面边界上对齐的任何地址 如果您想要强制执行返回的地址是您指定的地址,您可以使用MAP\u FIXED标志,但这不是非常可移植和可靠的。这样,您就可以将代码与特定内核上的mmap的特定实现绑定在一起 但不管怎样,为什么您总是需要比前一个地址更高的地址?可能更好的方法是更改程序的逻辑。默认情况下,mmap可以以任何顺序返回页

mmap(使用MAP_匿名调用时,即用于分配内存)是否总是返回比上一次调用更高的内存地址?如果不是这样,有没有办法让它总是返回更高的地址?

默认情况下,
mmap
可以以任何顺序返回页面边界上对齐的任何地址

如果您想要强制执行返回的地址是您指定的地址,您可以使用
MAP\u FIXED
标志,但这不是非常可移植和可靠的。这样,您就可以将代码与特定内核上的
mmap
的特定实现绑定在一起


但不管怎样,为什么您总是需要比前一个地址更高的地址?可能更好的方法是更改程序的逻辑。

默认情况下,
mmap
可以以任何顺序返回页面边界上对齐的任何地址

如果您想要强制执行返回的地址是您指定的地址,您可以使用
MAP\u FIXED
标志,但这不是非常可移植和可靠的。这样,您就可以将代码与特定内核上的
mmap
的特定实现绑定在一起


但不管怎样,为什么您总是需要比前一个地址更高的地址?可能更好的方法是更改程序的逻辑。

不一定,至少不根据其定义

我相信,随着它的出现,上层地址可能不再可用,因此
mmap
必须选择一些较低的地址范围

显然,在32位处理器(&kernels)上,内存空间几乎可以被填满,因此当要求一个大的
mmap
-ed范围时,内核应该找到一个合适的,并且可以在任何地方

如果你想要一个单调的方向,使用(但我真的不建议使用)

另一种可能是在程序初始化时使用
mmap
with
MAP\u NORESERVE
预先分配大量(例如数TB)的地址空间,并在该范围内再次调用
mmap
with
MAP\u FIXED
,以获得真正可用的空间(以更易于管理的块为单位,例如几十兆字节)


@金属牧师:你真的应该激励和解释更多你的问题。这些问题是如此的神秘和怪异(甚至连我都猜不出所有的上下文),所以回答它们不是很有趣。

不一定,至少根据它的定义是这样的

我相信,随着它的出现,上层地址可能不再可用,因此
mmap
必须选择一些较低的地址范围

显然,在32位处理器(&kernels)上,内存空间几乎可以被填满,因此当要求一个大的
mmap
-ed范围时,内核应该找到一个合适的,并且可以在任何地方

如果你想要一个单调的方向,使用(但我真的不建议使用)

另一种可能是在程序初始化时使用
mmap
with
MAP\u NORESERVE
预先分配大量(例如数TB)的地址空间,并在该范围内再次调用
mmap
with
MAP\u FIXED
,以获得真正可用的空间(以更易于管理的块为单位,例如几十兆字节)


@金属牧师:你真的应该激励和解释更多你的问题。这些问题是如此的神秘和怪异(甚至连我都猜不出所有的上下文)回答它们不是很有趣。

为什么需要它呢?在我的应用程序中,我将通过mmap分配的所有内存的起始地址保存在一个数组中,我需要在某些点上搜索它们。将它们排序后,我可以执行二进制搜索。你可以说,我可以在每次调用后对它们进行排序mmap,但问题是这个数组需要从信号处理程序内部读取,并且您知道不能在信号处理程序内部使用互斥体或信号量,如果某个线程在从信号处理程序内部读取数组时对数组进行排序,这将成为一个问题。创建mapp时,请在正确的位置插入映射的地址如果你不每秒创建10亿个映射,这基本上是零成本,你的数组已经排序好了。如果你负担不起每
mmap
增加一个
memmove
,那就有问题了。@metallicprate,正如我在别处告诉你的(在另一个问题的回答中),您可以尝试在SIGSEGV处理程序中使用互斥体,我相信它通常在今天的Linux系统上实际工作,即使它不保证也不符合Posix。两条注释:(1)添加新条目时,您可以对数组的副本排序,然后翻转指针。(2)排序到底有多重要?如果
mmap
ed区域的数量相当少,那么线性搜索可能是可行的。为什么需要它来执行此操作?在我的应用程序中,我将通过mmap分配的所有内存的起始地址保留在一个数组中,并且我需要在某些点上搜索它们。将它们以排序的形式进行搜索将非常有用你可以说,我可以在每次调用mmap之后对它们进行排序,但问题是这个数组需要从信号处理程序内部读取,并且你知道不能在信号处理程序内部使用互斥体或信号量,如果某个线程在从信号处理程序内部读取数组时对数组进行排序,这将成为一个问题l handler。在创建映射时,将映射的地址插入正确的位置,然后?假设您没有每秒创建十亿个映射,这基本上是零成本,并且您的数组已排序。如果您负担不起每
mmap
一个额外的
memmove
,则会出现问题。@metallicpart,正如我在其他地方告诉您的那样(在对另一个问题的另一个回答中),您可以尝试在SIGSEGV处理程序中使用互斥体,我相信它通常会在今天的Linux系统上实际工作,即使它没有保证也没有