同步/非同步, 阻塞/非阻塞

來源:互聯網
上載者:User

代碼都code了一次,該總結下了:

 

首先,同步/非同步是個比較大的概念,它適用於很多方面,阻塞/非阻塞也不是只在socket裡有的,當然我們下面的討論主要在socket方面。

 

同步就是串列,要一個一個完成,不能跳著走,類似去政府辦個什麼手續,只有上個部門辦完了,才能去下個部門辦接下來的手續。

非同步就是有個通知機制,比如說政府職能轉變好了後,你可以給他的相關部門打個電話說你要辦什麼,他辦好後後會通知你說辦好了,在他辦的過程中你可以幹別的。這個通知影射到具體代碼上就是訊號 或者 回呼函數。

 

阻塞主要是說函數在沒有得到她想要的資料時就在那裡等,直到有資料為止。

非阻塞就是看一下有沒有資料,有的話就繼續下面的工作,沒有就返回,你需要做的就是反覆去看有沒有資料。

 

 

同步/非同步 阻塞/非阻塞 組合起來就有4種:

同步阻塞, 同步非阻塞, 非同步阻塞, 非同步非阻塞。

 

 

1. 同步阻塞時最常見到的,平時code時,不特殊設定就是這個模式。

 

2. 同步非阻塞,相對也容易,只要設定一下socket屬性就可以了,一般來說加個這個就可以了:

    if(fcntl(listenfd, F_SETFL, O_NONBLOCK) == -1)
    {
 printf("fcntl error: %s(errno=%d)\n",strerror(errno), errno);
 exit(0);
    }

這個是unix的做法,window有自己的函數設定。

這個模式,其實效率很低,用的應該不多吧。

 

3. 非同步阻塞

我看好多地方把select 和 poll放這裡,那就放著吧,其實我覺得他2個只是同步非阻塞的一個變種而已。

好多非阻塞的被一個調用監控著,如果某個fd或某幾個有資訊就會返回,處理這些資訊。

 

4. 非同步非阻塞

真正可以名副其實就是aio,他有設定訊號處理函數或者回呼函數的地方,真的不需要你再回頭處理接收到的資訊。

像epoll這種,更多的是poll的一個改進,當然它的改動有點大,他的回呼函數時固定的,優點在只返回有資訊的fd。

 

現在看網上的呼聲應該是epoll比aio好點,我並沒有實際測過。

 

 http://www.cnblogs.com/hustcat/archive/2012/10/08/1708909.html

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.