采访中有人问我这个问题。他们想知道的是,当用户调用malloc(4)分配4个字节的内存时,操作系统(Linux)如何响应?哪个子系统响应此系统调用?
我告诉他,内存管理子系统将为malloc()提供服务。malloc()实现将遍历空闲内存(物理内存)列表,我们将其称为空闲列表,并找到一个大于或等于4字节的适当块。一旦找到这样的块,它将被从空闲列表中删除并添加到已用列表中。然后,该物理内存将被映射到进程堆vma结构。他对这个答案似乎不太满意,伙伴系统如何适应这个答案?任何帮助将不胜感激。
当用户空间应用程序调用时malloc()
,该调用未在内核中实现。相反,它是一个库调用(实现的glibc或类似方法)。
简短的版本是malloc
glibc 中的实现要么通过brk()
/
sbrk()
system调用获取内存,要么通过mmap()
。这为glibc提供了一个很大的连续(相对于虚拟内存地址)的内存块,该malloc
实现将实现进一步切成小块并将它们切成小块,然后分发给您的应用程序。
这是一个小malloc
实现,它将为您提供想法,以及许多链接。
请注意,还没有什么东西在乎物理内存-当通过brk()
/
sbrk()
或更改过程数据段mmap()
,以及在引用内存(通过对内存的读取或写入)时,内核虚拟内存系统会处理该内存。
总结一下:
malloc()
将搜索其托管的内存,以查看是否有一块满足分配要求的未使用的内存。malloc()
将尝试扩展过程数据段(通过sbrk()
/ brk()
或在某些情况下mmap()
)。sbrk()
最终进入内核。brk()
/ sbrk()
调用会调整struct mm_struct
流程中的某些偏移,因此流程数据段会更大。首先,将没有物理内存映射到扩展数据段所提供的其他虚拟地址。malloc
),故障处理程序将启动并进入内核,在内核中内核将为未映射的内存分配物理内存。嗨,一个星期以来,我一直在追踪我的办公代码中的一个错误。它与Spring、Hibernate和Transaction有关。 我所知道的: 1.延迟加载。 2. Spring如何使用代理和拦截器进行事务管理。 3. Spring中的事务传播,我们的代码使用默认的REQUIRED。 4.每个请求/会话的会话和Hibernate的分离实体基础来保持会话,以及我们的会话不是每个会话的事实。 我的场景:我的
如果在java中执行关闭挂钩期间引发了未捕获的异常,jvm是否会立即退出,而不运行其余已注册的关闭挂钩(如果有)?从javadocs: 未捕获的异常通过调用线程ThreadGroup对象的uncaughtException方法在关闭钩子中处理,就像在任何其他线程中一样。此方法的默认实现将异常的堆栈跟踪打印到System.err并终止线程;它不会导致虚拟机退出或停止。 似乎其他关机挂钩应该运行...
我正在阅读很多Docker指南,其中的用户经常会使用一些Ubuntu基本映像,直接在Dockerfile中,或者在一个bash脚本中,将副本复制到容器并在开始时运行,它有类似“apt get upgrade”的内容 据我所知,容器仍然使用主机内核。那么,当apt-get升级包括内核升级时会发生什么呢?它是否创建 /boot并像往常一样安装文件,但是底层LXC对于总是来自主机的特定目录有一些直通/白
本文向大家介绍A* a = new A; a->i = 10;在内核中的内存分配上发生了什么?相关面试题,主要包含被问及A* a = new A; a->i = 10;在内核中的内存分配上发生了什么?时的应答技巧和注意事项,需要的朋友参考一下 参考回答: 1、程序内存管理: 一个程序本质上都是由BSS段、data段、text段三个组成的。可以看到一个可执行程序在存储(没有调入内存)时分为代码段、数
问题内容: 就速度和内存效率而言,在函数内部导入Python模块和/或函数有什么优缺点? 它是否在每次运行该功能时重新导入,或者是否仅在运行一开始就重新导入一次? 问题答案: 每次运行该功能时都会重新导入吗? 没有; 确切地说,Python模块在每次导入时都会被缓存,因此导入第二(或第三或第四…)次实际上并不会迫使它们再次经历整个导入过程。1个 是否在开始时导入一次功能是否运行? 不可以,只有在执
我试着重新安装Eclipse和Aptana Studio,但是还没有成功。如果有人能帮忙我会很高兴的。对不起,我的英语不好,我不是母语。 下面是一个日志示例: