Go runtime 调度器精讲(九):系统调用引起的抢占

前言 第八讲介绍了当 goroutine 运行时间过长会被抢占的情况。这一讲继续看 goroutine 执行系统调用时间过长的抢占。 系统调用时间过长的抢占 看下面的示例: 1func longSyscall() { 2 timeout := syscall.NsecToTimeval(int64(5 * time.Second)) 3 fds := make([]syscall.FdSet, 1) 4 5 if _, err := syscall.Select(0, &fds[0], nil, nil, &timeout); err != nil { 6 fmt.Println("Error:", err) 7 } 8 9 fmt.Println("Select returned after timeout") 10} 11 12func main() { 13 threads := runtime.GOMAXPROCS(0) 14 for i := 0; i < threads; i++ { 15 go longSyscall() 16 } 17 18 time.Sleep(8 * time.Second) 19} longSyscall goroutine 执行一个 5s 的系统调用,在系统调用过程中,sysmon 会监控 longSyscall,发现执行系统调用过长,会对其抢占。 ...

2024-09-16 · xhy

Go runtime 调度器精讲(八):运行时间过长的抢占

前言 在 Go runtime 调度器精讲(七):案例分析 一文我们介绍了一个抢占的案例。从案例分析抢占的实现,并未涉及到源码层面。本文将继续从源码入手,看 Go runtime 调度器是如何实现抢占逻辑的。 ...

2024-09-16 · xhy

Go runtime 调度器精讲(七):案例分析

前言 前面用了六讲介绍 Go runtime 调度器,这一讲我们看一个关于调度 goroutine 的程序案例分析下调度器做了什么。需要说明的是,这个程序和抢占有关,抢占目前为止还没有介绍到,如果看不懂也没有关系,有个印象就行。 ...

2024-09-15 · xhy