mysql启动过程的详细说明
有一天,两个不了解MySQL内核的人想知道MySQL内核代码,而两个人并没有去调试代码和查找数据,而是在那里思考,因为你不知道内核,你想并验证它。使用MySQL代码5.1.7,和调试环境是Windows平台下的VS2003。
Bingxi:亚历克斯,你认为对MySQL的开始吗让我们以银行为例。
亚历克斯:好的,Bingxi。银行在早上打开时,它将首先开放环境对客人的门。所以是MySQL,MySQL将有handle_connections_sockets函数,这个函数是一个叫号机,每个用户都会拿一个号码,然后将业务处理。
复制代码如下:pthread_handler_t handle_connections_sockets(void *精__attribute__(((未使用的)))
{
......
而(!abort_loop)
{
选择((int)max_used_connection,readfds,0,0,0)<0) / /连接下执行,否则等待
......
接受(袜子,my_reinterpret_cast(struct sockaddr *)(caddr),长度) / /接受请求
......
create_new_thread(THD);
}
/ / abort_loop = 1,然后执行出来。业务处理不今天
}
Bingxi:啊,有两种可能,1)用户分配一个工作人员,2)将安排人到工作队列中,根据指定的窗口访问服务亭。场景是适合大量的请求和响应速度很快,但分布会有一个限度,对最大连接数,这种情况在互联网行业中是常见的,因此我们可以看到机器的负载范围特别大。同样,这也是它的一个缺点。假设每个业务都是复杂的(消耗资源SQL语句),同时,机器将无法支持它。同时,第二种方式更好,这是一种事务场景。
亚历克斯:嗯,是的,MySQL选择了前者,Oracle提供了两种选择方法。如果我们配置了线程缓存并提供了可用的缓存,我们就可以唤醒线程或者创建一个新线程。
复制代码代码如下所示:
静态create_new_thread(THD * THD)
{
如果(cached_thread_count > wake_thread)
{
start_cached_thread(THD);
}
其他的
{
如果((误差= pthread_create(THD -> real_id,connection_attrib,)
handle_one_connection,
(* * THD))
}
}
Bingxi:嗯,杨。它是了解银行已分配给客户服务人员,在这一时期已经服务于客户。有一段代码,它总是由用户订购的。但这是可能的,网络,或杀掉了,像是谁救了100人,被以1美元的个人安全。
复制代码代码如下所示:
pthread_handler_t handle_one_connection(void *参数)
{
而(!网->网络-> VIO误差!= 0)
!(THD ->杀了= =总谐波失真::kill_connection))
{
网-> no_send_error = 0;
如果(do_command(THD))
打破;
}
}
亚历克斯:嗯,得到命令,然后执行命令。在dispatch_command功能,根据不同的客户需求响应的处理,如开户,存钱,等。
复制代码代码如下所示:
布尔do_command(THD * THD)
{
如果((packet_length = my_net_read(净))= = packet_error) / /得到命令
dbug_return(dispatch_command(命令、THD、包+ 1(个)packet_length));
}