当前位置:网站首页>NIO、BIO、AIO

NIO、BIO、AIO

2022-06-24 22:20:00 Nice2cu_Code

IO模型

一、同步、异步

  • 同步:線程自己去發起請求,獲取結果(一個線程)
  • 异步:線程自己發起結果,但不去獲取結果,而是由其它線程獲取結果後發送給這個線程(至少兩個線程)

二、數據讀取的過程

當用戶線程調用 channel.readstream.read 後,會切換至操作系統內核態來完成真正的數據讀取,而讀取又分為兩個階段,分別為:

  • 等待數據階段
  • 複制數據階段
image-20210625110539696

三、同步阻塞、同步非阻塞、同步多路複用、异步非阻塞

  • 阻塞 IO(同步)(BIO)

    • 用戶線程被阻塞,調用read方法後,在等待內核空間讀取數據的時間內,不能進行其他操作,只能等待
    image-20210625110642843
  • 非阻塞 IO(同步)

    • 用戶線程不會被阻塞,調用read方法後,即使內核空間沒有讀取到數據,會返回0,用戶線程循環調用 read 方法,不會阻塞,直到複制階段才被阻塞
    • 數據的複制階段仍然是阻塞的
    image-20210625110722976
  • 多路複用(同步,單個線程配合selector使用)(NIO)

    • 阻塞直到事件發生
    • 在等待階段和複制階段都會阻塞(單個channel的角度看,是阻塞的)
    • 多個channel的角度看,是非阻塞的,一個channel中沒有數據,不會阻塞,可以處理其他channel
    image-20210625110747910
  • 异步非阻塞(异步 IO)(AIO)

    • 用戶調用read方法之後,內核空間立刻返回,告知得到用戶的請求,等內核空間完成對應的操作之後,由另一個線程將結果返回
    • 內核空間完成操作之後,會調用回調方法回傳數據
    • 由於立刻返回,所以异步一定不是阻塞,故异步一定是非阻塞的
    image-20210625110812252
  • 阻塞 IO vs 多路複用(均為同步)

    • 阻塞IO,處理一個連接的時候不能處理另一個連接,如果想要處理一個新的連接,必須等到上次的連接完全處理結束之後才可以處理新的連接
    • 多路複用,一個 selector 可以同時處理多個 channel 的事件,某個 channel 中沒有數據時,線程無需等待,可以處理其他事情
    image-20210625110955834
原网站

版权声明
本文为[Nice2cu_Code]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/175/202206241615542398.html