рдЬрд╛рдУ рд╕рдордпрдмрджреНрдзрдХ: рдЕрдм рд╕рд╣рдХрд╛рд░реА рдирд╣реАрдВ рд╣реИ?

рдпрджрд┐ рдЖрдк рд╕рдВрд╕реНрдХрд░рдг 1.14 рдХреЗ рд░рд┐рд▓реАрдЬрд╝ рдиреЛрдЯ рдкрдврд╝рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдиреЗ рд╕рдВрднрд╡рддрдГ рднрд╛рд╖рд╛ рдХреЗ рд░рдирдЯрд╛рдЗрдо рдореЗрдВ рдХреБрдЫ рдмрд╣реБрдд рд╣реА рд░реЛрдЪрдХ рдмрджрд▓рд╛рд╡реЛрдВ рдХреЛ рджреЗрдЦрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдЖрдЗрдЯрдо рдореЗрдВ рдмрд╣реБрдд рджрд┐рд▓рдЪрд╕реНрдкреА рдереА: "рдЧреЛрд░рдЯрд╛рдЗрдиреНрд╕ рдЕрдм рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗ рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╣реИрдВред" рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдЬреАрдУ рдЕрдиреБрд╕реВрдЪрдХ (рдЕрдиреБрд╕реВрдЪрдХ) рдЕрдм рд╕рд╣рдХрд╛рд░реА рдирд╣реАрдВ рд╣реИ? рдЦреИрд░, рд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рддрд┐рд░рдЫреЗ рдкрдврд╝рдиреЗ рдХреЗ рдмрд╛рдж, рдЬрд┐рдЬреНрдЮрд╛рд╕рд╛ рд╕рдВрддреБрд╖реНрдЯ рд╣реБрдИред

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдереЛрдбрд╝реА рджреЗрд░ рдмрд╛рдж рдореИрдВрдиреЗ рдирд╡рд╛рдЪрд╛рд░реЛрдВ рдкрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╢реЛрдз рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рдореИрдВ рдЗрди рдЕрдзреНрдпрдпрдиреЛрдВ рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред

рдЫрд╡рд┐

рд╕рд┐рд╕реНрдЯрдо рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдВ


рдиреАрдЪреЗ рд╡рд░реНрдгрд┐рдд рдмрд╛рддреЗрдВ, GO рднрд╛рд╖рд╛ рдХреЗ рдЬреНрдЮрд╛рди рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдкрд╛рдардХ рд╕реЗ рдЖрд╡рд╢реНрдпрдХ рд╣реИрдВ, рдЕрддрд┐рд░рд┐рдХреНрдд рдЬреНрдЮрд╛рди, рдЕрд░реНрдерд╛рддреН:

  • рдЕрдиреБрд╕реВрдЪрдХ рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдХреА рд╕рдордЭ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореИрдВ рдиреАрдЪреЗ рд╕рдордЭрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛, "рдЙрдВрдЧрд▓рд┐рдпреЛрдВ рдкрд░")
  • рдпрд╣ рд╕рдордЭрдирд╛ рдХрд┐ рдХрдЪрд░рд╛ рдЙрдард╛рдиреЗ рд╡рд╛рд▓рд╛ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ
  • рд╕рдордЭ рдЬрд╛рдУ рдХрд┐ рдЧреЛ рдЕрд╕реЗрдВрдмрд▓рд░ рдХреНрдпрд╛ рд╣реИ

рдЕрдВрдд рдореЗрдВ, рдореИрдВ рдХреБрдЫ рд▓рд┐рдВрдХ рдЫреЛрдбрд╝ рджреВрдВрдЧрд╛, рдЬреЛ рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдЗрди рд╡рд┐рд╖рдпреЛрдВ рдХреЛ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╡рд░ рдХрд░рддреЗ рд╣реИрдВред

рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдпреЛрдЬрдирд╛рдХрд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ


рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдореИрдВ рдЖрдкрдХреЛ рдпрд╛рдж рджрд┐рд▓рд╛рддрд╛ рд╣реВрдВ рдХрд┐ рд╕рд╣рдХрд╛рд░реА рдФрд░ рдЧреИрд░-рд╕рд╣рдХрд╛рд░реА рдорд▓реНрдЯреАрдЯрд╛рд╕реНрдХрд┐рдВрдЧ рдХреНрдпрд╛ рд╣реИред

рдЧреИрд░-рд╕рд╣рдХрд╛рд░реА (рднреАрдбрд╝ рд╕реЗ рдмрд╛рд╣рд░) рдорд▓реНрдЯреАрдЯрд╛рд╕реНрдХрд┐рдВрдЧ рдХреЗ рд╕рд╛рде, рд╣рдо рд╕рднреА рдУрдПрд╕ рдЕрдиреБрд╕реВрдЪрдХ рдХреЗ рдЙрджрд╛рд╣рд░рдг рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реИрдВред рдпрд╣ рдЕрдиреБрд╕реВрдЪрдХ рдкреГрд╖реНрдарднреВрдорд┐ рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд╡рд┐рднрд┐рдиреНрди рдЙрддреНрддрд░рд╛рдзрд┐рдХрд╛рд░ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдереНрд░реЗрдб рдХреЛ рдЕрдирд▓реЛрдб рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЕрдирд▓реЛрдб рдХрд┐рдП рдЧрдП рд╕реАрдкреАрдпреВ рд╕рдордп рдХреЗ рдмрдЬрд╛рдп, рдЕрдиреНрдп рдереНрд░реЗрдб рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред

