昆明網(wǎng)站建設(shè)_云南網(wǎng)站建設(shè)網(wǎng)頁設(shè)計(jì)制作
io深層理解
- 1.內(nèi)核態(tài)
- 2.用戶態(tài)
- 3. select IO多路復(fù)用執(zhí)行原理
- 4. select io多路復(fù)用限制和不足
1.內(nèi)核態(tài)
一個(gè)進(jìn)程會涉及多文件的修改,比如說。那么在內(nèi)核態(tài)就會維護(hù)一個(gè)表,這個(gè)表叫文件描述符bitmap,這個(gè)表會傳遞給內(nèi)核態(tài),當(dāng)然肯定傳遞的是地址咯!
- 用戶態(tài)關(guān)心的文件,執(zhí)行select,等待網(wǎng)絡(luò)io回來。。。
- 那么用戶態(tài)將關(guān)心的fd_map 取地址傳遞給內(nèi)核,內(nèi)核掃描這個(gè)fd_map,當(dāng)然select的是一個(gè)最大為1024的bit數(shù)組,這個(gè)fd_map,對應(yīng)索引為fd_id的位置上,就會置為1,傳遞給內(nèi)核后,內(nèi)核空間會輪訓(xùn)這個(gè)map,判斷是否有數(shù)據(jù)到來,并從網(wǎng)卡拷貝到了內(nèi)核的數(shù)據(jù)緩存隊(duì)列。
2.用戶態(tài)
- 用戶態(tài)執(zhí)行select之后,會阻塞,等待數(shù)據(jù)到來,注意此時(shí)進(jìn)程內(nèi)部的線程是掛起的,進(jìn)程也會掛起,也就是說,目前的線程是服從操作系統(tǒng)的調(diào)度,可以干其他任務(wù)的。而當(dāng)數(shù)據(jù)到來之后,操作系統(tǒng)恢復(fù)上下文,恢復(fù)寄存器變量等,繼續(xù)執(zhí)行業(yè)務(wù)代碼。
圖文說明:
3. select IO多路復(fù)用執(zhí)行原理
- 將當(dāng)前進(jìn)程的所有文件描述符,一次性地從用戶態(tài)拷貝到內(nèi)核態(tài)
- 在內(nèi)核中快速無差別地遍歷每個(gè)id,判斷是否有數(shù)據(jù)到來
- 將所有fd狀態(tài),從內(nèi)核態(tài)拷貝到用戶態(tài),并返回已就緒的fd的個(gè)數(shù)
- 在用戶態(tài)遍歷判斷具體哪個(gè)fd已就緒,然后進(jìn)行相應(yīng)的事件處理
4. select io多路復(fù)用限制和不足
- 文件描述符表為bitmap,有長度限制1024的限制
- fdset無法做到重用,每次循環(huán)必須重新創(chuàng)建
- 頻繁的用戶態(tài)和內(nèi)核態(tài)的拷貝,性能開銷很大
- 需要對文件描述符進(jìn)行遍歷,O(n)的輪訓(xùn)時(shí)間復(fù)雜度