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