Unix下 五種 I/O模型

来源:http://www.cnblogs.com/Lynn-Zhang/archive/2016/07/27/5711849.html
-Advertisement-
Play Games

Unix下共有五種I/O模型: 1. 阻塞式I/O 2. 非阻塞式I/O 3. I/O復用(select和poll) 4. 信號驅動式I/O(SIGIO) 5. 非同步I/O(POSIX的aio_系列函數) io請求分兩步: 1. 先將數據從存儲介質(磁碟,網路等)拷貝到內核緩衝區,此時稱為數據準備好 ...


Unix下共有五種I/O模型:
  1. 阻塞式I/O 
  2. 非阻塞式I/O 
  3. I/O復用(select和poll) 
  4. 信號驅動式I/O(SIGIO) 
  5. 非同步I/O(POSIX的aio_系列函數) 

io請求分兩步:
  1. 先將數據從存儲介質(磁碟,網路等)拷貝到內核緩衝區,此時稱為數據準備好,可以被用戶應用程式讀取。
  2. 由用戶應用程式拷貝內核緩衝區中的數據到用戶緩衝區。 


① 阻塞I/O模型            進程一直阻塞,直到數據拷貝完成

我們將函數recvfrom視為系統調用,不論該函數如何實現,一般都會有一個從應用進程中運行到內核中運行的切換,一段時間以後還會有一個返回到應用進程的切換。

應用程式調用一個IO函數,導致應用程式阻塞並等待數據準備就緒。如果數據沒有準備好,一直等待。如果數據準備好了,則從內核拷貝到用戶空間拷貝數據,IO函數返回成功指示。

進程調用recvfrom,此系統調用直到數據報到達且被覆制到應用進程的緩衝區中或發生錯誤才返回,常見的錯誤如系統調用被信號中斷。

進程在調用recvfrom開始到它返回的整段時間內是被阻塞的,該函數成功返回後,應用進程開始處理數據報。

② 非阻塞I/O模型          數據就緒之前一直輪詢

我們把一個套介面設置為非阻塞就是告訴內核,當所請求的I/O操作無法完成時,不要將進程睡眠,而是返回一個錯誤。這樣我們的I/O操作函數將不斷的測試 數據是否已經準備好,如果沒有準備好,繼續測試,直到數據準備好為止。在這個不斷測試的過程中,會大量的占用CPU的時間。

  前三次調用recvfrom時仍無數據返回,因此內核立即返回一個EWOULDBLOCK錯誤。第四次調用recvfrom時,數據報已準備好,被拷貝到應用緩衝區,recvfrom 返回成功指示,接著就是我們處理數據。

   當一個應用進程像這樣對一個非阻塞描述字迴圈調用recvfrom 時,我們稱此過程為輪詢(polling)。由於應用進程像這樣連續不斷地查詢內核,看看某操作是否準備好,這對CPU時間是極大的浪費,所以這種模型只是偶爾才會遇到。

③ I/O復用模型        新增了一個系統調用select, 幫助進程監控多個I/O

I/O復用模型會用到select或者poll函數,這兩個函數也會使進程阻塞,但是和阻塞I/O所不同的的,這兩個函數可以同時阻塞多個I/O操作。而且可以同時對多個讀操作,多個寫操作的I/O函數進行檢測,直到有數據可讀或可寫時,才真正調用I/O操作函數。 

  只要有數據就緒,select調用返回,應用程式調用recvfrom將數據從內核區拷貝至用戶區。

  仔細看實例圖,發現select模型似乎有些disadvantage,即前後進行了兩次系統調用,比上一個模型多了一次。然而,select模型也有其明顯的優勢:每次select阻塞結束返回後,可以獲得多個準備就緒的套接字(即一個select可以對多個套接字進行管理,類似於同時監控多個套接字事件是否就緒)。

  和阻塞IO模型相比,selectI/O復用模型相當於提前阻塞了。等到有數據到來時,再調用recv就不會因為要等數據就緒而發生阻塞。

④ 信號驅動I/O模型         進程通過接收到的信號確認數據準備就緒

我們可以用信號,讓內核在數據就緒時用信號SIGIO通知我們,將此方法稱為信號驅動I/O 

  首先,我們允許套接字進行信號驅動I/O,並通過系統調用 sigaction 安裝一個信號處理程式。此系統調用立即返回,進程繼續工作,它是非阻塞的。當數據報準備好被讀時,就為該進程生成一個SIGIO信號。我們隨即可以在信號處理程式中調用 recvfrom 來取讀數據報。

