程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> Mysql源碼進修筆記 竊視線程

Mysql源碼進修筆記 竊視線程

編輯:MySQL綜合教程

Mysql源碼進修筆記 竊視線程。本站提示廣大學習愛好者:(Mysql源碼進修筆記 竊視線程)文章只能為提供參考,不一定能成為您想要的結果。以下是Mysql源碼進修筆記 竊視線程正文


感到代碼有些紛亂,正文代碼都寫的比擬隨便,似乎沒有甚麼同一的標准,分歧的文件中代碼作風也有差別,能夠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,斷點停上去,看下體系的線程狀態:


我們第一次進入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,以下所示:

  調試時看客棧可以曉得這三個線程的創立者和感化,以下所示

創立者

處置函數

create_shutdown_thread

handle_shutdown

start_handle_manager

handle_manager

handle_connections_methods

handle_connections_sockets

創立者:挪用pthread_create停止創立線程的函數。

  處置函數:挪用pthread_create所創立的線程的詳細的線程函數。

 

  由稱號我們便可以看出,handle_connections_sockets應當是處置銜接的線程了,從次序上看,也應當是如許,只要體系中一切的其他必需的線程創立終了後,能力創立監聽線程(銜接線程),即監聽線程應當是體系最初創立的。

    找到了我們LOGIN須要的線程了,下次針對這個線程,剖析下若何停止登錄的,和登錄後為用戶分派哪些資本。時光不早啦,洗洗睡了
作者 : cnblogs 心中無碼

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved