线程 #
栈通常是连续增长的,由于每个进程中的各个线程共享虚拟内存空间,当有多个线程时,就需要为每个线程分配不同起始地址的栈。 这就需要在分配栈之前先预估每个线程栈的大小。
如果线程数量非常多,就很容易栈溢出。
Split Stacks #
为了解决这个问题,就有了 Split Stacks 技术: 创建栈时,只分配一块比较小的内存,如果进行某次函数调用导致栈空间不足时,就会在其他地方分配一块新的栈空间。 新的空间不需要和老的栈空间连续。函数调用的参数会拷贝到新的栈空间中,接下来的函数执行都在新栈空间中进行。
Golang 连续栈 #
Golang 的栈管理方式与此类似,但是为了更高的效率,使用了 Golang 连续栈。 实现方式也是先分配一块固定大小的栈,在栈空间不足时,分配一块更大的栈,并把旧的栈全部拷贝到新栈中。 这样避免了 Split Stacks 方法可能导致的频繁内存分配和释放。
叶王 © 2013-2024 版权所有。如果本文档对你有所帮助,可以请作者喝饮料。