рд╕рд╣рдХрд╛рд░реА рдпреЛрдЬрдирд╛рдХрд╛рд░ рдПрдХ рдЕрд▓рдЧ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ - рд╡рд╣ рддрдм рддрдХ рд╕реЛрддрд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдЧреЛрд░реЛрдЗрдЯрд┐рди рдореЗрдВ рд╕реЗ рдПрдХ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЙрд╕реЗ рджреВрд╕рд░реЗ рдХреЛ рдЕрдкрдирд╛ рд╕реНрдерд╛рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рддрддреНрдкрд░рддрд╛ рдХреЗ рд╕рдВрдХреЗрдд рдХреЗ рд╕рд╛рде рдЬрд╛рдЧрддрд╛ рд╣реИред рддрдм рдпреЛрдЬрдирд╛рдХрд╛рд░ рдЦреБрдж рдХреЗ рд▓рд┐рдП рддрдп рдХрд░реЗрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ рд╕рдВрджрд░реНрдн рд╕реЗ рд╡рд░реНрддрдорд╛рди рдЧреЛрд░реЛрдЗрди рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдФрд░ рдпрджрд┐ рдРрд╕рд╛ рд╣реИ, рддреЛ рдХрд┐рд╕рдХреЗ рд╕реНрдерд╛рди рдкрд░ рд░рдЦрд╛ рдЬрд╛рдПред рдпрд╣ рд╣реИ рдХрд┐ GO рдЕрдиреБрд╕реВрдЪрдХ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдо рдЙрд╕ рдХреЛрдиреЗрд╕реНрдЯреЛрди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдЕрдиреБрд╕реВрдЪрдХ рджреНрд╡рд╛рд░рд╛ рд╕рдВрдЪрд╛рд▓рд┐рдд рд╣реЛрддрд╛ рд╣реИ:

  • рдкреА - рддрд╛рд░реНрдХрд┐рдХ рдкреНрд░реЛрд╕реЗрд╕рд░ (рд╣рдо рд░рдирдЯрд╛рдЗрдо рдХреЗ рд╕рд╛рде рдЙрдирдХреА рд╕рдВрдЦреНрдпрд╛ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред GOMAXPROCS рдлрд╝рдВрдХреНрд╢рди), рдкреНрд░рддреНрдпреЗрдХ рддрд╛рд░реНрдХрд┐рдХ рдкреНрд░реЛрд╕реЗрд╕рд░ рдкрд░ рдПрдХ рд╕рдордп рдореЗрдВ рдПрдХ рдЧреЛрд░реЛрдЗрди рдХреЛ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
  • рдПрдо - рдУрдПрд╕ рдереНрд░реЗрдбреНрд╕ред рдкреНрд░рддреНрдпреЗрдХ P, M рд╕реЗ рдПрдХ рдзрд╛рдЧреЗ рдкрд░ рдЪрд▓рддрд╛ рд╣реИред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ P рд╣рдореЗрд╢рд╛ M рдХреЗ рдмрд░рд╛рдмрд░ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдзрд╛рдЧрд╛ syscall рджреНрд╡рд╛рд░рд╛ рдЕрд╡рд░реБрджреНрдз рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рдЗрд╕рдХреЗ P рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рдзрд╛рдЧрд╛ рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдФрд░ рд╕реАрдЬреАрдУ рдФрд░ рдЕрдиреНрдп рдФрд░ рдЕрдиреНрдп рдмрд╛рд░реАрдХрд┐рдпрд╛рдВ рд╣реИрдВред
  • рдЬреА - рдЧреЛрд░реБрдЯрд┐рдВрд╕ред рдЦреИрд░ рдпрд╣рд╛рдБ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ, G рдХреЛ рдкреНрд░рддреНрдпреЗрдХ P рдкрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдЕрдиреБрд╕реВрдЪрдХ рдЗрд╕ рдкрд░ рдирдЬрд╝рд░ рд░рдЦрддрд╛ рд╣реИред

рдФрд░ рдЖрдЦрд┐рд░реА рдЪреАрдЬ рдЬрд┐рд╕реЗ рдЖрдкрдХреЛ рдЬрд╛рдирдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рд╢реЗрдбреНрдпреВрд▓рд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЧреЛрд░реЛрдЗрди рдХреЛ рдХрдм рдХрд╣рддрд╛ рд╣реИ? рдпрд╣ рд╕рд░рд▓ рд╣реИ, рдЖрдорддреМрд░ рдкрд░ рдХреЙрд▓рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрджреЗрд╢ рдлрд╝рдВрдХреНрд╢рди рдХреА рдмреЙрдбреА (рдкреНрд░рд╕реНрддрд╛рд╡рдирд╛) рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдХрдВрдкрд╛рдЗрд▓рд░ рджреНрд╡рд╛рд░рд╛ рдбрд╛рд▓реЗ рдЬрд╛рддреЗ рд╣реИрдВ (рдереЛрдбрд╝реА рджреЗрд░ рдмрд╛рдж рд╣рдо рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗ)ред

рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдорд╕реНрдпрд╛ рдХреНрдпрд╛ рд╣реИ?


рдЫрд╡рд┐

рд▓реЗрдЦ рдХреА рд╢реБрд░реБрдЖрдд рд╕реЗ, рдЖрдкрдХреЛ рдкрд╣рд▓реЗ рд╣реА рдкрддрд╛ рдЪрд▓ рдЧрдпрд╛ рдерд╛ рдХрд┐ рд╢реЗрдбреНрдпреВрд▓рд░ рдХреЗ рдХрд╛рдо рдХрд╛ рд╕рд┐рджреНрдзрд╛рдВрдд рдЬреАрдУ рдореЗрдВ рдмрджрд▓ рдЧрдпрд╛ рд╣реИ, рдЖрдЗрдП рдЙрди рдХрд╛рд░рдгреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдХрд┐ рдпреЗ рдмрджрд▓рд╛рд╡ рдХреНрдпреЛрдВ рдХрд┐рдП рдЧрдП рдереЗред рдХреЛрдб рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ:

рдмрд┐рдЧрд╛рдбрд╝рдиреЗ рд╡рд╛рд▓рд╛
func main() {
	runtime.GOMAXPROCS(1)
	go func() {
		var u int
		for {
			u -= 2
			if u == 1 {
				break
			}
		}
	}()
	<-time.After(time.Millisecond * 5) //    main   ,         

	fmt.Println("go 1.13 has never been here")
}


