[boost]ASIO學習筆記:Sync/Async、Blocking/Non-Blocking IO

posted in: ASIO, boost, C/C++程式設計 | 0

關於四種名詞的詳細內容可以參閱本篇連結

其實這四個名詞在概念上有一些微妙的差別,
Sync/Async IO的差別在於程式是否要去等待OS的IO操作結束:在boost中是指io_service選用了run()或者是poll(),會進行kernel context switch到OS kernel來運行。
而Blocking/Non-Blocking則是指我們是否要等待程式執行流程中的IO結束才能繼續執行,主要是由application來實作、設計執行的機制。

其實一個程式是不是Sync/Asyn或blocking/non-blocking,其實看的是一段程式碼或者是一個function

通常如果該段程式碼包含while迴圈來判斷某個檔案是狀態,那麼就是blocking,但如果這時候又程式thread來分配該任務的執行,那麼就是non-blocking。

在non-blocking的程式中,如果有牽扯到檔案的讀寫問題,那麼我們就必須在程式中撰寫一些機制去確認該檔案是如已經可以寫入,以必免造成race condition的情況。通常依照不同的作業系統會使用poll、select、epoll、iocp等機制。

關於poll、select、epoll等分別請參閱本篇

在boost::ASIO中,由於為了要達成跨平台,因此在背後實作了Proactor模式來隱藏細節,並以Reactor來實作不同平台的機制。我們可以利用以下的程式碼印出我們的作業系統所採用的是那一種:

#include <iostream> 
#include <string> 
#include <boost/asio.hpp> 
int main() 
{ 
std::string output; 
#if defined(BOOST_ASIO_HAS_IOCP) 
  output = "iocp" ; 
#elif defined(BOOST_ASIO_HAS_EPOLL) 
  output = "epoll" ; 
#elif defined(BOOST_ASIO_HAS_KQUEUE) 
  output = "kqueue" ; 
#elif defined(BOOST_ASIO_HAS_DEV_POLL) 
  output = "/dev/poll" ; 
#else 
  output = "select" ; 
#endif 
    std::cout < < output << std::endl; 
} 

Leave a Reply

Your email address will not be published. Required fields are marked *