在atlas中,可以將執行緒分為主線程和工作執行緒。其中工作執行緒主要負責處理mysql的操作請求,而主線程除具備工作執行緒的處理能力外,同時負責接收使用者請求以及全域性的事件處理。
1. 基本的資料結構
atlas執行緒統一由如下結構組成:
typedef struct chassis_event_thread_t chassis_event_thread_t;
無論是工作執行緒還是主線程都會由執行緒池統一管理,其結構如下
struct chassis_event_threads_t ;
2. 主線程
主線程始終為執行緒池中的第乙個位置,即其index為0.
主線程會負責全域性的訊號處理,如sigterm和sigint:
signal_set(&ev_sigterm, sigterm, sigterm_handler, null);
event_base_set(chas->event_base, &ev_sigterm);
signal_add(&ev_sigterm, null);
signal_set(&ev_sigint, sigint, sigterm_handler, null);
event_base_set(chas->event_base, &ev_sigint);
signal_add(&ev_sigint, null);
event_set(&(listen_sock->event), listen_sock->fd, ev_read|ev_persist, network_mysqld_con_accept, con);
event_base_set(chas->event_base, &(listen_sock->event));
event_priority_set(&(listen_sock->event), 0);
event_add(&(listen_sock->event), null);
其中,network_mysqld_con_accept主要負責接收客戶端請求,為其分配工作執行緒:
void network_mysqld_con_accept(int g_gnuc_unused event_fd, short events, void *user_data)
void chassis_event_add(network_mysqld_con* client_con)
執行完上述兩個函式後,事件佇列中將會有乙個新的連線物件,同時某個工作執行緒(包括主線程)被喚醒。
3. 工作執行緒
工作執行緒接到主線程發來的通知後,從事件佇列中取出乙個連線物件,進入network_mysqld_con_handle函式中,開始進入狀態機,前面的文章已經說過,不再重複。
nginx原始碼學習(五)
我們接著上篇文章來講講ngx get options函式。這個函式就在nginx.c檔案中,我們來看看。引數argc,argv我們在前面的文章中都已經提到了,在這裡我們看ngx get options裡面的for迴圈。它的作用就是把所有的執行時引數迴圈一遍,判斷是不是合法。例如 nginx s st...
linux 0 11 原始碼學習(五)
head.s head.s 是系統模組的入口,其編譯器已經是gnu彙編,但從功能上將仍然屬於核心啟動階段,主要的功能是對386 cpu的初始化,如使用者堆疊 idt gdt和頁表。因此從資料夾的歸屬看,它仍然放在boot資料夾中,與bootsect和setup一塊。head.s的核心功能 簡單的暫存...
linux 0 11 原始碼學習(五)
head.s head.s 是系統模組的入口,其編譯器已經是gnu彙編,但從功能上將仍然屬於核心啟動階段,主要的功能是對386 cpu的初始化,如使用者堆疊 idt gdt和頁表。因此從資料夾的歸屬看,它仍然放在boot資料夾中,與bootsect和setup一塊。head.s的核心功能 簡單的暫存...