MySQL的网络

MySQL的网络层采用select+多线程的模型。

MySQL在Unix系统上使用mysqld_main()作为入口函数。

通过使用network_init来初始化监听端口并初始化调度器(MYSQL_CALLBACK_ELSE)。

通过使用handle_connections_sockets进入接收链接阶段。

当MySQL接收一个链接后会初始化一个THD(这个东西好像非常重要,MySQL的代码中多处可见,推测是线程上上下文有关系),并将这个THD和接入的链接关联起来。之后用这个THD创建新的线程(create_new_thread)。

create_new_thread先检测当前是否可以建立新的线程(当前处理链接线程总数是否超过总的链接的处理线程数),如果不能建立新的线程会主动关闭链接。线程建立成功后max_used_connections的计数器会增加。通过使用MYSQL_CALLBACK调用create_thread_to_handle_connection来完成真正的线程创建。

create_thread_to_handle_connection会先检测是否有预先创建而为使用的线程,如果有则直接从其中唤醒一个线程(mysql_cond_signal,不知道会不会引起惊群现象,需要继续的研究)。线程的主函是handle_one_connection。之后会调用do_handle_one_connection来处理当前的用户请求。而do_handle_one_connection本身是一个for循环,当用户链接断开,当前线程并不会退出,而是用one_thread_per_connection_end来进入线程缓存中,等待被重用。


你可能感兴趣的:(MySQL的网络)