05 2023 档案
摘要:# go语言select ## 使用 ```go func main() { ch1 := make(chan int, 1) ch2 := make(chan int, 1) go func() { time.Sleep(1 * time.Second) ch1 <- 1 }() go func(
阅读全文
摘要:# TCP/IP详解-地址解析协议ARP(1) IP协议的设计目标是为跨越不同类型物理网络的分组交换提供互操作。这需要网络层软件使用的地址和底层网络硬件使用的地址之间进行转换。网络接口硬件通常有一个主要的硬件地址定位到正确的接口;否则,无法传输数据。但是,一个传统IPv4网路偶需要使用自己的地址:3
阅读全文
摘要:# go语言调度gmp原理(5) ## 线程管理 go语言的运行时会通过调度器改变线程的所有权,它也提供了runtime.lockOSthread和runtime.UnlockOSthread,让我们能绑定goroutine和线程完成一些比较特殊的操作。goroutine应该在调用操作系统服务或者依
阅读全文
摘要:# go语言调度gmp原理(4) ## 触发调度 下面简单介绍所有触发调度的时间点。因为调度器的runtime.schedule会重新选择goroutine在线程上执行,所以我们只要找到该函数的调用方,就能找到所有触发调度的时间点 这里重点介绍运行时触发调度的几条路径 * 主动挂起——runtime
阅读全文
摘要:go语言调度gmp原理(3) 调度循环 调度器启动之后,go语言运行时会调用runtime.mstart和runtime.mstart1,前者会初始化g0的stackguard0和stackguard1字段,后者会初始化线程并调用runtime.schedule进入调度循环 func schedul
阅读全文
摘要:# go语言调度gmp原理(2) ## 创建goroutine 通过runtime.newproc函数调用,runtime.newproc的入参是参数大小和表示函数的指针funcval,它会获取goroutine以及调用方的程序计数器,然后调用runtime.newproc1函数获取新的gorout
阅读全文
摘要:# go语言调度gmp原理(1) ## 调度器启动 运行时通过runtime.schedinit初始化调度器 ```go func schedinit() { lockInit(&sched.lock, lockRankSched) lockInit(&sched.sysmonlock, lockR
阅读全文
摘要:go语言调度gmp数据结构 g 表示goroutine,它是待执行的任务 m 表示操作系统的线程,它由操作系统的调度器调度和管理 p 表示处理器,可以把它看作在线程上运行的本地调度器 G goroutine是go语言调度器中待执行的任务,它在运行时调度器中的地位和线程在操作系统中的地位差不多,但是它
阅读全文
摘要:redis事务 概述 redis中事务是一组命令的集合。事务同命令一样是redis的最小执行单位,一个事务中的命令要么都执行,要么都不执行。 事务的原理是先将属于一个事务的命令发送给redis,然后再让redis依次执行这些命令 redis保证一个事务中的所有命令要么都执行,要么都不执行。除此之外,
阅读全文