Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.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
Assembly 分配空闲内存的概念_Assembly_Memory Management_Malloc - Fatal编程技术网

Assembly 分配空闲内存的概念

Assembly 分配空闲内存的概念,assembly,memory-management,malloc,Assembly,Memory Management,Malloc,我想知道最低级别的内存分配是如何工作的。例如,如果程序想要创建一些长数组或其他任何东西,它将如何请求内存,程序如何确保自己不占用其他程序正在使用的内存 如果有人能告诉我这件事,我将不胜感激。据我所知(至少在UNIX上),该程序会调用系统库以获取内存(例如malloc和friends)。这些库在程序的虚拟地址空间中维护一个可用内存块列表,并从该列表中分配内存(这是一种过于简单的做法,它们维护该列表并处理字对齐、连续块等的方法相当复杂)。为了确保程序不接触彼此的内存,操作系统有一个虚拟内存的概念,它

我想知道最低级别的内存分配是如何工作的。例如,如果程序想要创建一些长数组或其他任何东西,它将如何请求内存,程序如何确保自己不占用其他程序正在使用的内存


如果有人能告诉我这件事,我将不胜感激。

据我所知(至少在UNIX上),该程序会调用系统库以获取内存(例如malloc和friends)。这些库在程序的虚拟地址空间中维护一个可用内存块列表,并从该列表中分配内存(这是一种过于简单的做法,它们维护该列表并处理字对齐、连续块等的方法相当复杂)。为了确保程序不接触彼此的内存,操作系统有一个虚拟内存的概念,它本质上将每个程序的可寻址内存映射到物理内存的不同部分。有关更多信息,请参阅。

据我所知(至少在UNIX上),该程序会调用系统库以获取内存(例如malloc和friends)。这些库在程序的虚拟地址空间中维护一个可用内存块列表,并从该列表中分配内存(这是一种过于简单的做法,它们维护该列表并处理字对齐、连续块等的方法相当复杂)。为了确保程序不接触彼此的内存,操作系统有一个虚拟内存的概念,它本质上将每个程序的可寻址内存映射到物理内存的不同部分。有关更多信息,请参阅。

内存可以通过多种方式分配…静态和动态分配两种主要方式

静态分配意味着一个程序可以使用的所有内存都是一次分配的,并且它能够使用到这个数量

动态分配意味着当程序需要分配内存时,它会进入堆并将指针放在第一个可用内存块上(根据使用的动态分配算法指定大小)。然后,根据需要(例如在数组中),需要花费更多的时间,将指针保持在原始位置,以便知道数组的开始位置。现代计算机通常能很好地将包括内存在内的资源分配给应用程序,从而减少了出错的机会。在更高的级别上,当可以从内存中删除对象/数组/任何内容时,垃圾收集会处理该内存

这里的问题是,当自由内存被任意分配和释放时,不同的程序可以获取不一定按顺序排列的不同块。这就是我们所说的碎片化(这就是为什么你时不时地对你的磁盘驱动器进行碎片整理)。当以连续方式分配内存时,可以更高效地读取它

内存中有大量信息,因此这里有一小部分数据供您在自己的内存中分配;)




快乐阅读

内存可以通过多种方式分配……静态和动态分配两种主要方式

静态分配意味着一个程序可以使用的所有内存都是一次分配的,并且它能够使用到这个数量

动态分配意味着当程序需要分配内存时,它会进入堆并将指针放在第一个可用内存块上(根据使用的动态分配算法指定大小)。然后,根据需要(例如在数组中),需要花费更多的时间,将指针保持在原始位置,以便知道数组的开始位置。现代计算机通常能很好地将包括内存在内的资源分配给应用程序,从而减少了出错的机会。在更高的级别上,当可以从内存中删除对象/数组/任何内容时,垃圾收集会处理该内存

这里的问题是,当自由内存被任意分配和释放时,不同的程序可以获取不一定按顺序排列的不同块。这就是我们所说的碎片化(这就是为什么你时不时地对你的磁盘驱动器进行碎片整理)。当以连续方式分配内存时,可以更高效地读取它

内存中有大量信息,因此这里有一小部分数据供您在自己的内存中分配;)




快乐阅读

最简单的解决方案是不允许释放分配的内存。假设操作系统有一堆它知道可供程序分配的内存。操作系统在这个空闲区域的开头跟踪地址。如果有足够的内存可用于第一个alloc,那么alloc将获得空闲指针地址,并且空闲指针将按alloc的数量向前移动。这将继续向前推进,直到没有更多的内存或者没有人分配更多的内存。因此,如果起始地址是0x1000,并且有人想要0x20字节,那么他们将返回0x1000作为alloc的指针,而空闲指针移动到0x1020。假设0x100的下一个alloc返回0x1020,自由指针移动到0x1120,以此类推

你也可以从一个高地址开始工作,自上而下而不是自下而上。内存的顶部可能是0x10000,0x20的第一个alloc将导致0x10000-0x20=0xFFE0,因此0xFFE0将被发送到应用程序,并保存为可用内存的顶部。0x100 alloc获取0xFEE0,以此类推

这个简单化的想法,永远不会释放内存,问题是你的内存很快就会用完。到那个时候,如果它可能已经因为已经完成的项目而成为孤儿,那就太多了。因此,它可能在一些嵌入式系统中工作,但总的来说,还需要做更多的工作

因此,与文件系统不同,表必须由内存分配系统(操作系统)维护