⑤ 非同步I/O    進程不受阻塞,將任務交給內核處理

我們讓內核啟動操作,併在整個操作完成後(包括將數據從內核拷貝到我們自己的緩衝區)通知我們。

調用aio_read函數,告訴內核描述字,緩衝區指針,緩衝區大小,文件偏移以及通知的方式,然後立即返回。當內核將數據拷貝到緩衝區後,再通知應用程式。

 五種I/O模型對比

 前四種模型主要區別在第一階段,因為前四種模型的第二階段基本相同:在數據從記憶體拷貝到調用者的緩衝區時,進程阻塞於recvfrom 調用。然而,非同步I/O模型處理的兩個階段都不同於前四個模型。

  

同步I/O與非同步I/O

  • 同步I/O:在I/O操作未完成前,請求進程會被阻塞
  • 非同步I/O:在I/O操作未完成前,請求進程未被阻塞

上述五種I/O模型,前四種均屬於同步I/O(它們等待方式不同,搬遷動作相同),因為recvfrom調用均阻塞了當前請求進程。

只有最後一種io屬於非同步I/O !

 

  所謂同步,數據從存儲介質拷貝到內核緩衝區(數據準備的過程)完成之後,需要用戶自己將數據拷貝到用戶緩衝區。
  所謂非同步,步驟1,2 用戶都不關心,只要發起IO請求,後面得到IO結果即可。
所以,前4種IO模型都是同步的!!!

 

阻塞,非阻塞,同步,非同步  概括:

  • 阻塞,非阻塞:進程/線程要訪問的數據是否就緒,進程/線程是否需要等待;

  • 同步,非同步:訪問數據的方式,同步需要主動讀寫數據,在讀寫數據的過程中還是會阻塞;非同步只需要I/O操作完成的通知,並不主動讀寫數據,由操作系統內核完成數據的讀寫。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在Linux下如何解壓iso類型的文件呢? 可以使用mount命令來處理 [root@DB-Server tmp]# ls /tmp/rhel-server-5.7-x86_64-dvd.iso/tmp/rhel-server-5.7-x86_64-dvd.iso[root@DB-Server tm... ...
  • 本篇大概介紹一下在Windows Server 2012 R2上安裝和部署SCVMM的過程及其註意事項。下圖是我們數據中心SCVMM的基本架構,其中 SCVMM Database 是用於存儲了所有配置信息和狀態信息的Sql Server資料庫,為實現高可用,該Sql Server也可以配置成Sql ... ...
  • 此文包含的命令: cd、pwd、mkdir、rmdir、rm、ls、cp、mv、cat、tac、more、less、head、tail、od、touch、umask、chattr、lsattr、file、chgrp、chown。 理論: 一、檔案的種類 正規檔案:[-] 目錄(directory): ...
  • 轉自http://www.linuxidc.com/Linux/2012-10/71850.htm 設置epel源。方法如下: 32位系統選擇:rpm -ivh http://download.Fedoraproject.org/pub/epel/6/i386/epel-release-6-8.no ...
  • 2016年到了一家公司做網管,經常會為了裝系統而煩惱,後來學習了WDS自動部署,但是在學習過程中發現啟動鏡像boot.wim中沒有網卡驅動 導致wds報錯,後來經過網上查找相關資料學會瞭如何向系統里添加驅動解決了我在啟動過程中找不到網卡驅動的問題。因為每次碰到不同的電腦有不同的網卡都 需要添加一次, ...
  • 在檢查一Linux伺服器時,發現日誌裡面有大量“lvm[12446]: Another thread is handling an event. Waiting...” Jul 4 00:01:42 localhost lvm[12446]: Another thread is handling a... ...
  • 首先啟動你的卡裡系統,等出現引導界面時選擇恢復模式。如下圖: 再出來一個界面時,選擇第二個並按E鍵進入編輯模式。如下圖: 進入編輯模式後找到如下圖的代碼: 把ro改為rw,並且在.gz 後面寫上init=/bin/bash,如下圖: 改完後按F10或Ctrl+X繼續啟動。啟動後的界面如下圖: 這時輸 ...
  • 為了定位問題,需要在Linux上使用tcpdump並且保存到文件,遇到瞭如下問題:Permission denied. ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...