1、channel数据结构 1.1 结构定义 //src/runtime/chan.go type hchan struct { qcount uint //缓冲区队列中元素总数 dataqsiz uint //缓冲区队列大小 buf unsafe.Pointer //缓冲区队列,用于存放元素,该缓冲区模拟环形结构 elemsize uint16 //元素大小 closed uint32 //channel是否关闭,关闭设为1 elemtype *_type //元素类型 sendx u…
1、channel数据结构 1.1 结构定义 //src/runtime/chan.go type hchan struct { qcount uint //缓冲区队列中元素总数 dataqsiz uint //缓冲区队列大小 buf unsafe.Pointer //缓冲区队列,用于存放元素,该缓冲区模拟环形结构 elemsize uint16 //元素大小 closed uint32 //channel是否关闭,关闭设为1 elemtype *_type //元素类型 sendx u…
1、背景 本文主要介绍MySQL中ibd文件的存储结构,并配套开发了解析ibd文件的代码:https://github.com/jemuelmiao/parseibd,该代码输出结果可以一目了然的看到ibd文件中当前的存储结构、btree中page的连接关系、聚簇索引或二级索引的组织格式等。 2、表空间 MySQL中最顶层的逻辑管理结构是表空间,根据用途表空间分为如下几类: 系统表空间:存放数据字典(data dict)、双写缓存(double write buffer)、变更缓存(change buffer)、回…
1、MDL MDL是metadata lock的简写,即元数据锁,该锁是在Server层实现的,用于保证并发操作时元数据的一致性,如DDL和DML并发时,保护表结构数据。接下来本文会从源码角度分析MDL的实现。 2、数据结构 要分析MDL源码,需要了解其中几个重要的数据结构:MDL_request、MDL_lock、MDL_ticket、MDL_key、MDL_context、MDL_map。 2.1 MDL_request MDL_request表示MDL锁请求,该对象在MDL子系统外部创建,生命周期由外部控制。…
1、背景 最近参与开发一个java项目,每次修改调试时就需要重启进程,由于工程较大,进程初始化任务较多,重启较慢,严重影响了开发效率,因此花了点时间研究java热更新机制,在项目中引入热更新后,每次的修改可以立即看到结果,提高了开发效率。 2、JavaAgent JavaAgent是java程序代理,可以在程序启动或运行时插入自定义代码执行指定操作,根据代理时机分为启动时代理和运行时代理,经常被用于字节码修正。 2.1 启动时代理 该特性是在JDK1.5之后引入,在启动程序时通过javaagent参数指定代理类,代…
1、背景 最近参与开发的java项目存在比较严重的性能问题,前端访问经常需要很长时间才能获得回包,为了定位系统中的热点区域,需要对系统进行profile,然后针对性的优化。所谓工欲善其事必先利其器,一个好的profile工具需要具备:1、能以图形化形式统计各种性能指标的详细信息,包括内存、CPU、函数调用耗时等信息。2、对原应用影响小。3、能方便进行远程profile。基于以上几点,最终我选择了JProfiler,这个工具的功能非常强大,能满足profile的各种需求。 2、JProfiler介绍 JProfile…
导语 本文基于go1.16.7的源码,详细介绍MPG调度模型的实现。 1、程序启动引导 1.1 程序入口地址 我们写一个最简单的示例程序main.go来看看程序的入口: package main import “fmt” func main() { fmt.Println(“jemuel”) } 在Linux机器上编译:go build -o main main.go。编译后会生成可执行文件main,该文件为ELF格式。 可以通过以下方式查看程序入口地址(Entry point address): 1、通过read…
1、发送接收数据包流程 在介绍登录流程之前,让我们先看看mysql发送、接收数据包流程,mysql数据包有固定的协议格式,即每个数据包都包含一个4字节包头,其中前三个字节指定数据包大小,最后一个字节指定数据包序列号,序列号用于保证数据包的顺序,如下图所示: 1.1 发送数据包 //文件net_serv.cc //发送逻辑数据包,将逻辑数据包按照大小0xffffff(16M)分割为一个或多个物理数据包,物理数据包增加数据头部,头部包括包长度、包序号。 my_bool my_net_write(NET *net, c…
以下介绍服务启动调用流程及注释 //文件main.cc int main(int argc, char **argv) { return mysqld_main(argc, argv); } //文件mysqld.cc int mysqld_main(int argc, char **argv) { ... //初始化 my_init() //启动服务 mysql_service(NULL); ... } //文件mysqld.cc int mysql_service(void *p) { ... win_main…
1、安装依赖环境 本文介绍的是Windows平台编译环境搭建,安装过程中路径尽量不要有空格,避免踩坑。 Visual Studio,版本:2019 MySQL源码,版本:5.7.35 cmake,版本:3.22.0,下载地址:http://www.cmake.org/cmake/resources/software.html bison,版本:2.4.1,下载地址:http://downloads.sourceforge.net/gnuwin32/bison-2.4.1-bin.zip bison-deps,版本:…
1、调度器改造 1.1 原生golang调度器 1.1.1 调度器架构 图1 原生调度器架构 1.1.2 数据结构 runqhead:代表P本地任务队列头指针,获取任务时向前移动,可能会被多个线程同时修改。 runqtail:代表P本地任务队列尾指针,增加任务时向前移动,只能被当前线程修改。 runq:代表P本地任务队列。 runnext:代表下一次将运行的任务。 1.1.3 算法流程 调度器的主要算法集中在处理任务队列变化情况,其中任务队列包括P的本地任务队列和全局任务队列,任务队列的变化主要包括以下几种情况: …
COPYRIGHT © 2021 www.miaozhouguang.com. ALL RIGHTS RESERVED.