Am i correct to assume from previous messages that if I use MAX_PROCS=1 and 
don't use channels, my functions will run from start to end in the order 
they've been piled up using the `go` keyword?

This could yield interesting properties, because this means that even using 
channels, maybe we could write concurrent code and still have a chance to 
have predictable and reproducible execution in testing environment. 

On Friday, November 25, 2016 at 10:51:41 PM UTC+1, Dave Cheney wrote:
>
>
>
> On Saturday, 26 November 2016 08:00:24 UTC+11, Roger Alsing wrote:
>>
>> So it works very similar to normal OS thread context switching, but more 
>> explicit?
>>
>
> Yes, goroutine switching occurs a known points; effectively where the 
> goroutine is blocked from proceeding; sending and receiving on channels (if 
> they are full/empty respectively), trying to acquire a locked mutex, and 
> performing IO. These operations happen frequently in a program that 
> interacts with others so things more or less work out.
>  
>
>> The code will push all local state to the go routine stack, pop the state 
>> for the next go routine and change the stack pointer?
>>
>
> The cute thing is the Go function call convention is caller save, so when 
> a goroutine enters the scheduler there is no state to be saved, it's 
> already saved on the stack by the normal function call convention. As Ian 
> said above the scheduler just finds the SP and PC for a new goroutine and 
> swaps them for the current one. The new goroutine awakes at the bottom of 
> the scheduler, and returns to its original control flow.
>  
>
>>
>> And this is cheaper than context switching as threads have their own 1 or 
>> 4 mb stack allocated while go routines have a linked list for its stack 
>> (afaik?) ?
>>
>
> Goroutines used to have a linked list of stack segments, we dropped that 
> in Go 1.3 (might have been 1.2, i'd have to check), now stack segments grow 
> and shrink with a cheap check in the preamble of the function; if there 
> isn't enough stack to perform the function (this is known precisely at 
> compile time), then the function traps into a slow path that doubles the 
> stack allocation by copying the whole stack to a new area, then restarts 
> the function. Stack shrinking is handled via the GC cycle when a goroutine 
> has a large amount of unused stack.
>  
>
>> is that the major difference?
>>
>
> I think so, it makes goroutines cheap to create; only a few kb of initial 
> stack, cheap to use; no trip through kernel space to save a lot of state, 
> and trash TLB's and caches, and cheap to have many of them; in operation 
> hundreds of thousands of goroutines in a busy server are the norm. This is 
> also pretty much the case against threads.
>
> Here is a presentation I gave at OSCON last year about all these things, 
> https://dave.cheney.net/2015/08/08/performance-without-the-event-loop
>  
>
>>
>>
>> Den fredag 25 november 2016 kl. 17:34:24 UTC+1 skrev Ian Lance Taylor:
>>>
>>> On Fri, Nov 25, 2016 at 2:18 AM,  <roger...@gmail.com> wrote: 
>>> > I have seen a lot of confusion on how go routines actually work 
>>> internally. 
>>> > Will the function execution ontop of the go routine be rewritten to a 
>>> statemachine with continuations in the same way as the C# async await does? 
>>>
>>> I do not know how C# async await works.  That said, goroutines are not 
>>> rewritten to state machines. 
>>>
>>>
>>> > If I have only 1 OS thread and 1000 go routines, obviously there must 
>>> be some sort of "magic" that makes it possible to multiplex these ontop of 
>>> that thread. 
>>> > How do the go routines store state so that they can continue from the 
>>> last execution point when they resume execution? 
>>>
>>> A goroutine is basically a small stack.  All the goroutine state is 
>>> saved on the stack.  To switch to a different goroutine, the goroutine 
>>> scheduler changes the stack pointer.  On the new goroutine, it looks 
>>> like the function call into the scheduler simply returns, and the 
>>> goroutine continues running. 
>>>
>>> This is a standard programming technique known as a "coroutine".  For 
>>> Go we used the name "goroutine" because 1) it is cute; 2) goroutines 
>>> have functionality not available in most coroutine libraries, such as 
>>> multiplexing across many OS threads and automatic use of epoll for 
>>> network connections. 
>>>
>>>
>>> > Is it safe to say that Go gives you the exact same support as the C# 
>>> (and others) async await while still writing code that looks sequential? 
>>>
>>> I don't know C#.  goroutines let you write code that looks sequential 
>>> because it actually is sequential. 
>>>
>>> Ian 
>>>
>>

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to