日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

同步IO、异步IO、阻塞IO、非阻塞IO、复用IO

發布時間:2023/12/10 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 同步IO、异步IO、阻塞IO、非阻塞IO、复用IO 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

參考:同步IO 異步IO
作者:今天天氣眞好
發布時間: 2021-04-19 09:42:29
網址:https://blog.csdn.net/qq_51118175/article/details/115857196?spm=1001.2014.3001.5501

目錄

  • 同步IO與異步IO的區別?
  • 1.POSIX
  • 2.IO模型
    • 阻塞IO模型
    • 非阻塞IO模型
    • IO復用模型
    • 信號驅動IO模型
    • 異步IO模型
  • 五種IO模型比較

同步IO與異步IO的區別?

答:如果是同步IO,當執行IO操作時,應用程序必須等待,直到該IO操作完成。而異步IO操作在后臺運行,可以與應用程序同時運行,提高系統性能,提高IO流量。

解讀:在同步IO文件中,線程啟動一個IO操作然后立即進入等待狀態,直到IO操作完成才醒來繼續執行。而異步IO文件中,線程發送一個IO請求到內核,然后繼續處理其他事情,內核完成IO請求后,就會通知線程IO操作完成了。

1.POSIX

同步IO、異步IO、阻塞IO、非阻塞IO,這幾個詞常見于各種各樣的與網絡相關的文章之中,往往不同上下文中它們的意思是不一樣的

POSIX(可移植操作系統接口)把同步IO操作定義為導致進程阻塞直到IO完成的操作,反之則是異步IO

按POSIX的描述似乎把同步和阻塞劃等號異步和非阻塞劃等號,但是為什么有的人說同步IO不等于阻塞IO呢?先來說說幾種常見的IO模型吧。

2.IO模型

這里統一使用Linux下的系統調用recv作為例子,它用于從套接字上接收一個消息,因為是一個系統調用,所以調用時會從用戶進程空間切換到內核空間運行一段時間再切換回來。默認情況下recv會等到網絡數據到達并且復制到用戶進程空間或者發生錯誤時返回,而第4個參數flags可以讓它馬上返回。

阻塞IO模型

使用recv的默認參數一直等數據直到拷貝到用戶空間,這段時間內進程始終阻塞。A同學用杯子裝水,打開水龍頭裝滿水然后離開。這一過程就可以看成是使用了阻塞IO模型,因為如果水龍頭沒有水,他也要等到有水并裝滿杯子才能離開去做別的事情。很顯然,這種IO模型是同步的。

非阻塞IO模型

改變flags,讓recv不管有沒有獲取到數據都返回,如果沒有數據那么一段時間后再調用recv看看,如此循環。B同學也用杯子裝水,打開水龍頭后發現沒有水,它離開了,過一會他又拿著杯子來看看……在中間離開的這些時間里,B同學離開了裝水現場(回到用戶進程空間),可以做他自己的事情。這就是非阻塞IO模型。但是它只有是檢查無數據的時候是非阻塞的,在數據到達的時候依然要等待復制數據到用戶空間(等著水將水杯裝滿),因此它還是同步IO。

IO復用模型

這里在調用recv前先調用select或者poll,這2個系統調用都可以在內核準備好數據(網絡數據到達內核)時告知用戶進程,這個時候再調用recv一定是有數據的。因此這一過程中它是阻塞于select或poll,而沒有阻塞于recv,有人將非阻塞IO定義成在讀寫操作時沒有阻塞于系統調用的IO操作(不包括數據從內核復制到用戶空間時的阻塞,因為這相對于網絡IO來說確實很短暫),如果按這樣理解,這種IO模型也能稱之為非阻塞IO模型,但是按POSIX來看,它也是同步IO,那么也和樓上一樣稱之為同步非阻塞IO吧。

這種IO模型比較特別,分個段。因為它能同時監聽多個文件描述符(fd)。這個時候C同學來裝水,發現有一排水龍頭,舍管阿姨告訴他這些水龍頭都還沒有水,等有水了告訴他。于是等啊等(select調用中),過了一會阿姨告訴他有水了,但不知道是哪個水龍頭有水,自己看吧。于是C同學一個個打開,往杯子里裝水(recv)。這里再順便說說鼎鼎大名的epoll(高性能的代名詞啊),epoll也屬于IO復用模型,主要區別在于舍管阿姨會告訴C同學哪幾個水龍頭有水了,不需要一個個打開看(當然還有其它區別)。

信號驅動IO模型

通過調用sigaction注冊信號函數,等內核數據準備好的時候系統中斷當前程序,執行信號函數(在這里面調用recv)。D同學讓舍管阿姨等有水的時候通知他(注冊信號函數),沒多久D同學得知有水了,跑去裝水。是不是很像異步IO?很遺憾,它還是同步IO(省不了裝水的時間啊)。

異步IO模型

調用aio_read,讓內核等數據準備好,并且復制到用戶進程空間后執行事先指定好的函數。E同學讓舍管阿姨將杯子裝滿水后通知他。整個過程E同學都可以做別的事情(沒有recv),這才是真正的異步IO。

五種IO模型比較

總結:
IO分兩階段:

1.數據準備階段
2.內核空間復制回用戶進程緩沖區階段

一般來講:阻塞IO模型、非阻塞IO模型、IO復用模型(select/poll/epoll)、信號驅動IO模型都屬于同步IO,因為階段2是阻塞的(盡管時間很短)。只有異步IO模型是符合POSIX異步IO操作含義的,不管在階段1還是階段2都可以干別的事。

總結

以上是生活随笔為你收集整理的同步IO、异步IO、阻塞IO、非阻塞IO、复用IO的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。