還是一個(gè)很小的模塊。
bio就是background io的意思,既然要background,就要?jiǎng)?chuàng)建線程,創(chuàng)建幾個(gè)線程呢?有幾種類型的io,就創(chuàng)建幾個(gè)線程。同一種類型的job需要排隊(duì),所以存放各自的工作鏈表里面。
redis目前有兩種類型的job:
一個(gè)是close file descriptor,另一個(gè)是aof sync。
線程的堆棧默認(rèn)設(shè)為4M,每個(gè)線程運(yùn)行開始時(shí)還要把SIG_ALRM(定時(shí)器信號)block掉,保證watchdog發(fā)出的信號只有主線程接收到。
介紹下接口:
// 初始化bio的結(jié)構(gòu)
void bioInit(void);
// 添加job
void bioCreateBackgroundJob(int type, void *arg1, void *arg2, void *arg3);
// 對于指定類型的bio,當(dāng)前pending隊(duì)列中的job數(shù)量是多少
unsigned long long bioPendingJobsOfType(int type);
// 以下兩個(gè)接口不再使用,不必關(guān)心
void bioWaitPendingJobsLE(int type, unsigned long long num);
time_t bioOlderJobOfType(int type);
看看其中要到的結(jié)構(gòu)和數(shù)據(jù):
struct bio_job {
? ? time_t time; // Job創(chuàng)建時(shí)間
? ? void *arg1, *arg2, *arg3; ? ?// 執(zhí)行job需要帶的ca
};
// 涉及多線程,就要考慮同步的問題,這是鎖和條件變量,條件變量用于隊(duì)列非空時(shí)激活線程去處理
static pthread_mutex_t bio_mutex[REDIS_BIO_NUM_OPS];
static pthread_cond_t bio_condvar[REDIS_BIO_NUM_OPS];
// 任務(wù)隊(duì)列
static list *bio_jobs[REDIS_BIO_NUM_OPS];
// 這個(gè)變量完全是多余,直接就是bio_jobs的鏈表長度
static unsigned long long bio_pending[REDIS_BIO_NUM_OPS];
?
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
