最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Mysql源碼學(xué)習(xí)筆記 偷窺線程

 更新時間:2011年04月23日 23:27:25   作者:  
安裝完Mysql后,使用VS打開源碼開開眼,我嘞個去,這代碼和想象中怎么差別這么大呢?
感覺代碼有些凌亂,注釋代碼都寫的比較隨意,好像沒有什么統(tǒng)一的規(guī)范,不同的文件中代碼風(fēng)格也有差異,可能Mysql經(jīng)過了很多牛人的手之后,集眾牛人之長吧。也可能是我見識比較淺薄,適應(yīng)了自己的代碼風(fēng)格,井底之蛙了,總之還是懷著敬畏的心情開始咱的源碼之旅吧。本人菜鳥,大神輕拍。

  Mysql可以啟動起來了,應(yīng)該怎么學(xué)習(xí)呢?總不能從main開始一步一步的看吧,Mysql作為比較底層的大型軟件,涉及到數(shù)據(jù)庫實現(xiàn)的方方面面,沒有厚實的數(shù)據(jù)庫理論基礎(chǔ)和對Mysql各個模塊相當(dāng)?shù)氖煜?,從main開始勢必會把自己引入某個死胡同啊,什么都看,最后啥也不會,咱傷不起。

  經(jīng)過思考后,我想還是通過客戶端來調(diào)試服務(wù)器,從而學(xué)習(xí)服務(wù)器代碼比較現(xiàn)實。也就是通過客戶端的動作,看服務(wù)器的反應(yīng)。比如從客戶端的登錄動作來看SERVER如何進(jìn)行通信、用戶識別、鑒定以及任務(wù)分配的,通過CREATE TABLE,來看SERVER如何解析DDL語句以及針對不同的存儲引擎采取的不同的物理存儲方式,通過INSERT語句,來看SERVER如何進(jìn)行Btree的操作。通過SELECT語句來看如何進(jìn)行SQL語句語法樹的創(chuàng)建和優(yōu)化的,通過ROLL BACK,來看SERVER事務(wù)是如何實現(xiàn)的。這里主要是通過跟蹤代碼學(xué)習(xí)Mysql數(shù)據(jù)庫實現(xiàn)的思想,對于具體的代碼不去做過多的追究(主要是我對C++不是很熟悉),好讀書,不求甚解,呵呵。
  由此,暫時準(zhǔn)備了以下幾條SQL語句,來有針對的進(jìn)行SERVER的分析
復(fù)制代碼 代碼如下:

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可以通過多個客戶端,進(jìn)行并發(fā)操作,當(dāng)然也包括登錄了。在別人登錄的時候,其他的用戶可能正在進(jìn)行一些其它的操作,因此對于登錄我們猜測應(yīng)該有專門的線程負(fù)責(zé)客戶端和服務(wù)器的連接的創(chuàng)建,以保證登錄的及時性,對于每個連接的用戶,應(yīng)該用一個獨(dú)立的線程進(jìn)行任務(wù)的執(zhí)行。
  首先介紹下mysql中創(chuàng)建線程的函數(shù),創(chuàng)建線程的函數(shù)貌似就是_begin_thread,CreateThread,我們通過VS在整個解決方案中進(jìn)行查找,bingo!在my_winthread.c中找到了調(diào)用_begin_thread的函數(shù)pthread_create,在os0thread.c中找到了調(diào)用CreateThread的函數(shù)os_thread_create,一個系統(tǒng)怎么封裝兩個系統(tǒng)函數(shù)呢??再仔細(xì)看下,發(fā)現(xiàn)my_winthread.c是在項目mysys下,而os0thread.c是在項目innobase下。innobase!!這不就是innodb的插件式存儲引擎么,原來這是存儲引擎自己的封裝的底層函數(shù),哥心中豁然開朗了。我想Mysql應(yīng)用范圍如此之廣,除了開源之外,插件式的存儲引擎功不可沒啊,用戶可以根據(jù)自己的實際應(yīng)用采取不同的存儲引擎,對于大公司,估計會開發(fā)自己的存儲引擎。
  下面分析下pthread_create是如何調(diào)用_begin_thread的,先粗略看下源碼。
復(fù)制代碼 代碼如下:

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);
}

關(guān)鍵的代碼是下面三句:
復(fù)制代碼 代碼如下:

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

從這可以看出,創(chuàng)建的新線程的名字是個固定的函數(shù)——pthread_start,而我們傳進(jìn)來的想創(chuàng)建的函數(shù)func是掛載在了map上了,函數(shù)的參數(shù)同樣的掛載在map上了,這樣我們就可以推理出在pthread_start函數(shù)中,肯定會出現(xiàn)這樣的代碼:
              map->func(map->param);
  mysql沒有選擇直接_beginthread(func, stack_size, param)的形式,而是進(jìn)行了一次封裝,不知道這樣的好處是什么,可能牛人的思想不是我這樣小菜鳥能頓悟的,跑題了~~
  至此,我們只在pthread_create函數(shù)上設(shè)置斷點(diǎn),調(diào)試啟動mysqld,斷點(diǎn)停下來,看下系統(tǒng)的線程狀況:


我們第一次進(jìn)入pthread_create,任何線程都沒開始創(chuàng)建呢,按理說系統(tǒng)線程應(yīng)該就只有一個主線程,可現(xiàn)在多了這么多,這些應(yīng)該是innodb存儲引擎創(chuàng)建的線程了(具體是在plugin_init)。根據(jù)線程的名稱,結(jié)合注釋,猜測了下這些線程的作用。
   Io_handler_thread:從名稱可以知道這些是I/O線程,負(fù)責(zé)進(jìn)行磁盤I/O。
