当前位置: 首页 > news >正文

Linux系统网络I/O模型

Linux系统网络I/O模型
几个概念:

从程序的自身角度来看,I/O分为阻塞和非阻塞:

  1. 阻塞I/O:在进行I/O操作(比如调用read、write、recv、send等系统调用API时)的时候,内核的缓存区里的数据拷贝到用户态的缓存区,若此时内核缓存区里没有数据,则会等待内核把数据准备好,在这个过程中,应用进程/线程处于一种挂起状态,我们看到在程序调用这些API的地方是阻塞的情形,所以称为阻塞I/O。
  2. 非阻塞I/O:在进行I/O操作(比如调用read、write、recv、send等系统调用API时)的时候,内核的缓存区里的数据拷贝到用户态的缓存区,若此时内核缓存区里没有数据,也会直接返回。我们看到进程/线程并没有任何的等待,所以称为非阻塞I/O。

从通信双方响应的方式角度来看,I/O分为同步和异步:
注意:谈论同步和异步,要上升到整个系统(即通信双方)的角度来讨论。

  1. 同步I/O:请求方发出I/O请求后,一直等待对方处理,等到结果返回,
  2. 异步I/O:请求方发出I/O请求后,在对方处理结果的时候不需要等待,发出请求后直接返回;等对方处理好了对方会通知请求方。

        很明显,同步方式的逻辑和代码都很容易实现,而异步较难实现。举例:你去派出所办身份证,你可以有两种方式:第一种、你告诉派出所的工作人员要办身份证(发出请求),然后等派出所工作人员办理,你在派出所一直等,等了好多天,办好了给你(返回处理结果)。第二种、你告诉派出所的工作人员要身份证(发出请求),并且留了手机号给工作人员,让办好了给你打电话,然后你去取,这时候你就可以回去了(不需要在等待)。过了好多天给你打电话说办好了,你去取回身份证(返回结果)。
        办身份第一种方式就是同步,第二种就是异步。同步很简单,你不用考虑太多,反正就是一直等。但是你就不能离开,因为你离开了,再也找不到你了,因为你没登记任何信息。而异步通过电话号就能找到你,但是多了电话号登记,给你打电话,还有你总共去派出所要跑两趟等这些过程。不管是同步还是异步都能实现,就看你自己选择哪种,哪种适合你,你如果连手机都没有,那你只能选择同步。
        阻塞、非阻塞,同步、异步经常放在一起讨论,很容易把人弄晕,但是如果从不同的角度看,很容易就懂了。阻塞、非阻塞从程序自身,进程/线程会不会""在系统I/O的地方;而同步、异步从整个系统设计,通信双方的角度来看。
异步I/O的方式在编程的时候通常通过向系统注册一个回调函数,等对方有结果的时候,系统会通过调用这个回调函数的方式通知我们。

相关文章:

  • * CIL library *(* CIL module *) : error LNK2005: _DllMain@12 already defined in mfcs120u.lib(dllmodu
  • error LNK2001: unresolved external symbol __declspec(dllimport) const XXXX::`vftable'
  • 高性能服务端开发知识点
  • 单文档让默认的菜单栏不显示
  • 【重学Linux系列(二)之一一Linux内核更换】
  • Linux扩容(虚拟机)
  • python常用的几个操作(读数据库、读ini、写日志)
  • zookeeper实践及原理
  • 敏捷开发
  • mogodb数据库恢复报错:too many positional arguments
  • mongodb恢复数据库
  • windows10安装Ubuntu子系统
  • socket API(linux)
  • Linux socket编程实战(阻塞)
  • Linux socket编程实战(非阻塞)
  • 《Java8实战》-第四章读书笔记(引入流Stream)
  • 【跃迁之路】【463天】刻意练习系列222(2018.05.14)
  • ES学习笔记(12)--Symbol
  • iBatis和MyBatis在使用ResultMap对应关系时的区别
  • jdbc就是这么简单
  • Redash本地开发环境搭建
  • Redis字符串类型内部编码剖析
  • Sequelize 中文文档 v4 - Getting started - 入门
  • SpiderData 2019年2月25日 DApp数据排行榜
  • unity如何实现一个固定宽度的orthagraphic相机
  • 从0到1:PostCSS 插件开发最佳实践
  • 从零开始在ubuntu上搭建node开发环境
  • 翻译 | 老司机带你秒懂内存管理 - 第一部(共三部)
  • 将 Measurements 和 Units 应用到物理学
  • 如何设计一个比特币钱包服务
  • 深度解析利用ES6进行Promise封装总结
  • 腾讯大梁:DevOps最后一棒,有效构建海量运营的持续反馈能力
  • 文本多行溢出显示...之最后一行不到行尾的解决
  • 想写好前端,先练好内功
  • 用mpvue开发微信小程序
  • ​马来语翻译中文去哪比较好?
  • ​直流电和交流电有什么区别为什么这个时候又要变成直流电呢?交流转换到直流(整流器)直流变交流(逆变器)​
  • #设计模式#4.6 Flyweight(享元) 对象结构型模式
  • $HTTP_POST_VARS['']和$_POST['']的区别
  • (C)一些题4
  • (pytorch进阶之路)扩散概率模型
  • (zz)子曾经曰过:先有司,赦小过,举贤才
  • (第9篇)大数据的的超级应用——数据挖掘-推荐系统
  • (免费领源码)python#django#mysql公交线路查询系统85021- 计算机毕业设计项目选题推荐
  • (十)DDRC架构组成、效率Efficiency及功能实现
  • *_zh_CN.properties 国际化资源文件 struts 防乱码等
  • .NET MVC 验证码
  • .Net Remoting常用部署结构
  • .NET Standard 支持的 .NET Framework 和 .NET Core
  • .NET 中各种混淆(Obfuscation)的含义、原理、实际效果和不同级别的差异(使用 SmartAssembly)
  • .NET/C# 利用 Walterlv.WeakEvents 高性能地定义和使用弱事件
  • .NET/C# 使窗口永不激活(No Activate 永不获得焦点)
  • .NET关于 跳过SSL中遇到的问题
  • /etc/motd and /etc/issue
  • /etc/shadow字段详解