Notes
  • 速记
  • 前端面试
  • HTML / CSS
    • HTML
    • CSS
    • CSS Modules
      • CSS Modules
        • CSS Modules Usage
      • Stylus
      • Nunjucks
  • Javascript
    • 正则表达式
    • 代理(Proxy)和反射(Reflection)
    • 类型转换
    • 按位操作
    • 数据可视化
    • 数据采集
      • 无(全)埋点
      • 模块曝光事件
    • package
      • axios
    • Event Loop
    • React
      • React热身
      • VDOM和DOM-diff
    • Vue
    • Omi
    • MVVM
    • 百度小程序
    • AST抽象语法树
    • ServiceWorker
    • WebSocket
  • NodeJS
    • Assert 断言
    • chai.js 断言库
    • Node Global Obj And Var
    • CLI Writed By Nodejs
    • Framework
      • Hapi Js Framework
    • Electrode JS
      • Electrode Platform
      • Electrode Question
    • Redux
      • Redux Basic Usage
      • Middleware And Asynchronous
      • React-Redux 的用法
    • NPM
      • package.json
      • semver
    • Webpack
      • 编写插件
    • 同构渲染
    • 调用DLL
  • 服务端
    • Inotify
    • Linux
    • Nginx
      • Nginx简介
      • Nginx原理、安装预配置
    • TCP/IP 协议
    • HTTP 协议
      • 基础概念篇
      • 协议详解篇
    • Process
      • 阻塞与非阻塞
      • 进程与线程优性能
  • 数据库
    • GraphQL
  • 移动端
  • 微信小程序
    • 微信小程序安装(linux)
    • 小程序第三方框架
  • 开发工具
    • 开发工具安装
    • Vim Command Collection
    • Git
      • Git Rule
      • Git Submodule
      • gitignore
    • Lerna
    • Ubuntu开发环境安装
  • 运维测试
    • Docker
      • Docker Synopsis
      • docker.sock
    • Nightwatch
    • Jest
  • 算法/数学/架构
    • 设计模式
    • 架构设计经验分享
    • 前端架构
    • 基本数据结构
    • 函数式编程
  • 软件工程
    • 软件生命周期
Powered by GitBook
On this page
  • 阻塞與非阻塞、同步與異步I/O模型
  • I/O 模型:
  • Linux 的幾種I/O 模型介紹:

Was this helpful?

  1. 服务端
  2. Process

阻塞与非阻塞

怎麼理解阻塞和非阻塞的區別?

1. 同步和異步 同步和異步關注的是消息通信機制( synchronous communication/ asynchronous communication) 所謂同步,就是在發出一個調用時,在沒有得到結果之前,該-調用-就不返回。但是一旦調用返回,就得得到返回值了。 換句話說,就是由-調用者-主動等待這個-調用-結果。 而異步則是相反,-調用-在發出之後,這個調用就直接得到結果。而是在-調用-發出後,-換句話說-當一個異步過程調用發出後,調用者不會立即得到結果。而是在-調用-發出後,-被調用者-通過狀態、通知來通知調用者,或通過灰調函數處理這個調用。

典型的異步編程比如Node.js

2. 阻塞和非阻塞 阻塞和非阻塞關注的是程序在等待調用結果(消息,返回值)是的狀態。 阻塞調用是指調用結果返回之前,但錢線程會被掛起。調用線程指頭在得到結果之後才會返回。 非阻塞調用指在不能立刻得到結果之前,該調用不會阻塞當前線程。

阻塞與非阻塞、同步與異步I/O模型

I/O 模型:

1. Linux 下的五中I/O模型

  • 阻塞I/O

  • 非阻塞I/O

  • I/O 復用

  • 信號驅動I/O

  • 異步I/O

    前四種都是同步,只有最後一種才是異步IO;

2. Windows 的異步I/O模型有下面六種

  • select選擇模型

  • WSAAsyncSelect 異步選擇模型

  • WSAEventSelect 事件選擇模型

  • Overlapped I/O 事件通知模型

  • Overlapped I/O 完成例程模型

  • IOCP 模型

Linux 的幾種I/O 模型介紹:

1. 阻塞I/O模型

進程會一直阻塞,直到數據拷貝完成 應用程序調用一個I/O函數,導致應用程序阻塞,等待數據準備好.如果數據沒有準備好,一直等待...數據準備好了,從內核拷貝到用戶空間,I/O函數返回成功指示.

可能阻塞套接字的Windows Sockets API調用分爲以下四種: 1. 輸入操作: recv(),recvfrom(),WSARecv() 和 WSARecvfrom() 函數. 以阻塞套接字爲參數調用該函數接收數據.如果此時套接字緩衝區內沒有數據刻度,則調用線程在數據到來前一直睡覺. 2. 輸出操作: send(), sendto(), WSASend() 和 WSASendto() 函數.以阻塞套接字爲參數調用該函數發送數據.如果套接字緩衝區沒有可用空間,縣城會一直睡覺,直到有空間. 3. 接受連接: accept() 和 WSAAccept() 函數.以阻塞套接字爲參數調用該函數,等待接受對方的連接請求.如果此時沒有連接請求,線程就會進入睡眠狀態. 4. 外出連接: connect() 和 WSAConnect() 函數. 對於TCP鏈接,客戶端以阻塞套接字爲參數,調用該函數,調用該函數向服務器發起鏈接.該函數在收到服務器的贏大前,不會返回.這意味着TCP鏈接總會等待至少到服務器的一次往返時間.

2. 非阻塞I/O模型

非阻塞I/O 通過進程反復調用I/O函數(多次系統調用,並馬上返回);在數據拷貝的過程中,進程是阻塞的; 我們把一個SOCKET接口設置爲非阻塞就是告訴內核,黨所請求的I/O操作無法完成時,不要將進程睡眠,而是返回一個錯誤,這樣我們的I/O操作函數將不斷的測試數據是否已經準備好了,如果沒有準備好,繼續測試,直到數據準備好爲止.在這個測試的過程中,會大量的佔用CPU的時間.

非阻塞套接字在控制建立的多個連接,在數據的收發量不均,時間不定時,明顯具有優勢.這種套接字在使用上存在一定難度,但只要排除這些困難,他在功能上還是非常強大的.

3. I/O復用模型

4. 信號驅動I/O模型 5. 異步I/O模型 6. 五種I/O模型比較

PreviousProcessNext进程与线程优性能

Last updated 5 years ago

Was this helpful?

阻塞I/O模型圖
非阻塞I/O模型圖