mirror of
https://github.com/golang/go
synced 2024-11-26 18:16:48 -07:00
doc/go_faq.html: update description of stack management
They aren't segmented any more, at least with gc. Also improve the comparison of goroutines and threads. Fixes #7373. LGTM=iant R=iant CC=golang-codereviews https://golang.org/cl/77950044
This commit is contained in:
parent
0c8415699e
commit
287967f74c
@ -426,18 +426,20 @@ When a coroutine blocks, such as by calling a blocking system call,
|
||||
the run-time automatically moves other coroutines on the same operating
|
||||
system thread to a different, runnable thread so they won't be blocked.
|
||||
The programmer sees none of this, which is the point.
|
||||
The result, which we call goroutines, can be very cheap: unless they spend a lot of time
|
||||
in long-running system calls, they cost little more than the memory
|
||||
for the stack, which is just a few kilobytes.
|
||||
The result, which we call goroutines, can be very cheap: they have little
|
||||
overhead beyond the memory for the stack, which is just a few kilobytes.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
To make the stacks small, Go's run-time uses segmented stacks. A newly
|
||||
To make the stacks small, Go's run-time uses resizable, bounded stacks. A newly
|
||||
minted goroutine is given a few kilobytes, which is almost always enough.
|
||||
When it isn't, the run-time allocates (and frees) extension segments automatically.
|
||||
The overhead averages about three cheap instructions per function call.
|
||||
When it isn't, the run-time grows (and shrinks) the memory for storing
|
||||
the stack automatically, allowing many goroutines to live in a modest
|
||||
amount of memory.
|
||||
The CPU overhead averages about three cheap instructions per function call.
|
||||
It is practical to create hundreds of thousands of goroutines in the same
|
||||
address space. If goroutines were just threads, system resources would
|
||||
address space.
|
||||
If goroutines were just threads, system resources would
|
||||
run out at a much smaller number.
|
||||
</p>
|
||||
|
||||
@ -1614,9 +1616,10 @@ it now. <code>Gccgo</code>'s run-time support uses <code>glibc</code>.
|
||||
<code>Gc</code> uses a custom library to keep the footprint under
|
||||
control; it is
|
||||
compiled with a version of the Plan 9 C compiler that supports
|
||||
segmented stacks for goroutines.
|
||||
The <code>gccgo</code> compiler implements segmented
|
||||
stacks on Linux only, supported by recent modifications to the gold linker.
|
||||
resizable stacks for goroutines.
|
||||
The <code>gccgo</code> compiler implements these on Linux only,
|
||||
using a technique called segmented stacks,
|
||||
supported by recent modifications to the gold linker.
|
||||
</p>
|
||||
|
||||
<h3 id="Why_is_my_trivial_program_such_a_large_binary">
|
||||
|
Loading…
Reference in New Issue
Block a user