一、同步非同步、阻塞非阻塞:

1、 同步阻塞:調用者被卡住,被調用者調度+數據準備好後,調用者才返回;去超市買牛肉,牛肉沒有了,你一直等著直到牛肉上架;

2、 同步非阻塞:調用者不被卡住,但是要持續輪詢;去超市買牛肉,牛肉沒有了,你先回家,每半小時去看一下;與阻塞的差別,就是可能你需要去超市買魚、買兔,買牛肉,此時只需要你一個人去看,而阻塞的需要你爸等魚、你媽等兔,你等牛肉;

3、 非同步非阻塞:調用者不被卡住,在數據準備好後,直接調用調用者回調;去超市買牛肉,牛肉沒有了,你留下一個地址,等牛肉上架了寄給你,或者給你打電話;

4、 如果有人用非同步阻塞,那就比較奇葩了;

二、LIBAIO:

可靠性、性能要求高的系統,必須要使用非同步IO,並且是直接下盤;

非直接下盤IO在磁碟掉電後,會發生數據丟失;並且由於頻繁的拷貝佔用CPU資源,可能性能不一定會高;

當前用的比較多的時LINUX提供的LIBAIO動態鏈接庫;

包含如下介面:

Io_setup:申請一個上下文請求;

Io_submit:提交上下文中包含的請求;

Io_cancel:取消已經提交的上下文請求;

Io_destroy:銷毀這個上下文請求;

Io_get_event:同步非阻塞方式獲取已經完成的上下文請求;

三、IO多路復用:

同步非阻塞場景中,由一個人輪詢所有的事情,由於輪詢方式的不同,存在三種典型的:select、poll、epoll;

可以簡單的理解,select、poll、epoll是不同的代次技術,每一代都有增強;

Select等待的個數有限制,1024,並且每一次操作都需要在內核態和用戶態拷貝監控信息,耗時;真正的全部輪詢;

Poll個數無限制,但是還是有其他限制;

Epoll是新創建了一個fd,將監控的fd掛接在上面,監控的fd如果有變化,就直接通知原fd;這樣返回的event數量也是明確的,只返回有相應的fd事件;

一般epoll在網路IO用得比較多,其實在磁碟IO上,LIBAIO和epoll也有很不錯的配合;


推薦閱讀:
查看原文 >>
相關文章