当new一块内存时,操作系统做了哪些事情
问题
当new一块内存时,操作系统做了哪些事情
我的回答
当我们在C++中使用new操作符申请内存时,操作系统和运行时库会做一系列工作:
首先,new操作符会调用operator new函数,这是C++运行时库的一部分,负责实际的内存分配。这个函数通常会先尝试使用内存分配器(如ptmalloc、jemalloc或tcmalloc)从其管理的内存池中分配内存。
如果内存池中有足够的空闲内存,分配器会直接返回一块合适的内存,这种情况下不需要操作系统参与。这是为什么小内存分配通常很快的原因。
但如果内存池不足,分配器就会向操作系统请求更多内存。在Linux系统中,这通常通过brk()或mmap()系统调用实现。brk()通过移动程序的break point(堆的末尾)来扩展堆空间;而mmap()则会映射一块新的虚拟内存区域。
当系统调用发生时,CPU从用户态切换到内核态,操作系统接管控制权。内核会检查进程的内存限制、系统可用内存等条件,决定是否满足请求。
值得注意的是,现代操作系统普遍采用虚拟内存技术和延迟分配策略。当我们申请内存时,操作系统只是分配了虚拟内存地址空间,并在页表中做了标记,但并不立即分配物理内存页。只有当程序首次访问某个地址时,才会触发缺页异常,此时内核才实际分配物理内存页并建立映射。
内存分配完成后,如果是使用new而不是new[],且申请的是非POD类型,还会调用对象的构造函数进行初始化。