编辑
2023-12-04
后端
00

MySQL请求处理过程大致可以分为以下几个阶段:

  1. 连接管理/连接器:
    • 客户端与服务器进程之间建立连接,可以使用TCP/IP、命名管道或共享内存等方式进行连接。
    • 客户端提供主机信息、用户名和密码等,服务器对提供的信息进行认证和权限验证
  2. 解析与优化:
    • 查询缓存(MySQL 8中已取消):MySQL会将查询请求的结果进行缓存处理,如果有相同的请求访问,会直接返回缓存结果。
    • 语法解析:对请求进行词法解析、语法解析和语义解析,从指定的文本中获取查询条件。
    • 查询优化:根据查询条件生成执行计划,包括使用哪些索引、表的连接顺序等。
编辑
2023-12-04
后端
00

Go语言的CSP(Communicating Sequential Processes)并发模型是一种并发编程模型,它基于通信来实现并发控制,而不是共享内存。这个模型的核心思想是通过通信来共享内存,而不是通过共享内存来通信。Go语言通过goroutine和channel来实现CSP模型。

  1. Goroutine(协程):
    • Goroutine是Go语言中的轻量级线程,它可以在并发执行的实体之间进行切换。
    • Goroutine可以看作是并发执行的实体,它可以独立执行一段代码,拥有自己的栈空间。
    • Goroutine之间的切换是由Go语言的调度器自动完成的,开发者无需关心具体的调度细节。
编辑
2023-12-04
后端
00

Go Channel底层原理及源码解析

Channel是Go语言中用于协程之间通信的重要机制。它的底层实现原理相对简单,通过分析源码可以更好地理解其工作原理。

go
type hchan struct { //channel分为无缓冲和有缓冲两种。 //对于有缓冲的channel存储数据,借助的是如下循环数组的结构 qcount uint // 循环数组中的元素数量 dataqsiz uint // 循环数组的长度 buf unsafe.Pointer // 指向底层循环数组的指针 elemsize uint16 //能够收发元素的大小 closed uint32 //channel是否关闭的标志 elemtype *_type //channel中的元素类型 //有缓冲channel内的缓冲数组会被作为一个“环型”来使用。 //当下标超过数组容量后会回到第一个位置,所以需要有两个字段记录当前读和写的下标位置 sendx uint // 下一次发送数据的下标位置 recvx uint // 下一次读取数据的下标位置 //当循环数组中没有数据时,收到了接收请求,那么接收数据的变量地址将会写入读等待队列 //当循环数组中数据已满时,收到了发送请求,那么发送数据的变量地址将写入写等待队列 recvq waitq // 读等待队列 sendq waitq // 写等待队列 lock mutex //互斥锁,保证读写channel时不存在并发竞争问题 }

image.png

  1. Channel的基本概念

编辑
2023-12-04
后端
00

Go协程调度模型是通过GMP模型来实现的。GMP模型由三个组件组成:Goroutine(G)、Mac

编辑
2023-12-04
后端
00

Go Runtime 和 Go 应用之间的关系以及 Runtime 是如何被编译到二进制的

Go