рдпрджрд┐ рдЖрдк рдЗрд╕реЗ GO <1.14 рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рде рд╕рдВрдХрд▓рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд▓рд╛рдЗрди "рдЧреЛ 1.13 рдпрд╣рд╛рдВ рдХрднреА рдирд╣реАрдВ рд░рд╣реА рд╣реИ" рдЖрдк рд╕реНрдХреНрд░реАрди рдкрд░ рдирд╣реАрдВ рджреЗрдЦреЗрдВрдЧреЗред рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реЛрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЬреИрд╕реЗ рд╣реА рд╢реЗрдбреНрдпреВрд▓рд░ рдПрдХ рдЕрдирдВрдд рд▓реВрдк рдХреЗ рд╕рд╛рде рдЧреЛрд░реЛрдЗрди рдХреЛ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХрд╛ рд╕рдордп рджреЗрддрд╛ рд╣реИ, рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкреА рдХреЛ рдкрдХрдбрд╝ рд▓реЗрддрд╛ рд╣реИ, рдЗрд╕ рдЧреЛрд░реЛрдЗрди рдХреЗ рдЕрдВрджрд░ рдХреЛрдИ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд╣рдо рдЕрдм рд╢реЗрдбреНрдпреВрд▓рд░ рдХреЛ рдирд╣реАрдВ рдЬрдЧрд╛рдПрдВрдЧреЗред рдФрд░ рд░рдирдЯрд╛рдЗрдо рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдПрдХ рд╕реНрдкрд╖реНрдЯ рдХреЙрд▓ред рдЧреЛрд╕реНрдб () рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░ рджреЗрдЧрд╛ред

рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ рдЬрд╣рд╛рдВ рдЧреЛрд░реЛрдЗрдирдЯ рдкреА рдХреЛ рдХреИрдкреНрдЪрд░ рдХрд░рддрд╛ рд╣реИ рдФрд░ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдЕрдиреНрдп рдЧреЛрд░реЛрдЗрдиреНрдЯреНрд╕ рдХреЛ рдЗрд╕ рдкреА рдкрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рд╕реЗ рд░реЛрдХрддрд╛ рд╣реИред рдЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рдХрд╛рд░рдг рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд╡рд┐рдХрд▓реНрдк рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рдкрдврд╝рдиреЗ рд╕реЗ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдкрд╛рд░реНрд╕ рдкреНрд░рд╕реНрддрд╛рд╡


рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИред рдЪрд▓реЛ рдУрдПрд╕ рдЕрдиреБрд╕реВрдЪрдХ рдХреЗ рд░реВрдк рдореЗрдВ рд╣реА рдХрд░рддреЗ рд╣реИрдВ! рдмрд╕, G рд╕реЗ Goroutine рдХреЛ рдмрд╛рд╣рд░ рдЬрд╛рдиреЗ рджреЗрдВ рдФрд░ рд╡рд╣рд╛рдВ рдПрдХ рдФрд░ рдбрд╛рд▓реЗрдВ, рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдо OS рдЯреВрд▓реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред

рдареАрдХ рд╣реИ, рдЗрд╕реЗ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд░реЗрдВ? рд╣рдо рд░рдирдЯрд╛рдЗрдо рдХреЛ рдЙрд╕ рдкреНрд░рд╡рд╛рд╣ рдХреЛ рд╕рдВрдХреЗрдд рднреЗрдЬрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВрдЧреЗ рдЬрд┐рд╕ рдкрд░ рдЧреЛрд░реЛрдЗрди рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рд╣рдо рдПрдо рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рд╕реНрдЯреНрд░реАрдо рдкрд░ рдЗрд╕ рд╕рд┐рдЧреНрдирд▓ рдХреЗ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░реЗрдВрдЧреЗ, рдкреНрд░реЛрд╕реЗрд╕рд░ рдХрд╛ рдХрд╛рд░реНрдп рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдирд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╡рд░реНрддрдорд╛рди рдЧреЛрд░реЛрдЗрди рдХреЛ рджрдмрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрджрд┐ рдРрд╕рд╛ рд╣реИ, рддреЛ рд╣рдо рдЗрд╕рдХреА рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ (рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдФрд░ рд╕реНрдЯреИрдХ рдХреА рд╕реНрдерд┐рддрд┐) рдХреЛ рдмрдЪрд╛рдПрдВрдЧреЗ рдФрд░ рджреВрд╕рд░реЗ рдХреЛ рд╕рдВрд╕рд╛рдзрди рджреЗрдВрдЧреЗ, рдЕрдиреНрдпрдерд╛ рд╣рдо рд╡рд░реНрддрдорд╛рди рдЧреЛрд░реВрдЯрд╛рдЗрди рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦреЗрдВрдЧреЗред рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдПрдХ рд╕рд┐рдЧреНрдирд▓ рдХреЗ рд╕рд╛рде рдЕрд╡рдзрд╛рд░рдгрд╛ UNIX- рдмреЗрд╕ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдорд╛рдзрд╛рди рд╣реИ, рдЬрдмрдХрд┐, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╡рд┐рдВрдбреЛрдЬ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рд╣реИред рд╡реИрд╕реЗ, SIGURG рдХреЛ рднреЗрдЬрдиреЗ рдХреЗ рд╕рдВрдХреЗрдд рдХреЗ рд░реВрдк рдореЗрдВ рдЪреБрдирд╛ рдЧрдпрд╛ рдерд╛ред

рдЗрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рд╕рдмрд╕реЗ рдХрдард┐рди рд╣рд┐рд╕реНрд╕рд╛ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЧреЛрд░реЛрдЗрдирд┐рди рдХреЛ рдордЬрдмреВрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдХреЛрдб рдореЗрдВ рдХреБрдЫ рд╕реНрдерд╛рдиреЛрдВ рдХреЛ рдХрдЪрд░рд╛ рдХрд▓реЗрдХреНрдЯрд░ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рдкрд░рдорд╛рдгреБ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рд╣рдо рдРрд╕реЗ рд╕реНрдерд╛рдиреЛрдВ рдХреЛ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд-рдмрд┐рдВрджреБ рдХрд╣рддреЗ рд╣реИрдВред рдпрджрд┐ рд╣рдо рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдмрд┐рдВрджреБ рд╕реЗ рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рдХреНрд╖рдг рдореЗрдВ рдЧреЛрд░реЛрдЗрди рдХреЛ рдирд┐рдЪреЛрдбрд╝рддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдЬреАрд╕реА рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдпрд╣ рд╣рдорд╛рд░реЗ рдЧреЛрд░реЛрдЗрди рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдкрдХрдбрд╝ рд▓реЗрдЧрд╛, рдЕрд╕реБрд░рдХреНрд╖рд┐рдд-рдмрд┐рдВрджреБ рдореЗрдВ рд▓рд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рдЪреАрдЬреЗрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЖрдЗрдП рд╕реБрд░рдХреНрд╖рд┐рдд / рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдЕрд╡рдзрд╛рд░рдгрд╛ рдкрд░ рдХрд░реАрдм рд╕реЗ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВред

рдХреНрдпрд╛ рдЖрдк рд╡рд╣рд╛рдВ рдЧрдП, рдЬреАрд╕реА?


рдЫрд╡рд┐

1.12 рд╕реЗ рдкрд╣рд▓реЗ рдХреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ, рд░рдирдЯрд╛рдЗрдо рдЧреЛрд╕реНрдЪреНрдб рдиреЗ рдЙрди рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рд╕реБрд░рдХреНрд╖рд┐рдд-рдмрд┐рдВрджреБрдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛, рдЬрд╣рд╛рдВ рдЖрдк рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЗрд╕ рдбрд░ рдХреЗ рдмрд┐рдирд╛ рдЕрдиреБрд╕реВрдЪрдХ рдХреЛ рдмреБрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рдЬреАрд╕реА рдХреЗ рд▓рд┐рдП рдХреЛрдб рдХреЗ рдкрд░рдорд╛рдгреБ рдЦрдВрдб рдореЗрдВ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рдПрдВрдЧреЗред рдЬреИрд╕рд╛ рдХрд┐ рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╣реА рдХрд╣рд╛ рд╣реИ, рд╕реБрд░рдХреНрд╖рд┐рдд-рдмрд┐рдВрджреБ рдбреЗрдЯрд╛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИрдВ (рд▓реЗрдХрд┐рди рд╣рд░ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдирд╣реАрдВ, рдЖрдкрдХреЗ рдорди рдореЗрдВ)ред рдпрджрд┐ рдЖрдкрдиреЗ рдЧреЛ-рд╢реЙрди рдЕрд╕реЗрдВрдмрд▓рд░ рдХреЛ рдбрд┐рд╕рд╛рдЗрдб рдХрд┐рдпрд╛, рддреЛ рдЖрдк рдЖрдкрддреНрддрд┐ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ - рдХреЛрдИ рд╕реНрдкрд╖реНрдЯ рд╢реЗрдбреНрдпреВрд▓рд░ рдХреЙрд▓ рд╡рд╣рд╛рдБ рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИред рд╣рд╛рдБ рдпрд╣ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдк рд╡рд╣рд╛рдБ рд░рдирдЯрд╛рдЗрдо рдореЙрд░реНрдирд┐рдВрдЧрд╕реНрдЯреИрдХ рдХреЙрд▓ рдирд┐рд░реНрджреЗрд╢ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдпрджрд┐ рдЖрдк рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрдВрджрд░ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдПрдХ рд╢реЗрдбреНрдпреВрд▓рд░ рдХреЙрд▓ рдорд┐рд▓реЗрдЧрд╛ред рд╕реНрдкреЙрдЗрд▓рд░ рдХреЗ рддрд╣рдд, рдореИрдВ GO рд╕реНрд░реЛрддреЛрдВ рд╕реЗ рдЯрд┐рдкреНрдкрдгреА рдЫрд┐рдкрд╛рдКрдВрдЧрд╛, рдпрд╛ рдЖрдк рд╕реНрд╡рдпрдВ рдХреЛ рдореЙрд╢реНрдЪрд░реИрдХ рдХреЗ рд▓рд┐рдП рдХреЛрдбрд╛рдВрддрд░рдХ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред

рд╕реНрд░реЛрдд рдореЗрдВ рдкрд╛рдпрд╛ рдЧрдпрд╛
Synchronous safe-points are implemented by overloading the stack bound check in function prologues. To preempt a goroutine at the next synchronous safe-point, the runtime poisons the goroutine's stack bound to a value that will cause the next stack bound check to fail and enter the stack growth implementation, which will detect that it was actually a preemption and redirect to preemption handling.

рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдЬрдм рднреАрдбрд╝-рднрд╛рдбрд╝ рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рднреАрдбрд╝-рднрд╛рдбрд╝ рдХрд╛ рд╕рдВрдХреЗрдд рд╣рдорд╛рд░реЗ рдЧреЛрд░реВрдЯрд┐рди рдХреЛ рдХрд╣реАрдВ рднреА рдкрдХрдбрд╝ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЬреАрдУ рд▓реЗрдЦрдХреЛрдВ рдиреЗ рд╕реБрд░рдХреНрд╖рд┐рдд-рдмрд┐рдВрджреБ рдирд╣реАрдВ рдЫреЛрдбрд╝рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рд╣рд░ рдЬрдЧрд╣ рд╕реБрд░рдХреНрд╖рд┐рдд-рдмрд┐рдВрджреБ рдШреЛрд╖рд┐рдд рдХрд░реЗрдВ! рдареАрдХ рд╣реИ, рдЬрд╝рд╛рд╣рд┐рд░ рд╣реИ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд▓рдЧрднрдЧ рд╣рд░ рдЬрдЧрд╣ рдПрдХ рдкрдХрдбрд╝ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдХреБрдЫ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд-рдмрд┐рдВрджреБ рд╣реИрдВ рдЬрд╣рд╛рдВ рд╣рдо рдХрд┐рд╕реА рдХреЛ рдордЬрдмреВрд░ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред рдЖрдЗрдП рдПрдХ рд╕рд░рд▓ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд-рдмрд┐рдВрджреБ рд▓рд┐рдЦреЗрдВред


