精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

網絡IO模型:阻塞與非阻塞

麥辣雞腿堡 ? 來源:盼盼編程 ? 作者:盼盼編程 ? 2023-10-08 17:16 ? 次閱讀

阻塞 IO 模型

Linux ,默認情況下所有的 socket 都是阻塞的,一個典型的讀操作流程如圖所示。

阻塞和非阻塞的概念描述的是用戶線程調用內核 IO 操作的方式:阻塞是指 IO 操作需要徹底完成后才返回到用戶空間;而非阻塞是指 IO操作被調用后立即返回給用戶一個狀態值,不需要等到 IO 操作徹底完成。

當應用進程調用了 recvfrom 這個系統調用后,系統內核就開始了 IO 的第一個階段 :準備數據。

對于網絡 IO 來說,很多時候數據在一開始還沒到達時,系統內核就要等待足夠的數據到來。而在用戶進程這邊,整個進程會被阻塞。

當系統內核一直等到數據準備好了,它就會將數據從系統內核中拷貝到用戶內存中,然后系統內核返回結果,用戶進程才解除阻塞的狀態,重新運行起來。所以,阻塞IO 模型的特點就是 IO 執行的兩個階段都被阻塞了。

大部分的 socke接口都是阻塞型的。所謂阻塞型接口是指系統調用時卻不返回調用結果,并讓當前線程一直處于阻塞狀態,只有當該系統調用獲得結果或者超時出錯時才返回結果。

實際上,除非特別指定,幾乎所有的 IO 接口都阻塞型的。這給網絡編程帶來了一個很大的問題,如在調用 send的同時,線程處于阻塞狀態,則在此期間,線程將無法執行任何運算或響應任何網絡請求。

非阻塞 IO 模型

在Linux 下,可以通過設置 socket IO 變為非阻塞狀態。當一個非阻塞的 socket執行 read 操作時,流程如圖:

圖片

當用戶進程發出 read 操作時,如果內核中的數據還沒有準備好,那么它并不會 block 用戶進程,而是立刻返回一個錯誤。

從用戶進程角度講,它發起 read 操作后,并不需要等待,而是馬上就得到了一個結果當用戶進程判斷結果是一個錯誤時,它就知道數據還沒有準備好,于是它可以再次發送 read 操作。

一旦內核中的數據準備好了,并且又再次收到了用戶進程的系統調用,那么它馬上就將數據復制到了用戶內存中,然后返回正確的返回值。

所以,在非阻塞式 IO 中,用戶進程其實需要不斷地主動詢問 kernel數據是否準備好。非阻塞的接口相比于阻塞型接口的顯著差異在于被調用之后立即返回,使用如下的函數可以將某句柄歸設為非阻塞狀態:fcntl( fd , F_SETFL, O_NONBLOCK);

在非阻塞狀態下,recv 接口在被調用后立即返回,返回值代表了不同的含義,如下所述。

recv 返回值大于 0,表示接收數據完畢,返回值即是接收到的字節數。

recv 返回 0,表示連接已經正常斷開。

recv 返回 -1 ,且 errno 等于 EAGAIN ,表示 recv 操作還沒執行完成。

recv 返回 -1,且 errno 不等于 EAGAIN ,表示 recv 操作遇到系統錯誤 errno。

可以看到服務器線程可以通過循環調用 recv 接口,可以在單個線程內實現對所有連接的數據接收。但是上述模型絕不被推薦,因為循環調用 recv將大幅度占用 CPU 使用率。

此外,在這個方案 recv 更多的是起到檢測“操作是否完成”的作用,實際操作系統提供了更為高效的檢測“操作是否完成”作用的接口,例如 select多路復用模式,可以次檢測多個連接是存活躍。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • IO
    IO
    +關注

    關注

    0

    文章

    435

    瀏覽量

    39078
  • 內核
    +關注

    關注

    3

    文章

    1363

    瀏覽量

    40228
  • Linux
    +關注

    關注

    87

    文章

    11227

    瀏覽量

    208922
  • 網絡
    +關注

    關注

    14

    文章

    7516

    瀏覽量

    88627
