mysql源代码学习偷看线程说明
MySQL可以启动,我们应该如何学习不能一步一步地从主的角度出发,把MySQL作为软件来比较底层数据库,涉及到数据库的各个方面,没有坚实的理论基础,也很熟悉mysql的各个模块,从主会介绍自己的死胡同啊,看什么,最后什么都没有,我们很脆弱。
经过思考,我想调试服务器通过客户端,所以它是更现实的学习服务器代码,通过客户端的动作,看服务器的响应。例如,从客户端登陆行动,看看服务器通信,用户识别,识别和任务分配,通过创建表,不同的物理存储服务器如何解析DDL和通过INSERT语句采取不同的存储引擎,服务器如何进行保存操作。看看如何创建并通过SELECT语句优化SQL语句的语法树,看看服务器的交易是通过回滚。这主要是通过MySQL数据库的代码跟踪的思路研究或特定的代码不做太多(主要是我不熟悉C++),好读书,不求甚解,哈哈。
因此,为服务器的分析准备了以下SQL语句。
复制代码代码如下所示:
1,登录(登录)
mysql.exe -中- P
2、DDL(建表语句)
创建表tb_myisam(C1 int,C2 varchar(256))= MyISAM引擎;
创建表tb_innodb(C1 int,C2 varchar(256))= InnoDB引擎;
3、插入
插入tb_myisam值(1,孤独的脂肪);
插入tb_innodb值(1,孤独的脂肪);
4、选择
选择从tb_myisam C1;
SELECT * FROM tb_innodb;
5、回滚
大家都知道,MySQL可以通过多个客户端的并发操作,也包括登录,当然,当他们登录,其他用户可以做一些其他的操作,所以我们想登录应该有一个特殊的线程的客户端和服务器连接的创建,确保每个用户的登录时间,,这个任务应该由一个独立的线程进行执行。
首先,我们介绍了在下一个MySQL中创建线程的功能,并创建线程的功能。它看起来像_begin_thread和CreateThread。我们在整个解决方案中通过VS找到它,宾果!在my_winthread。C,我们发现函数调用_begin_thread pthread_create。在os0thread。C,我们发现os_thread_create叫做CreateThread函数调用。一个系统如何封装两个系统功能定睛一看,发现my_winthread。C在项目mysys,和os0thread。C级Innobase项目下!!这不是InnoDB存储引擎的插件,它原来是存储引擎的封装底层功能。我认为MySQL的应用范围很广。除了开源之外,插件存储引擎也是不可或缺的。用户可以根据实际应用选择不同的存储引擎,对于大公司,他们将开发自己的存储引擎。
下面的分析pthread_create是如何调用_begin_thread,首先看源代码。
复制代码代码如下所示:
国际pthread_create(pthread_t * thread_id,pthread_attr_t *属性,
pthread_handler函数,void *参数)
{
处理包含指定选择器的线程;
结构pthread_map *地图;
dbug_enter(pthread_create );
如果(!(地图= malloc(sizeof(*地图)))))
dbug_return(- 1);
映射函数;
地图->参数=参数;
pthread_mutex_lock(thr_lock_thread);
# ifdef __borlandc__
包含指定选择器的线程=(处理)_beginthread((void(_userentry *)(void *))pthread_start,
属性->属性-> dwstacksize dwstacksize:
65535,(无效*)地图;
其他#
包含指定选择器的线程=(处理)_beginthread((void(__cdecl *)(void *))pthread_start,
属性->属性-> dwstacksize dwstacksize:
65535,(无效*)地图;
# endif
dbug_print(信息),(包含指定选择器的线程= %路
* thread_id =地图-> pthreadself =包含指定选择器的线程;
pthread_mutex_unlock(thr_lock_thread);
如果(包含指定选择器的线程=(处理)- 1)
{
int错误=错误;
dbug_print(误差
()不能创建线程来处理请求(错误%d)
dbug_return(误差:1);
}
无效(设定线程的优先级别(包含指定选择器的线程,属性->优先));
(0)dbug_return;
}
关键代码是以下三句话:
复制代码代码如下所示:
映射函数;
地图->参数=参数;
_beginthread((void(__cdecl *)(void *))pthread_start,
属性->属性-> dwstacksize dwstacksize:
65535,(无效*)地图;
从这里我们可以看到,一个新的线程创建的固定功能的pthread_start的名字,我们来创建函数func是安装在地图上,在同一地图的安装功能参数,因此我们可以推断pthread_start功能,会有这样的代码:
地图- >功能(图->参数);
MySQL没有选择直接_beginthread(函数,stack_size,参数)形式,但一个包,不知道这是什么好处专家观点不那么小,我菜鸟的顿悟,但~ ~
在这一点上,我们设置的断点在pthread_create功能,调试mysqld,打破断点,并看到系统线程的状态:
我们第一次进入pthread_create,没有线程开始创建。从理论上讲,系统线程应该只有一个主线,但现在有这么多线程。这些应该由InnoDB存储引擎创建的线程(特别是在plugin_init)。根据线程的名称,结合注释,它猜测这些线程的作用。
io_handler_thread:你可以知道的名字,这些都是我/ O线程负责磁盘I / O。
svr_error_monitor_thread:它应该是一个服务器错误监控线程。
svr_lock_timeout_thread:它应该是一个带锁的线程。
svr_master_thread:
/ *************************************************************************
控制服务器的主线程。
服务器控制的线程应该是特定于作业的线程。
svr_monitor_thread:
/ *************************************************************************
一个线程打印输出的信息通过各种InnoDB监视器..
监视线程并打印信息。
轻轻的飘,不去游说,我们只关心pthread_create线。在调试的基础上,具有相同名称的多个线程的线程_threadstart找到,如下所示:
调试表堆栈可以知道三个线程的创建者和角色,如下所示
造物主
处理功能
create_shutdown_thread
handle_shutdown
start_handle_manager
handle_manager
handle_connections_methods
handle_connections_sockets创作者:一个函数调用pthread_create创建一个线程。
处理功能:由pthread_create创建线程的线程函数称为具体。
从名字上我们可以看到,handle_connections_sockets应与螺纹的加工,在秩序方面,也应如此,只有在所有的其他线程的系统必须被创建,以创建监听线程(螺纹连接),监控系统应该由最后一个线程创建。
查找我们需要登录的线程。下一次这个线程,分析如何登录,以及在登录后分配给用户什么资源。
作者:在cnblogs没有代码