j := &someStruct{}
p := unsafe.Pointer(j)
// unsafe-point start
u := uintptr(p)
//do some stuff here
p = unsafe.Pointer(u)
// unsafe-point end

рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рд╕рдорд╕реНрдпрд╛ рдХреНрдпрд╛ рд╣реИ, рдЪрд▓реЛ рдПрдХ рдХрдЪрд░рд╛ рдХрд▓реЗрдХреНрдЯрд░ рдХреА рддреНрд╡рдЪрд╛ рдкрд░ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред рд╣рд░ рдмрд╛рд░ рдЬрдм рд╣рдо рдХрд╛рдо рдкрд░ рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рд░реВрдЯ рдиреЛрдбреНрд╕ (рд╕реНрдЯреИрдХ рдкрд░ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдФрд░ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдореЗрдВ) рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рд╣рдо рдорд╛рд░реНрдХ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░реЗрдВрдЧреЗред рдЪреВрдВрдХрд┐ рд░рдирдЯрд╛рдЗрдо рдореЗрдВ рдпрд╣ рдХрд╣рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдореЗрдореЛрд░реА рдореЗрдВ 64 рдмрд╛рдЗрдЯреНрд╕ рдПрдХ рдкреЙрдЗрдВрдЯрд░ рд╣реИрдВ рдпрд╛ рд╕рд┐рд░реНрдл рдПрдХ рдирдВрдмрд░ рд╣реИ, рд╣рдо рд╕реНрдЯреИрдХ рдФрд░ рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд╛рд░реНрдб (рдореЗрдЯрд╛ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд╕рд╛рде рдХреБрдЫ рдХреИрд╢) рдХреА рдУрд░ рдореБрдбрд╝рддреЗ рд╣реИрдВ, рдХреГрдкрдпрд╛ рд╣рдореЗрдВ рдЬреАрдУ рдХрдВрдкрд╛рдЗрд▓рд░ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд░реЗрдВред рдЗрди рдорд╛рдирдЪрд┐рддреНрд░реЛрдВ рдХреА рдЬрд╛рдирдХрд╛рд░реА рд╣рдореЗрдВ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдЦреЛрдЬрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╣рдо рдЬрд╛рдЧреЗ рдереЗ рдФрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреЗрдЬрд╛ рдЬрдм рдЬреАрдУ рдиреЗ рд▓рд╛рдЗрди рдирдВрдмрд░ 4 рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд┐рдпрд╛ред рдЬрдЧрд╣ рдкрд░ рдкрд╣реБрдВрдЪрдХрд░ рдФрд░ рдХрд╛рд░реНрдбреЛрдВ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рд╣рдордиреЗ рдкрд╛рдпрд╛ рдХрд┐ рдпрд╣ рдЦрд╛рд▓реА рдерд╛ (рдФрд░ рдпрд╣ рд╕рдЪ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЬреАрд╕реА рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ uintptr рдПрдХ рд╕рдВрдЦреНрдпрд╛ рд╣реИ рдФрд░ рдПрдХ рд╕реВрдЪрдХ рдирд╣реАрдВ рд╣реИ)ред рдЦреИрд░, рдХрд▓ рд╣рдордиреЗ j рдХреЗ рд▓рд┐рдП рдореЗрдореЛрд░реА рдХреЗ рдЖрд╡рдВрдЯрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реБрдирд╛, рдХреНрдпреЛрдВрдХрд┐ рдЕрдм рд╣рдо рдЗрд╕ рдореЗрдореЛрд░реА рдореЗрдВ рдирд╣реАрдВ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ - рд╣рдореЗрдВ рдЗрд╕реЗ рд╕рд╛рдлрд╝ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рдореЗрдореЛрд░реА рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рдмрд╛рдж рд╣рдо рд╕реЛ рдЬрд╛рддреЗ рд╣реИрдВредрдЖрдЧреЗ рдХреНрдпрд╛ рд╣реЛрдЧрд╛? рдЦреИрд░, рдЕрдзрд┐рдХрд╛рд░рд┐рдпреЛрдВ рдиреЗ рд░рд╛рдд рдореЗрдВ рдЬрд╛рдЧрддреЗ рд╣реБрдП, рдЪрд┐рд▓реНрд▓рд╛рддреЗ рд╣реБрдП рдХрд╣рд╛, рдареАрдХ рд╣реИ, рдЖрдк рдЦреБрдж рд╕рдордЭ рдЧрдПред

рдпрд╣ рд╕рдм рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЗ рд╕рд╛рде рд╣реИ, рдореИрдВ рдЕрднреНрдпрд╛рд╕ рдореЗрдВ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдпреЗ рд╕рднреА рд╕рдВрдХреЗрдд, рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдмрд┐рдВрджреБ рдФрд░ рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд╛рд░реНрдб рдФрд░ рд╕реНрдЯреИрдХ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред

рдЕрднреНрдпрд╛рд╕ рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВ


рдореИрдВрдиреЗ рдбрдмрд▓ рдкреНрд░реЛрдлрд╛рдЗрд▓ (1.14 рдкрд░ рдЬрд╛рдПрдВ рдФрд░ 1.13 рдкрд░ рдЬрд╛рдПрдВ) рд▓реЗрдЦ рдХреА рд╢реБрд░реБрдЖрдд рд╕реЗ рдкрд░рдлреЗрдХреНрдЯ рдкреНрд░реЛрдлрд╛рдЗрд▓рд░ рдХреЗ рдЙрджрд╛рд╣рд░рдг рд╕реЗ рджреЗрдЦрд╛ рдХрд┐ рдХреМрди рд╕реА рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рд╣реЛрддреА рд╣реИ рдФрд░ рдЙрдирдХреА рддреБрд▓рдирд╛ рдХрд░реЗрдВред 14 рд╡реЗрдВ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ syscall рдХрд╛рдлреА рдЬрд▓реНрджреА рдкрд╛рдпрд╛ рдЧрдпрд╛ рдерд╛:

