• MySQL源码之mysqld启动


    启动mysqld,并进入listen阶段
     
    函数调用栈:
    mysqld_main():  
         my_init();初始化变量,锁,错误串
         my_thread_global_init(): 初始化互斥锁,信号量,线程独享变量
         load_defaults();查找my.cnf
         sys_var_init();初始化system variables
         init_common_variables:初始化mutex,status变量
         init_signals:初始化信号量处理
         init_server_components:装载innodb引擎
         network_init: 初始化网络组件
         start_signal_handler:处理信号的线程
         execute_ddl_log_recovery:执行innodb的recovery
         handle_connections_sockets:开始处理connection请求
     
    my_init():
         文件/目录 umask
         结构化标准IO的文件handler:MYSQL_FILE
         init_glob_errs():初始化global错误文本数组
         获取home环境变量
     
     my_thread_global_init():
         1. 线程独享变量:
              [pthread_key]THR_KEY_mysys来控制线程独享结构体变量[st_my_thread_var:包含线程ID,error,锁等信息],后续都通过              
                                         pthread_getspecific在线程内进行获取。
          2. init全局互斥锁:THR_LOCK_malloc,THR_LOCK_open,THR_LOCK_charset,THR_LOCK_threads,THR_LOCK_lock,
                                  THR_LOCK_isam,
                                       THR_LOCK_myisam,THR_LOCK_myisam_mmap,THR_LOCK_heap,THR_LOCK_net,
          3. init全局信号量:THR_COND_threads
          4. 创建一个样本thread,随即就结束【dummy_thread】
     
      
    load_defaults():
         获取my.cnf的候选目录包括:/etc/my.cnf  /etc/mysql/my.cnf  $MYSQL_HOME/my.cnf  ~/my.cnf ./my.cnf
     
     
    sys_var_init():
         系统中所有的system variables都实例化成继承类[sys_var]的static对象,并加入到链表中sys_var_chain all_sys_vars中,
         最后通过链接全部加入到[system_variable_hash]hash表中。
         
    init_common_variables():
         init了大量的mutex和condition:还没有看明白是啥用途
         初始化mysqld.cc定义的全局变量
         初始化默认storage engine
         所有show status 需要的变量加入到all_status_vars
      
    init_server_components():
         初始化user_state,client_state,thread_state.
         装载innodb引擎
         
    network_init():
         初始化网络接口,建立socket,并开始listener。
     
    start_signal_handler():
         创建处理signal的一个独立线程
     
    handle_connections_sockets:
         开始处理connection请求,使用epoll socket描述符的方式listen connect request,
    并对没有请求连接创建一个THD对象,并作为一个新thread的参数。
  • 相关阅读:
    友链
    Vue打包后处理跨域
    es6 Promise
    express get和post数据
    Nodejs登陆注册应用
    bootstrap按钮
    vue-router
    vue--transition多个元素运动
    $ git push -u origin masterremote时出现错误: error: GH007: Your push would publish a private email address.
    vue.js监听
  • 原文地址:https://www.cnblogs.com/xpchild/p/3694782.html
Copyright © 2020-2023  润新知