收藏 人收藏

    評論

    相關推薦

    Verilog語言中阻塞阻塞賦值的不同

    來源:《Verilog數字系統設計(夏宇聞)》 阻塞阻塞賦值的語言結構是Verilog 語言中最難理解概念之一。甚至有些很有經驗的Verilog 設計工程師也不能完全正確地理解:何時使用
    的頭像 發表于 08-17 16:18 ?6349次閱讀

    Verilog阻塞阻塞原理分析

    Verilog阻塞阻塞原理分析在Verilog語言最難弄明白的結構中“阻塞賦值”要算一個。甚至是一些很有經驗的工程師也不完全明白“
    發表于 11-23 12:02

    Java阻塞通信研究

    本文針對Java NIO 的特性做出分析與闡述,對網絡應用中阻塞通信與阻塞通信、NIO的阻塞
    發表于 08-10 10:15 ?18次下載

    verilog中阻塞賦值和阻塞賦值

    阻塞阻塞語句作為verilog HDL語言的最大難點之一,一直困擾著FPGA設計者,即使是一個頗富經驗的設計工程師,也很容易在這個點上犯下一些不必要的錯誤。阻塞
    發表于 03-15 10:57 ?6986次閱讀

    深入理解阻塞阻塞賦值

    這是一個很好的學習阻塞阻塞的資料,對于FPGA的學習有很大幫助。
    發表于 04-22 11:00 ?11次下載

    《Linux設備驅動開發詳解》第8章、Linux設備驅動中的阻塞阻塞IO

    《Linux設備驅動開發詳解》第8章、Linux設備驅動中的阻塞阻塞IO
    發表于 10-27 11:35 ?9次下載
    《Linux設備驅動開發詳解》第8章、Linux設備驅動中的<b class='flag-5'>阻塞</b>與<b class='flag-5'>非</b><b class='flag-5'>阻塞</b><b class='flag-5'>IO</b>

    深入分析同步阻塞網絡IO的內部實現詳解

    網絡開發模型中,有一種非常易于開發同學使用的方式,那就是同步阻塞網絡 IO(在 Java 中習慣叫 BIO)。
    的頭像 發表于 04-03 14:10 ?1997次閱讀
    深入分析同步<b class='flag-5'>阻塞</b><b class='flag-5'>網絡</b><b class='flag-5'>IO</b>的內部實現詳解

    簡述阻塞賦值和阻塞賦值的可綜合性

    阻塞賦值和阻塞賦值的可綜合性 Blocking Assignment阻塞賦值和NonBlocking Assignment
    的頭像 發表于 05-12 09:45 ?2691次閱讀
    簡述<b class='flag-5'>阻塞</b>賦值和<b class='flag-5'>非</b><b class='flag-5'>阻塞</b>賦值的可綜合性

    簡述Verilog HDL中阻塞語句和阻塞語句的區別

    ? 在Verilog中有兩種類型的賦值語句:阻塞賦值語句(“=”)和阻塞賦值語句(“=”)。正確地使用這兩種賦值語句對于Verilog的設計和仿真非常重要。 Verilog語言中講的阻塞
    的頭像 發表于 12-02 18:24 ?6030次閱讀
    簡述Verilog HDL中<b class='flag-5'>阻塞</b>語句和<b class='flag-5'>非</b><b class='flag-5'>阻塞</b>語句的區別

    時序邏輯中的阻塞阻塞

    Verilog HDL的賦值語句分為阻塞賦值和阻塞賦值兩種。阻塞賦值是指在當前賦值完成前阻塞其他類型的賦值任務,
    的頭像 發表于 03-15 13:53 ?2991次閱讀

    阻塞阻塞通信的區別 阻塞阻塞應用場景

    阻塞通信(Blocking Communication):當進行阻塞通信時,調用者在發起一個I/O操作后會被阻塞,直到該操作完成返回才能繼續執行后續代碼。
    的頭像 發表于 06-15 17:32 ?5948次閱讀

    阻塞賦值與阻塞賦值

    ”=“阻塞賦值與”
    的頭像 發表于 09-12 09:06 ?1001次閱讀
    <b class='flag-5'>阻塞</b>賦值與<b class='flag-5'>非</b><b class='flag-5'>阻塞</b>賦值

    什么是阻塞阻塞

    什么是阻塞阻塞?我們就用管道的讀寫來舉例子。
    的頭像 發表于 03-25 10:04 ?468次閱讀

    socket阻塞阻塞的區別是什么

    在計算機編程中,socket 是一種通信端點,用于在網絡中進行數據傳輸。Socket 可以是阻塞的或阻塞的,這兩種模式在處理數據傳輸時有不同的行為。
    的頭像 發表于 08-16 11:13 ?583次閱讀

    socket編程中的阻塞阻塞

    網絡編程中, socket 是一個非常重要的概念,它提供了一個抽象層,使得開發者可以不必關心底層的網絡通信細節。 socket 編程中的阻塞
    的頭像 發表于 11-01 16:13 ?134次閱讀