Svr_error_monitor_thread:應(yīng)該是服務(wù)器出錯監(jiān)控線程。
Svr_lock_timeout_thread:應(yīng)該是和上鎖相關(guān)的線程。
Svr_master_thread:
/*************************************************************************
The master thread controlling the server. */
服務(wù)器控制線程,應(yīng)該是具體進(jìn)行作業(yè)的線程。
Svr_monitor_thread:
/*************************************************************************
A thread prints the info output by various InnoDB monitors. */
監(jiān)控線程,負(fù)責(zé)打印信息。

  淡然飄過吧,不去細(xì)究了,我們只關(guān)心pthread_create創(chuàng)建的線程。根據(jù)調(diào)試,發(fā)現(xiàn)多了幾個線程同名的線程_threadstart,如下所示:

  調(diào)試時看堆棧可以知道這三個線程的創(chuàng)建者和作用,如下所示

創(chuàng)建者

處理函數(shù)

create_shutdown_thread

handle_shutdown

start_handle_manager

handle_manager

handle_connections_methods

handle_connections_sockets

創(chuàng)建者:調(diào)用pthread_create進(jìn)行創(chuàng)建線程的函數(shù)。

  處理函數(shù):調(diào)用pthread_create所創(chuàng)建的線程的具體的線程函數(shù)。

 

  由名稱我們就可以看出,handle_connections_sockets應(yīng)該是處理連接的線程了,從順序上看,也應(yīng)該是這樣,只有系統(tǒng)中所有的其他必須的線程創(chuàng)建完畢后,才能創(chuàng)建監(jiān)聽線程(連接線程),即監(jiān)聽線程應(yīng)該是系統(tǒng)最后創(chuàng)建的。

    找到了我們LOGIN需要的線程了,下次針對這個線程,分析下如何進(jìn)行登錄的,以及登錄后為用戶分配哪些資源。時間不早啦,洗洗睡了
作者 : cnblogs 心中無碼

相關(guān)文章

  • ?SQL 中 CASE 表達(dá)式的使用方式

    ?SQL 中 CASE 表達(dá)式的使用方式

    這篇文章主要介紹了?SQL 中 CASE 表達(dá)式的使用方式,文章通過圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-09-09
  • MySQL explain 中列的取值及含義講解

    MySQL explain 中列的取值及含義講解

    這篇文章主要介紹了MySQL explain 中列的取值及含義,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-03-03
  • MySQL中的多表聯(lián)合查詢功能操作

    MySQL中的多表聯(lián)合查詢功能操作

    這篇文章主要介紹了MySQL中的多表聯(lián)合查詢功能操作,本文結(jié)合實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-02-02
  • GROUP_CONCAT的用法

    GROUP_CONCAT的用法

    GROUP_CONCAT的用法...
    2006-12-12
  • MySQL系列之十五 MySQL常用配置和性能壓力測試

    MySQL系列之十五 MySQL常用配置和性能壓力測試

    今天給大家?guī)硪黄坛剃P(guān)于MySQL常用配置和性能壓力測試的知識,文中配置參數(shù)以32內(nèi)存的服務(wù)器為例,通過實例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2021-07-07
  • MySQL修改時區(qū)的方法圖文詳解

    MySQL修改時區(qū)的方法圖文詳解

    這篇文章主要給大家介紹了關(guān)于MySQL修改時區(qū)的相關(guān)資料,時區(qū)是MySQL中非常重要的概念,正確設(shè)置時區(qū)可以確保應(yīng)用程序工作正常并避免時間錯誤,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2023-09-09
  • MySQL給新建用戶并賦予權(quán)限最簡單的方法

    MySQL給新建用戶并賦予權(quán)限最簡單的方法

    在本篇文章里小編給大家整理的是一篇關(guān)于MySQL給新建用戶并賦予權(quán)限最簡單的方法,需要的朋友們參考下。
    2019-11-11
  • MySql安裝及登錄詳解

    MySql安裝及登錄詳解

    這篇文章主要介紹了MySql安裝及登錄詳解,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2017-03-03
  • mysql 截取指定的兩個字符串之間的內(nèi)容

    mysql 截取指定的兩個字符串之間的內(nèi)容

    今天我同事在用mysql的時候,需要對一個字符串中的指定內(nèi)容進(jìn)行截取
    2009-07-07
  • mysql?中的備份恢復(fù),分區(qū)分表,主從復(fù)制,讀寫分離

    mysql?中的備份恢復(fù),分區(qū)分表,主從復(fù)制,讀寫分離

    這篇文章主要介紹了mysql?中的備份恢復(fù),分區(qū)分表,主從復(fù)制,讀寫分離,文章圍繞主題展開詳細(xì)的內(nèi)容戒殺,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-09-09

最新評論

稷山县| 永济市| 西宁市| 新丰县| 黄龙县| 静乐县| 萝北县| 资溪县| 黔东| 兰西县| 兴和县| 平远县| 勃利县| 鄂伦春自治旗| 永和县| 普陀区| 桂平市| 上杭县| 固原市| 项城市| 澄迈县| 建昌县| 郎溪县| 庆安县| 弋阳县| 马龙县| 裕民县| 鄂托克旗| 垫江县| 大足县| 胶南市| 潜山县| 乌什县| 太和县| 乐东| 广元市| 营口市| 南皮县| 卓尼县| 乐都县| 西峡县|