mysql thd mysql的啟動過程詳解

2021-10-19 17:05:06 字數 1912 閱讀 7109

有一天,兩個不懂mysql核心的人想去了解mysql核心**,兩個人不是去除錯**、查詢資料,而是在那邊思考。因為不了解核心,所以邊思考邊去驗證。

使用的mysql**是5.1.7,除錯環境是windows平台下的vs2003。

bingxi:「alex,你覺得mysql的啟動過程會是什麼樣的呢?我們以銀行為例吧。」

alex:「嗯,bingxi。早上銀行開門了,會先準備好環境,然後開門迎客,mysql也是這樣。mysql裡面會有乙個handle_connections_sockets函式,這個函式就好比是個叫號機,每個使用者來了都會取個號,然後就會進行業務處理。」

**如下:

pthread_handler_t handle_connections_sockets(void *arg __attribute__((unused)))

while (!abort_loop)

select((int) max_used_connection,&readfds,0,0,0) < 0) //有連線了則往下來執行,否則一直等待

accept(sock, my_reinterpret_cast(struct sockaddr *) (&caddr),&length)  //接受請求

create_new_thread(thd);

//abort_loop=1,則執行到這裡進行推出。今天業務不處理了

bingxi:「啊,這裡面存在兩種可能的,1)使用者來乙個就分配乙個工作人員處理,2)將排號的人丟進工作佇列,根據叫號機到指定視窗獲取服務。前者的場景適合於請求量大,並且需要響應速度特別快的情況,但是分配也會有個限制,所謂的最大連線數,這樣的情況常見於網際網路行業,相應地我們可以看到機器的負載變化範圍特別大。同樣的,這也是它的乙個弊端,假設每個業務都複雜(消耗資源型sql語句),同時處理的話,機器會支撐不住,這時候第二種方法就比較好,這種情況屬於事務性場景。」

alex:「嗯,是的。mysql選擇的是前者,oracle提供兩種方法供選擇。我們繼續往下面的**看,如果我們配置了執行緒快取,且有可用的快取,則喚醒該執行緒,否則建立新的執行緒。」

**如下:

static void create_new_thread(thd *thd)

if (cached_thread_count > wake_thread)

start_cached_thread(thd);

else

if ((error=pthread_create(&thd->real_id,&connection_attrib,

handle_one_connection,

(void*) thd)))

bingxi:「嗯,老楊。是不是理解銀行為客戶分配了乙個服務人員,在這段期間一直為該客戶服務。裡面有個**段,是一直在等使用者下命令。但是有可能網路,或者被kill掉了,就像乙個人存了100,不斷取1塊錢一樣,被保安帶走了。」

**如下:

pthread_handler_t handle_one_connection(void *arg)

while (!net->error && net->vio != 0 &&

!(thd->killed == thd::kill_connection))

net->no_send_error= 0;

if (do_command(thd))

break;

alex:「嗯,獲取命令,然後執行命令。在dispatch_command函式中,根據不同的客戶請求進行響應的處理,比如開賬戶、存錢等」

**如下:

bool do_command(thd *thd)

if ((packet_length=my_net_read(net)) == packet_error) //獲取命令

dbug_return(dispatch_command(command,thd, packet+1, (uint) packet_length));

oracleDBConsoleorcl 啟動問題

oracle服務oracledbconsoleorcl啟動失敗解決方案 oracledbconsole服務不能啟動,訪問 http 機器名 1158 em 不能進入em介面,系統事件檢視器裡面記錄 agent process exited abnormally during initializati...

hadoop,hbase,kafka集群的啟動步驟

前段時間部署的集群伺服器 ha模式 由於斷電維護,現在重啟,啟動步驟如下 1.啟動zookeeper。zookeeper是集群協調服務的管理工具,首先啟動三個伺服器的zookeeper服務。預設情況下三個伺服器的zookeeper都需要單獨啟動。命令如下 zookeeper home bin目錄下 ...

tensorflow serving的熱啟動

1.首先生成對應的預熱資料 tf serving warmup requests,其中儲存的是 predictionlog 型別的資料 2.然後將生成的資料放到你的model的資料夾 1 下面的 assets.extra裡面,這個是需要自己建立的資料夾。3.記得帶上這個 enable model w...