15.652 ( 0.003 ms): main/29614 tgkill(tgid: 29613 (main), pid: 29613 (main), sig: URG                ) = 0

рдареАрдХ рд╣реИ, рдЬрд╛рд╣рд┐рд░ рд╣реИ рдХрд┐ рд░рдирдЯрд╛рдЗрдо рдиреЗ SIGURG рдХреЛ рдЙрд╕ рдзрд╛рдЧреЗ рдкрд░ рднреЗрдЬрд╛ рд╣реИ рдЬрд┐рд╕ рдкрд░ рдЧреЛрд░реЛрдЗрди рдШреВрдо рд░рд╣рд╛ рд╣реИред рдЗрд╕ рдЬреНрдЮрд╛рди рдХреЛ рдПрдХ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдмрд┐рдВрджреБ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗрддреЗ рд╣реБрдП, рдореИрдВ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдпрд╣ рд╕рдВрдХреЗрдд рдХрд╣рд╛рдБ рдФрд░ рдХрд┐рд╕ рдХрд╛рд░рдг рд╕реЗ рднреЗрдЬрд╛ рдЧрдпрд╛ рд╣реИ, рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП GO рдореЗрдВ рдХрдорд┐рдЯреНрд╕ рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЧрдпрд╛ рдерд╛, рдФрд░ рдЙрд╕ рд╕реНрдерд╛рди рдХреЛ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдЬрд╣рд╛рдБ рд╕рд┐рдЧреНрдирд▓ рд╣реИрдВрдбрд▓рд░ рд╕реНрдерд╛рдкрд┐рдд рд╣реИред рдЪрд▓реЛ рднреЗрдЬрдиреЗ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рд╣рдо рд░рдирдЯрд╛рдЗрдо / os_linux.go рдореЗрдВ рд╕рд┐рдЧреНрдирд▓ рднреЗрдЬрдиреЗ рд╡рд╛рд▓реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рджреЗрдЦреЗрдВрдЧреЗ


func signalM(mp *m, sig int) {
	tgkill(getpid(), int(mp.procid), sig)
}

рдЕрдм рд╣рдореЗрдВ рд░рдирдЯрд╛рдЗрдо рдХреЛрдб рдореЗрдВ рд╕реНрдерд╛рди рдорд┐рд▓рддреЗ рд╣реИрдВ, рдЬрд╣рд╛рдБ рд╕реЗ рд╣рдо рд╕рд┐рдЧреНрдирд▓ рднреЗрдЬрддреЗ рд╣реИрдВ:

  1. рдЬрдм рдЧреЛрд░реЛрдЗрдиреНрдЯреЗрди рд╕рд╕реНрдкреЗрдВрдб рд╣реЛрддрд╛ рд╣реИ, рдЕрдЧрд░ рд╡рд╣ рдЪрд╛рд▓реВ рдЕрд╡рд╕реНрдерд╛ рдореЗрдВ рд╣реЛред рд╕рд╕реНрдкреЗрдВрдб рдЕрдиреБрд░реЛрдз рдХрдЪрд░рд╛ рдХрд▓реЗрдХреНрдЯрд░ рд╕реЗ рдЖрддрд╛ рд╣реИред рдпрд╣рд╛рдВ, рд╢рд╛рдпрдж, рдореИрдВ рдХреЛрдб рдирд╣реАрдВ рдЬреЛрдбрд╝реВрдВрдЧрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдлрд╝рд╛рдЗрд▓ рд░рдирдЯрд╛рдЗрдо / preempt.go (suspendG) рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
  2. рдпрджрд┐ рдЕрдиреБрд╕реВрдЪрдХ рддрдп рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЧреЛрд░реЛрдЗрди рдмрд╣реБрдд рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ, рддреЛ рд░рдирдЯрд╛рдЗрдо / proc.go (рд░реАрдЯреЗрдХ)
    
    if pd.schedwhen+forcePreemptNS <= now {
    	signalM(_p_)
    }
    

    forcePreemptNS - 10ms, pd.schedwhen рдХреЗ рдмрд░рд╛рдмрд░ рд╕рдордп - рдЬрдм pd рд╕реНрдЯреНрд░реАрдо рдХреЗ рдЕрдиреБрд╕реВрдЪрдХ рдХреЛ рдЕрдВрддрд┐рдо рдмрд╛рд░ рдмреБрд▓рд╛рдпрд╛ рдЧрдпрд╛ рдерд╛
  3. рд╕рд╛рде рд╣реА рд╕рднреА рдзрд╛рд░рд╛рдПрдБ рдпрд╣ рд╕рдВрдХреЗрдд рдПрдХ рдЖрддрдВрдХ рдХреЗ рджреМрд░рд╛рди рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИ, StopTheWorld (GC) рдФрд░ рдХреБрдЫ рдФрд░ рдорд╛рдорд▓реЗ (рдЬреЛ рдореБрдЭреЗ рдмрд╛рдпрдкрд╛рд╕ рдХрд░рдиреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рд▓реЗрдЦ рдХрд╛ рдЖрдХрд╛рд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕реАрдорд╛ рд╕реЗ рдкрд░реЗ рд╣реЛ рдЬрд╛рдПрдЧрд╛)

рд╣рдордиреЗ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдпрд╛ рдХрд┐ рд░рдирдЯрд╛рдЗрдо рдХрдм рдФрд░ рдХреИрд╕реЗ рдПрдо рдХреЛ рд╕рд┐рдЧреНрдирд▓ рднреЗрдЬрддрд╛ рд╣реИред рдЕрдм рдЗрд╕ рд╕рд┐рдЧреНрдирд▓ рдХреЗ рд▓рд┐рдП рд╣реИрдВрдбрд▓рд░ рдвреВрдВрдвреЗрдВ рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рд╕реНрдЯреНрд░реАрдо рдкреНрд░рд╛рдкреНрдд рд╣реЛрдиреЗ рдкрд░ рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИред


func doSigPreempt(gp *g, ctxt *sigctxt) {
	if wantAsyncPreempt(gp) && isAsyncSafePoint(gp, ctxt.sigpc(), ctxt.sigsp(), ctxt.siglr()) {
		// Inject a call to asyncPreempt.
		ctxt.pushCall(funcPC(asyncPreempt))
	}
}

рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ "рд▓реЙрдХ рдЗрди" рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ 2 рдЪреЗрдХ рд╕реЗ рдЧреБрдЬрд░рдирд╛ рд╣реЛрдЧрд╛:

  1. wantAsyncPreempt - рд╣рдо рдЬрд╛рдБрдЪрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ G рдХреЛ рдЬрдмрд░рди рд╣рдЯрд╛рдпрд╛ рдЬрд╛рдирд╛ рд╣реИ, рдпрд╣рд╛рдБ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╡рд░реНрддрдорд╛рди рдЧреЛрд░реЛрдЗрдирд┐рди рд╕реНрдерд┐рддрд┐ рдХреА рд╡реИрдзрддрд╛ рдХреА рдЬрд╛рдБрдЪ рдХреА рдЬрд╛рдПрдЧреАред
  2. isAsyncSafePoint - рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдЕрднреА рдмрд╛рд╣рд░ рднреАрдбрд╝ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣рд╛рдВ рдЪреЗрдХ рдХрд╛ рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рдпрд╣ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЬреА рдПрдХ рд╕реБрд░рдХреНрд╖рд┐рдд рдпрд╛ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдмрд┐рдВрджреБ рдореЗрдВ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдореЗрдВ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЬрд┐рд╕ рдзрд╛рдЧреЗ рдкрд░ рдЬреА рдЪрд▓ рд░рд╣рд╛ рд╣реИ рд╡рд╣ рднреА рдЬреА рдХреЛ рдкреНрд░реАрдореАрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИред

рдпрджрд┐ рджреЛрдиреЛрдВ рдЪреЗрдХ рдкрд╛рд╕ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдХреЛрдб рд╕реЗ рдирд┐рд░реНрджреЗрд╢ рдмреБрд▓рд╛рдП рдЬрд╛рдПрдВрдЧреЗ рдЬреЛ рд░рд╛рдЬреНрдп рдЬреА рдХреЛ рдмрдЪрд╛рддреЗ рд╣реИрдВ рдФрд░ рдЕрдиреБрд╕реВрдЪрдХ рдХреЛ рдмреБрд▓рд╛рддреЗ рд╣реИрдВред

рдФрд░ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ


рдореИрдВ рдПрдХ рдирдП рдЙрджрд╛рд╣рд░рдг рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рддрд╛ рд╣реВрдВ, рдпрд╣ рдПрдХ рдЕрдиреНрдп рдорд╛рдорд▓реЗ рдХреЛ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд-рдмрд┐рдВрджреБ рдХреЗ рд╕рд╛рде рдЪрд┐рддреНрд░рд┐рдд рдХрд░реЗрдЧрд╛:

рдПрдХ рдФрд░ рдЕрдВрддрд╣реАрди рдХрд╛рд░реНрдпрдХреНрд░рдо

//go:nosplit
func infiniteLoop() {
	var u int
	for {
		u -= 2
		if u == 1 {
			break
		}
	}
}

func main() {
	runtime.GOMAXPROCS(1)
	go infiniteLoop()
	<-time.After(time.Millisecond * 5)

	fmt.Println("go 1.13 and 1.14 has never been here")
}


рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рд╢рд┐рд▓рд╛рд▓реЗрдЦ "рдЧреЛ 1.13 рдФрд░ 1.14 рдХрднреА рдпрд╣рд╛рдВ рдирд╣реАрдВ рдерд╛" рд╣рдо GO 1.14 рдореЗрдВ рдирд╣реАрдВ рджреЗрдЦреЗрдВрдЧреЗред рдЗрд╕рдХрд╛ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рд╣рдордиреЗ рдЕрдирдиреНрдд рд░реВрдк рд╕реЗ рдЕрдирдиреНрдд рд░реВрдк рд╕реЗ рдмрд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордирд╛ рдХрд┐рдпрд╛ рд╣реИ (рдЬрд╛рдУ: nosplit) рдлрд╝рдВрдХреНрд╢рдиред рдЗрд╕ рддрд░рд╣ рдХреЗ рдкреНрд░рддрд┐рдмрдВрдз рдХреЛ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд-рдмрд┐рдВрджреБ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рдкреВрд░реЗ рд╢рд░реАрд░ рдХрд╛ рдХрд╛рд░реНрдп рд╣реИред рдЖрдЗрдП рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдЕрдирдВрдд рдЕрдирдВрдд рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рд╕рдВрдХрд▓рдХ рдХреНрдпрд╛ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИред

рд╕рд╛рд╡рдзрд╛рдиреА рдЕрд╕реЗрдореНрдмрд▓рд░

        0x0000 00000 (main.go:10)   TEXT    "".infiniteLoop(SB), NOSPLIT|ABIInternal, $0-0
        0x0000 00000 (main.go:10)   PCDATA  $0, $-2
        0x0000 00000 (main.go:10)   PCDATA  $1, $-2
        0x0000 00000 (main.go:10)   FUNCDATA        $0, gclocals┬╖33cdeccccebe80329f1fdbee7f5874cb(SB)
        0x0000 00000 (main.go:10)   FUNCDATA        $1, gclocals┬╖33cdeccccebe80329f1fdbee7f5874cb(SB)
        0x0000 00000 (main.go:10)   FUNCDATA        $2, gclocals┬╖33cdeccccebe80329f1fdbee7f5874cb(SB)
        0x0000 00000 (main.go:10)   XORL    AX, AX
        0x0002 00002 (main.go:12)   JMP     8
        0x0004 00004 (main.go:13)   ADDQ    $-2, AX
        0x0008 00008 (main.go:14)   CMPQ    AX, $3
        0x000c 00012 (main.go:14)   JNE     4
        0x000e 00014 (main.go:15)   PCDATA  $0, $-1
        0x000e 00014 (main.go:15)   PCDATA  $1, $-1
        0x000e 00014 (main.go:15)   RET


рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, PCDATA рдирд┐рд░реНрджреЗрд╢ рд░реБрдЪрд┐ рдХрд╛ рд╣реИред рдЬрдм рд▓рд┐рдВрдХрд░ рдЗрд╕ рдирд┐рд░реНрджреЗрд╢ рдХреЛ рджреЗрдЦрддрд╛ рд╣реИ, рддреЛ рд╡рд╣ рдЗрд╕реЗ "рд╡рд╛рд╕реНрддрд╡рд┐рдХ" рдХреЛрдбрд╛рдВрддрд░рдХ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рд╕рдВрдЧрдд рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд╛рдЙрдВрдЯрд░ рдХреЗ рдмрд░рд╛рдмрд░ рдХреБрдВрдЬреА (рдлрд╝рдВрдХреНрд╢рди рдирд╛рдо + рд▓рд╛рдЗрди рдХреЗ рдмрд╛рдИрдВ рдУрд░ рджреЗрдЦреЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ) рдХреЗ рд╕рд╛рде 2 рддрд░реНрдХ рдХрд╛ рдорд╛рди рд░рдЬрд┐рд╕реНрдЯрд░ рдпрд╛ рд╕реНрдЯреИрдХ рдореИрдк (1 рддрд░реНрдХ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд) рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рдПрдЧрд╛ред

рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо 10 рдФрд░ 15 рдХреА рддрд░реНрдЬ рдкрд░ рджреЗрдЦрддреЗ рд╣реИрдВ, рд╣рдордиреЗ рдХреНрд░рдорд╢рдГ $ 2 рдФрд░ -1 рдХреЛ $ 0 рдФрд░ $ 1 рдХреЗ рдирдХреНрд╢реЗ рдореЗрдВ рд░рдЦрд╛ред рдЖрдЗрдП рдЗрд╕ рдХреНрд╖рдг рдХреЛ рдпрд╛рдж рдХрд░реЗрдВ рдФрд░ isAsyncSafePoint рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрдВрджрд░ рджреЗрдЦреЗрдВ, рдЬрд┐рд╕рд╕реЗ рдореИрдВрдиреЗ рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рдкрд╣рд▓реЗ рд╣реА рдЦреАрдВрдЪ рд▓рд┐рдпрд╛ рд╣реИред рд╡рд╣рд╛рдБ рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрдВрдХреНрддрд┐рдпрд╛рдБ рджреЗрдЦреЗрдВрдЧреЗ:

isAsyncSafePoint

	smi := pcdatavalue(f, _PCDATA_RegMapIndex, pc, nil)
	if smi == -2 {
		return false
	}


рдпрд╣ рдЗрд╕ рдЬрдЧрд╣ рдкрд░ рд╣реИ рдХрд┐ рд╣рдо рдЬрд╛рдВрдЪрддреЗ рд╣реИрдВ рдХрд┐ рдЧреЛрд░реЛрдЗрди рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╕реБрд░рдХреНрд╖рд┐рдд рдмрд┐рдВрджреБ рдкрд░ рд╣реИ рдпрд╛ рдирд╣реАрдВред рд╣рдо рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХреЗ рдирдХреНрд╢реЗ (_PCDATA_RegMapIndex = 0) рдХреА рдУрд░ рдореБрдбрд╝рддреЗ рд╣реИрдВ, рдФрд░ рдЗрд╕реЗ рд╡рд░реНрддрдорд╛рди рдкреАрд╕реА рдореЗрдВ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реБрдП рд╣рдо рдорд╛рди рдХреА рдЬрд╛рдБрдЪ рдХрд░рддреЗ рд╣реИрдВ, рдпрджрд┐ -2 рддреЛ G рд╕реБрд░рдХреНрд╖рд┐рдд-рдмрд┐рдВрджреБ рдореЗрдВ рдирд╣реАрдВ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЗрд╕реЗ рдмрд╛рд╣рд░ рдирд╣реАрдВ рдирд┐рдХрд╛рд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдирд┐рд╖реНрдХрд░реНрд╖


рдореИрдВрдиреЗ рдЗрд╕ рдкрд░ рдЕрдкрдирд╛ "рд╢реЛрдз" рд░реЛрдХ рджрд┐рдпрд╛, рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рд▓реЗрдЦ рдЖрдкрдХреЗ рд▓рд┐рдП рднреА рдЙрдкрдпреЛрдЧреА рдерд╛ред
рдореИрдВ рд╡рд╛рджрд╛ рдХрд┐рдП рдЧрдП рд▓рд┐рдВрдХ рдкреЛрд╕реНрдЯ рдХрд░рддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдХреГрдкрдпрд╛ рд╕рд╛рд╡рдзрд╛рди рд░рд╣реЗрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЗрди рд▓реЗрдЦреЛрдВ рдореЗрдВ рдХреБрдЫ рдЬрд╛рдирдХрд╛рд░реА рдкреБрд░рд╛рдиреА рд╣реЛ рд╕рдХрддреА рд╣реИред

рдЬрд╛рдУ рдЕрдиреБрд╕реВрдЪрдХ - рдПрдХ рдмрд╛рд░ рдФрд░ рджреЛ рдмрд╛рд░ ред

рдЕрд╕реЗрдВрдмрд▓рд░ рдЬреАрдУред

All Articles