简答社区

剖析使Go语言高效的5个特性(5/5): Goroutine的栈管理

<h2 id="goroutine的栈管理">Goroutine的栈管理</h2> <p>在上一篇文章里,我们已经讨论了goroutine减少了对上百个并发运行的线程的管理开销。这里我们要在讨论下goroutine的另外一个方面,它的栈管理。</p> <p></p> <p>下面是一个进程的内存布局图。这个图里我们关心的是堆和栈的位置。</p> <img style="border:1px solid #cccccc; margin:auto;display:block" src="/st

剖析使Go语言高效的5个特性(4/5): Goroutines

<h2 id="goroutines">Goroutines</h2> <p>Go语言有goroutines。它们是Go语言里并发编程的基石。</p> <p>首先,我们来了解goroutines产生的历史。在一开始,计算机只能跑一个进程。然后到了60年代,多进程或者说是分时的概念变得很流行。在一个分时系统里,操作系统必须不停地将CPU上运行的进程进行切换。这种切换必须要将当前的进程状态保存下来,并且将下一个进程的状态恢复到CPU上。这个过程叫<strong>进程切换(process swit

剖析使Go语言高效的5个特性(3/5): 垃圾回收机制

<h2 id="垃圾回收机制-garbage-collection">垃圾回收机制(Garbage Collection)</h2> <p>Go语言因为强制的内存垃圾回收机制变得更加简单和安全。但这并不意味着垃圾回收机制把Go程序变慢了,或者说垃圾回收机制最终决定了你程序的速度。不可否认,在堆(heap)上分配内存是有代价的。每次垃圾回收机制触发都会消耗一定的CPU。除非内存都被释放了,这些开销是不可避免的。</p> <p></p> <p>但是还有另外一个地方我们可以用来分配内存。那就是栈

剖析使Go语言高效的5个特性(2/5): 函数调用不是免费的

<h2 id="函数调用不是免费的">函数调用不是免费的</h2> <p>一个函数调用有三个步骤。创建一个新的堆栈框(stack frame)并把调用者的详细信息记录下来。把任何会被被调用函数用到的寄存器内容保存到堆栈。计算被调用函数的地址,并执行跳转指令到那个新的地址。</p> <p></p> <img style="border:1px solid #cccccc; margin:auto;display:block" src="/static/post/01/Gocon-2014-1

剖析使Go语言高效的5个特性(1/5): 变量的处理和存储

<p>我最近受邀在Gocon会议上做了一个演讲。Gocon是一个非常棒的,每半年一次在日本东京举行的Go会议。<a href="http://ymotongpoo.hatenablog.com/entry/2014/06/01/124350" target="_blank" rel="noopener">Gocon 2014</a>是完全由社区举办的一整天活动。它包括了培训以及一个下午的演讲。演讲的主题主要围绕在Go语言在线上环境中的应用。</p> <p>以下是我的演讲稿。原始的演讲稿强调慢而