首次提交:初始化项目代码

This commit is contained in:
sunct
2026-07-31 15:18:32 +08:00
commit d6393266b0
193 changed files with 14287 additions and 0 deletions
+104
View File
@@ -0,0 +1,104 @@
package main
import (
"fmt"
"runtime"
"sync"
"time"
)
var wgp sync.WaitGroup
// 辅助函数:打印Goroutine栈信息(间接判断状态)
func printGStack(msg string) {
buf := make([]byte, 2048)
n := runtime.Stack(buf, true)
fmt.Printf("\n【%s】Goroutine栈快照:\n%s\n", msg, buf[:n])
}
// demo1: 验证基础状态流转(_Gidle→_Grunnable→_Grunning→_Gdead)对应节点【A】【B】【C】
func demoBasicStateTransition() {
fmt.Println("=== demo1: 基础状态流转(对应节点【A】【B】【C】) ===")
wgp.Add(1)
go func() {
defer wgp.Done()
printGStack("G1: 运行态(_Grunning,对应节点【B】)")
time.Sleep(100 * time.Millisecond)
}()
wgp.Wait()
printGStack("G1: 退出态(_Gdead,对应节点【C】)后主线程状态")
fmt.Println("demo1 完成\n")
}
// demo2: 验证系统调用态流转(_Grunning→_Gsyscall→_Grunnable→_Gdead)对应节点【E】【I】
func demoSyscallState() {
fmt.Println("=== demo2: 系统调用态流转(对应节点【E】【I】) ===")
wgp.Add(1)
go func() {
defer wgp.Done()
fmt.Println("G2: 执行模拟系统调用(对应节点【E】)")
time.Sleep(200 * time.Millisecond) // 模拟syscall,标记为_Gsyscall
fmt.Println("G2: 系统调用完成(对应节点【I】)")
}()
time.Sleep(50 * time.Millisecond) // 等待G2进入_Gsyscall
printGStack("G2: 系统调用态(_Gsyscall,对应节点【E】)快照")
wgp.Wait()
fmt.Println("demo2 完成\n")
}
// demo3: 验证栈拷贝态流转(_Grunning→_Gcopystack→_Grunnable→_Grunning)对应节点【G】【M】
func demoCopyStackState() {
fmt.Println("=== demo3: 栈拷贝态流转(对应节点【G】【M】) ===")
wgp.Add(1)
go func() {
defer wgp.Done()
// 递归调用触发栈扩容,通过使用buf确保栈空间被真实占用
var recursiveFunc func(n int) []byte
recursiveFunc = func(n int) []byte {
if n == 0 {
printGStack("G3: 栈拷贝完成(_Gcopystack→_Grunnable,对应节点【M】)")
return make([]byte, 0)
}
buf := make([]byte, 1024*8) // 每次分配8KB,真实占用栈空间触发扩容
fmt.Printf("G3: 递归层级%d,触发栈拷贝(对应节点【G】)\n", n)
// 通过递归返回值引用buf,避免被编译器优化掉
return append(buf, recursiveFunc(n-1)...)
}
recursiveFunc(10)
}()
wgp.Wait()
fmt.Println("demo3 完成\n")
}
// demo4: 验证抢占态流转(_Grunning→_Gpreempted→_Grunnable→_Grunning)对应节点【AB】-【AE】【P】【V】
func demoPreemptedState() {
fmt.Println("=== demo4: 抢占态流转(对应节点【AB】-【AE】【P】【V】) ===")
wgp.Add(2)
// 长任务G4:运行20ms,触发抢占
go func() {
defer wgp.Done()
fmt.Println("G4: 长任务启动(_Grunning,对应节点【B】)")
start := time.Now()
for time.Since(start) < 20*time.Millisecond { /* 无函数调用,触发抢占 */
}
fmt.Println("G4: 长任务完成(_Gpreempted→_Grunnable,对应节点【P】【V】)")
}()
// 短任务G5:验证抢占后调度
go func() {
defer wgp.Done()
fmt.Println("G5: 短任务启动(_Grunnable,对应节点【A】)")
time.Sleep(50 * time.Millisecond)
fmt.Println("G5: 短任务完成(证明G4被抢占,对应节点【AE】)")
}()
wgp.Wait()
fmt.Println("demo4 完成\n")
}
func main() {
fmt.Printf("CPU核心数:%d\n初始GOMAXPROCS%d\n\n", runtime.NumCPU(), runtime.GOMAXPROCS(-1))
demoBasicStateTransition()
demoSyscallState()
demoCopyStackState()
demoPreemptedState()
fmt.Println("所有核心场景验证完成")
}