关闭 x
IT技术网
    技 采 号
    ITJS.cn - 技术改变世界
    • 实用工具
    • 菜鸟教程
    IT采购网 中国存储网 科技号 CIO智库

    IT技术网

    IT采购网
    • 首页
    • 行业资讯
    • 系统运维
      • 操作系统
        • Windows
        • Linux
        • Mac OS
      • 数据库
        • MySQL
        • Oracle
        • SQL Server
      • 网站建设
    • 人工智能
    • 半导体芯片
    • 笔记本电脑
    • 智能手机
    • 智能汽车
    • 编程语言
    IT技术网 - ITJS.CN
    首页 » MySQL »一起学习MySQL源码笔记之偷窥线程

    一起学习MySQL源码笔记之偷窥线程

    2011-04-22 14:14:00 出处:ITJS
    分享

    安装完Mysql后,使用VS打开源码开开眼,我嘞个去,这代码和想象中怎么差别这么大呢?感觉代码有些凌乱,注释代码都写的比较随意,好像没有什么统一的规范,不同的文件中代码风格也有差异,可能Mysql经过了很多牛人的手之后,集众牛人之长吧。也可能是我见识比较浅薄,适应了自己的代码风格,井底之蛙了,总之还是怀着敬畏的心情开始咱的源码之旅吧。本人菜鸟,大神轻拍。

    Mysql可以启动起来了,应该怎么学习呢?总不能从main开始一步一步的看吧,Mysql作为比较底层的大型软件,涉及到数据库实现的方方面面,没有厚实的数据库理论基础和对Mysql各个模块相当的熟悉,从main开始势必会把自己引入某个死胡同啊,什么都看,最后啥也不会,咱伤不起。

    经过思考后,我想还是通过客户端来调试服务器,从而学习服务器代码比较现实。也就是通过客户端的动作,看服务器的反应。比如从客户端的登录动作来看SERVER如何进行通信、用户识别、鉴定以及任务分配的,通过CREATE TABLE,来看SERVER如何解析DDL语句以及针对不同的存储引擎采取的不同的物理存储方式,通过INSERT语句,来看SERVER如何进行Btree的操作。通过SELECT语句来看如何进行SQL语句语法树的创建和优化的,通过ROLL BACK,来看SERVER事务是如何实现的。这里主要是通过跟踪代码学习Mysql数据库实现的思想,对于具体的代码不去做过多的追究(主要是我对C++不是很熟悉),好读书,不求甚解,呵呵。

    由此,暂时准备了以下几条SQL语句,来有针对的进行SERVER的分析

    1、LOGIN(登录)   mysql.exe –uroot –p  2、DDL(建表语句)  create table tb_myisam(c1 int, c2 varchar(256)) engine = myisam;  create table tb_innodb(c1 int, c2 varchar(256)) engine = innodb;  3、INSERT Insert into tb_myisam values(1 , ’寂寞的肥肉’);  Insert into tb_innodb values(1 , ’寂寞的肥肉’);  4、SELECT Select c1 from tb_myisam;  Select * from tb_innodb;  5、ROLLBACK 

    大家都知道,mysql可以通过多个客户端,进行并发操作,当然也包括登录了。在别人登录的时候,其他的用户可能正在进行一些其它的操作,因此对于登录我们猜测应该有专门的线程负责客户端和服务器的连接的创建,以保证登录的及时性,对于每个连接的用户,应该用一个独立的线程进行任务的执行。

    首先介绍下mysql中创建线程的函数,创建线程的函数貌似就是_begin_thread,CreateThread,我们通过VS在整个解决方案中进行查找,bingo!在my_winthread.c中找到了调用_begin_thread的函数pthread_create,在os0thread.c中找到了调用CreateThread的函数os_thread_create,一个系统怎么封装两个系统函数呢??再仔细看下,发现my_winthread.c是在项目mysys下,而os0thread.c是在项目innobase下。innobase!!这不就是innodb的插件式存储引擎么,原来这是存储引擎自己的封装的底层函数,哥心中豁然开朗了。我想Mysql应用范围如此之广,除了开源之外,插件式的存储引擎功不可没啊,用户可以根据自己的实际应用采取不同的存储引擎,对于大公司,估计会开发自己的存储引擎。

    下面分析下pthread_create是如何调用_begin_thread的,先粗略看下源码。

    int pthread_create(pthread_t *thread_id, pthread_attr_t *attr,     pthread_handler func, void *param)  {    HANDLE hThread;    struct pthread_map *map;    DBUG_ENTER("pthread_create");    if (!(map=malloc(sizeof(*map))))      DBUG_RETURN(-1);    map->func=func;    map->param=param;    pthread_mutex_lock(&THR_LOCK_thread);  #ifdef __BORLANDC__    hThread=(HANDLE)_beginthread((void(_USERENTRY *)(void *)) pthread_start,                     attr->dwStackSize   attr->dwStackSize :                     65535, (void*) map);  #else   hThread=(HANDLE)_beginthread((void( __cdecl *)(void *)) pthread_start,                     attr->dwStackSize   attr->dwStackSize :                     65535, (void*) map);  #endif    DBUG_PRINT("info", ("hThread=%lu",(long) hThread));    *thread_id=map->pthreadself=hThread;    pthread_mutex_unlock(&THR_LOCK_thread);    if (hThread == (HANDLE) -1)    {      int error=errno;      DBUG_PRINT("error",             ("Can't create thread to handle request (error %d)",error));      DBUG_RETURN(error   error : -1);    }    VOID(SetThreadPriority(hThread, attr->priority)) ;    DBUG_RETURN(0);  }  

    关键的代码是下面三句:

    map->func=func;  map->param=param;  _beginthread((void( __cdecl *)(void *)) pthread_start,                     attr->dwStackSize   attr->dwStackSize :                     65535, (void*) map);  

    从这可以看出,创建的新线程的名字是个固定的函数——pthread_start,而我们传进来的想创建的函数func是挂载在了map上了,函数的参数同样的挂载在map上了,这样我们就可以推理出在pthread_start函数中,肯定会出现这样的代码:

    map->func(map->param); 

    mysql没有选择直接_beginthread(func, stack_size, param)的形式,而是进行了一次封装,不知道这样的好处是什么,可能牛人的思想不是我这样小菜鸟能顿悟的,跑题了~~

    至此,我们只在pthread_create函数上设置断点,调试启动mysqld,断点停下来,看下系统的线程状况:

    www.itjs.cn

    我们第一次进入pthread_create,任何线程都没开始创建呢,按理说系统线程应该就只有一个主线程,可现在多了这么多,这些应该是innodb存储引擎创建的线程了(具体是在plugin_init)。根据线程的名称,结合注释,猜测了下这些线程的作用。

    Io_handler_thread:从名称可以知道这些是I/O线程,负责进行磁盘I/O。

    Svr_error_monitor_thread:应该是服务器出错监控线程。

    Svr_lock_timeout_thread:应该是和上锁相关的线程。

    Svr_master_thread:

    /*************************************************************************

    The master thread controlling the server. */

    服务器控制线程,应该是具体进行作业的线程。

    Svr_monitor_thread:

    /*************************************************************************

    A thread prints the info output by various InnoDB monitors. */

    监控线程,负责打印信息。

    淡然飘过吧,不去细究了,我们只关心pthread_create创建的线程。根据调试,发现多了几个线程同名的线程_threadstart,如下所示:

    www.itjs.cn

    调试时看堆栈可以知道这三个线程的创建者和作用,如下所示

    创建者 处理函数
    create_shutdown_thread handle_shutdown
    start_handle_manager  handle_manager
    handle_connections_methods  handle_connections_sockets

    创建者:调用pthread_create进行创建线程的函数。

    处理函数:调用pthread_create所创建的线程的具体的线程函数。

    由名称我们就可以看出,handle_connections_sockets应该是处理连接的线程了,从顺序上看,也应该是这样,只有系统中所有的其他必须的线程创建完毕后,才能创建监听线程(连接线程),即监听线程应该是系统最后创建的。

    找到了我们LOGIN需要的线程了,下次针对这个线程,分析下如何进行登录的,以及登录后为用户分配哪些资源。时间不早啦,洗洗睡了

    原文链接:http://www.cnblogs.com/nocode/archive/2011/04/21/2024330.html

    上一篇返回首页 下一篇

    声明: 此文观点不代表本站立场;转载务必保留本文链接;版权疑问请联系我们。

    别人在看

    抖音安全与信任开放日:揭秘推荐算法,告别单一标签依赖

    ultraedit编辑器打开文件时,总是提示是否转换为DOS格式,如何关闭?

    Cornell大神Kleinberg的经典教材《算法设计》是最好入门的算法教材

    从 Microsoft 下载中心安装 Windows 7 SP1 和 Windows Server 2008 R2 SP1 之前要执行的步骤

    Llama 2基于UCloud UK8S的创新应用

    火山引擎DataTester:如何使用A/B测试优化全域营销效果

    腾讯云、移动云继阿里云降价后宣布大幅度降价

    字节跳动数据平台论文被ICDE2023国际顶会收录,将通过火山引擎开放相关成果

    这个话题被围观超10000次,火山引擎VeDI如此解答

    误删库怎么办?火山引擎DataLeap“3招”守护数据安全

    IT头条

    平替CUDA!摩尔线程发布MUSA 4性能分析工具

    00:43

    三起案件揭开侵犯个人信息犯罪的黑灰产业链

    13:59

    百度三年开放2.1万实习岗,全力培育AI领域未来领袖

    00:36

    工信部:一季度,电信业务总量同比增长7.7%,业务收入累计完成4469亿元

    23:42

    Gartner:2024年全球半导体营收6559亿美元,AI助力英伟达首登榜首

    18:04

    技术热点

    iOS 8 中如何集成 Touch ID 功能

    windows7系统中鼠标滑轮键(中键)的快捷应用

    MySQL数据库的23个特别注意的安全事项

    Kruskal 最小生成树算法

    Ubuntu 14.10上安装新的字体图文教程

    Ubuntu14更新后无法进入系统卡在光标界面解怎么办?

      友情链接:
    • IT采购网
    • 科技号
    • 中国存储网
    • 存储网
    • 半导体联盟
    • 医疗软件网
    • 软件中国
    • ITbrand
    • 采购中国
    • CIO智库
    • 考研题库
    • 法务网
    • AI工具网
    • 电子芯片网
    • 安全库
    • 隐私保护
    • 版权申明
    • 联系我们
    IT技术网 版权所有 © 2020-2025,京ICP备14047533号-20,Power by OK设计网

    在上方输入关键词后,回车键 开始搜索。Esc键 取消该搜索窗口。