按照posix標(biāo)準(zhǔn)温自,系統(tǒng)io分為同步io和異步io兩種帘靡,其中同步io常用的是bio nio面褐。異步io有aio铸豁。
從程序的角度來(lái)看,bio在讀和寫(xiě)的時(shí)候,會(huì)阻塞茵休,只有當(dāng)程序?qū)⒘鲗?xiě)入操作系統(tǒng)或者讀到流后,阻塞才會(huì)結(jié)束伞芹,線程接著run下去可柿。
而nio和aio屬于非阻塞方式,他們都是基于事件驅(qū)動(dòng)思想绊寻,但是nio采用的是reactor 模式花墩,而aio采用的是proactor模式。
Reactor 模式使用event loop 阻塞等在io上澄步,一但io可以讀或?qū)懕ⅲㄟ^(guò)分發(fā)器,遍歷事件注冊(cè)隊(duì)列驮俗,將事件分發(fā)到指定注冊(cè)的處理器懂缕。由應(yīng)用的處理器來(lái)再將流讀取到緩沖區(qū)或?qū)懭氩僮飨到y(tǒng),完成io操作王凑。
Proctor 模式下讀和寫(xiě)的方法是異步的搪柑,只需調(diào)用讀和寫(xiě)即可。當(dāng)有流可讀取的時(shí)候索烹,操作系統(tǒng)會(huì)將流傳入read方法緩存區(qū)工碾,并通知應(yīng)用程序。對(duì)于寫(xiě)百姓,當(dāng)操作系統(tǒng)將writer 寫(xiě)入完畢時(shí)渊额,操作系統(tǒng)會(huì)主動(dòng)通知應(yīng)用程序。
proactor模式的Aio,流的讀取和寫(xiě)入由操作系統(tǒng)完成旬迹,省去了遍歷事件通知隊(duì)列selector 的代價(jià)火惊。
Windows上的iocp實(shí)現(xiàn)了aio,linux目前只有基于epoll模擬實(shí)現(xiàn)的aio奔垦。