mysql服务器端的进程_MySQL服务器连接过程分析

MysqLd是MysqL服务器端主进程,可以说MysqLd是MysqL的真正核心,一切工作都是围绕MysqLd进程进行的。所以要解剖MysqL这个庞然大物,MysqLd的代码是最好的突破口。

一切都是从熟悉的main()函数开始的,其实是从MysqLd_main()函数开始的。这些代码都在MysqLd.cc。MysqLd_main()随后调用了win_main)()。win_main()函数主要是做了一些初始化的工作。

初始化工作完成之后,MysqL已经做好准备接受连接了。然后我们的主角Handle_connections_methods()函数登场了。这个函数的主要工作是新建3个子进程,他们分别接受TCP/IP、命名管道以及共享内存这三种方式的连接。一般情况下客户都是用TCP/IP(socket)来连接MysqL服务器的,这是最有弹性的通信方式。但是在嵌入式软件的应用环境中,需要采用后两种通信方式。

简化后的handle_connections_methods()函数:

static void handle_connections_methods()

{

MysqL_mutex_lock(&LOCK_thread_count);

MysqL_cond_init(key_COND_handler_count,&COND_handler_count,NULL);

handler_count=0;

handler_count++;

MysqL_thread_create(key_thread_handle_con_namedpipes,&hThread,&connection_attrib,handle_connections_namedpipes,0));

handler_count++;

MysqL_thread_create(key_thread_handle_con_sockets,handle_connections_sockets_thread,0));

handler_count++;

MysqL_thread_create(key_thread_handle_con_sharedmem,handle_connections_shared_memory,0))

while (handler_count > 0)

MysqL_cond_wait(&COND_handler_count,&LOCK_thread_count);

MysqL_mutex_unlock(&LOCK_thread_count);

}

新建了3个线程之后,handle_connectins_methods()函数进入一个长时间循环,直到3个连接线程全部退出后才退出。这里我主要看看socket的连接线程,我们的研究对象就是这个handle_connections_sockets_thread。这个线程把自己初始化之后,就直接调用了handle_connections_sockets();

handle_connections_sockets()函数使用select()调用监听MysqLd的端口,然后等待客户端的连接。等到一个客户端连接后,这个函数中会新建一个THD类型的变量,这个变量是一个“交际花”,从连接建立开始,到sql语法分析、查询执行、结果返回等等。这个变量一直都在,总之这是一个非常重要的变量。

还有struct st_vio这个结构体,这个结构体是一个命令的中转站。在“交际花”THD中也定义了一个vio类型的结构体。这个结构体的功能就是从储存从套接字中读取通信内容,然后又把自己的值赋给THD的vio变量。VIO类型中详细的描述了一次请求,包括请求的内容、时间、请求的套接字地址等等。之后发生的事情就是把这个“交际花”传递到服务线程,create_thread_to_handle_connection()实现这个功能。

以下是删减后的代码

void create_thread_to_handle_connection(THD *thd)

{

if (cached_thread_count > wake_thread)

{

MysqL_cond_signal(&COND_thread_cache);

}

else

{

MysqL_thread_create(key_thread_one_connection,&thd->real_id,handle_one_connection,(void*) thd)));

}

}

这个函数会查看有没有闲置的缓存线程(MysqL不会把断开连接后的服务线程立即销毁掉,而是缓存了起来),如果有就是用缓存线程,如果没有就新建一个线程来服务连接。至此,一个连接就进入了服务线程,连接线程返回继续等待连接。

后边的内容就都是在服务线程中实现的,《深入理解MysqL》中有很详细的代码跟踪,感兴趣的同学可以看看。我把函数调用顺序附上,供参考。

handle_one_connection()

MysqL_thread_create()

handle_one_connection()

do_handle_one_connection()

init_new_connection_thread()

init_new_connection_handler_thread()

do_command()

dispatch_command()

MysqL_parse()

MysqL_execuate_command()

总结

以上是编程之家为你收集整理的MySQL服务器连接过程分析全部内容,希望文章能够帮你解决MySQL服务器连接过程分析所遇到的程序开发问题。

如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。

如您喜欢交流学习经验,点击链接加入交流1群:1065694478(已满)交流2群:163560250

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值