文档章节

Netty学习笔记1:5种IO模型

强子大叔的码田
 强子大叔的码田
发布于 2014/07/19 09:33
字数 822
阅读 1.7K
收藏 74

1 阻塞IO模型

从字面来理解,就是调用时可能被阻塞,
什么叫阻塞,要知道一个进程有N种状态,学过OS都知道
如果阻塞,就会把当前进程放在某个条件的阻塞队列里。
直到条件满足了,才会转移此进程进入就绪队列。
当然,就绪队列还有个优先级的概念,就不扯远了。

阻塞IO.
1)调用API,比如 recvfrom,从用户态进入内核态。
2) 内核发现无数据,将进程信息节点插入阻塞队列,等待数据。
3)进程一直阻塞,阻塞,阻塞。
4)数据到达,内核拷贝数据,
数据的流动路径是:网卡---socket内核缓冲区---用户的缓冲区。
5)拷贝完成后返回,我们就可以得到recvfrom的结果,成功/失败。

 2 非阻塞IO模型

什么叫非阻塞,就是从用户角度来说,函数立即可以得到结果:成功/失败。

1)用户调用recvfrom,内核发现无数据,立即返回结果。

2)用户调用recvfrom,内核发现无数据,立即返回结果。

3)用户调用recvfrom,内核发现无数据,立即返回结果。

4)用户调用recvfrom,内核发现有数据,将数据从socket内核缓冲区复制到
用户缓冲区,返回结果。

 3 IO复用模型

1)将多个需要监听的fd给epoll,让其监控。
注意:epoll本身是阻塞的,可以设定时间。
2)epoll返回结果,用户可以知道哪些fd可读,可写,有异常等。
3)剩下的就是用户自己按需操作fd.

比如redis就是使用IO复用模型。
备注:epoll的最大fd个数:cat /proc/sys/fs/file-max,跟内存关系比较大

 4)信号驱动模型

1)开启socket信号驱动IO功能,
通过sigaction设置信号处理函数。
2)当socket有数据时,发生一个SIGIO信号,
执行之前的信号处理函数。
3)用户逻辑放在信号处理函数里实现。

 5)异步IO

1)告知内核启动某个操作,在内核完成所有的操作(包括复制数据到用户缓冲区)后
通过信号机制通知用户。
2)信号处理程序直接处理用户缓冲区里的数据,因为数据已经被内核复制完毕。
与信号驱动的区别是:
信号驱动通过信号告知,可以启动某个操作了。
异步IO通知用户:我连复制数据的步骤都替你完成了,用户只需要处理即可。

 

总结一下:

为什么会出现这么多的模型?

需求来源于需求,我们想想在开发网络程序时,对一个socket需要关注哪些方面?

1)这个socket可读,可写,有异常?

2)有数据可操控时,复制数据到用户缓冲区。

下面是我对这几种IO模型的理解

是否解决socket

可用的问题

是否自动将数据从套接字缓冲区

复制到用户缓冲区

评分

阻塞模型

×

×

非阻塞模型

×

×

★★

IO复用模型

×

★★★

信号驱动

×

★★★

异步IO

★★★★★

 

© 著作权归作者所有

强子大叔的码田

强子大叔的码田

粉丝 922
博文 1491
码字总数 1247043
作品 9
南京
架构师
私信 提问
加载中

评论(8)

chuckpu
chuckpu
mark
强子大叔的码田
强子大叔的码田 博主

引用来自“丑矬穷”的评论

楼主很厉害,博客里都是最前沿的后台技术,我用c#搞了5年的数据库增删改查,正在考虑逃离Windows,博主有好的建议吗?我的Email:lbp0408@gmail.com

引用来自“优雅先生”的评论

不会吧,
啥?
优雅先生
优雅先生

引用来自“丑矬穷”的评论

楼主很厉害,博客里都是最前沿的后台技术,我用c#搞了5年的数据库增删改查,正在考虑逃离Windows,博主有好的建议吗?我的Email:lbp0408@gmail.com
不会吧,
强子大叔的码田
强子大叔的码田 博主

引用来自“丑矬穷”的评论

楼主很厉害,博客里都是最前沿的后台技术,我用c#搞了5年的数据库增删改查,正在考虑逃离Windows,博主有好的建议吗?我的Email:lbp0408@gmail.com
我基本上只用c和java,C#我也用过,本科工作那年用了一会,对于C#我还真不知道该怎么办,反正我当时觉得做C#没有java和c的前途光明
丑矬穷
丑矬穷
楼主很厉害,博客里都是最前沿的后台技术,我用c#搞了5年的数据库增删改查,正在考虑逃离Windows,博主有好的建议吗?我的Email:lbp0408@gmail.com
阿甘
阿甘

引用来自“丑矬穷”的评论

Java越来越火了

是的
强子大叔的码田
强子大叔的码田 博主

引用来自“丑矬穷”的评论

Java越来越火了
感觉netty比用c开发麻烦
丑矬穷
丑矬穷
Java越来越火了
Netty浅析 - 1. 基础

前言 在了解一个事物之前,最好能对它的基本属性和相关概念有个基本的认知,所以学习Netty之前,也有必要了解与Netty相关的基础概念知识;本篇将对Netty做一个基础性的介绍,主要包括Netty的...

简xiaoyao
2018/12/02
0
0
netty EventLoop学习(二)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lupeng/article/details/82469975 EventLoop学习 昨天我开始学习netty框架,写了一个小例子,今天学习下其中比...

孤落
2018/09/06
0
0
NIO学习笔记

NIO 操作系统背景知识 unix提供了5中io模型,其中java的底层实现依赖的是操作系统的io复用模型。linux提供select/poll,进程通过将一个或多个fd(文件描述符)传递给select或者poll,阻塞在sel...

肥肥小浣熊
2017/11/10
0
0
Netty实战入门详解——让你彻底记住什么是Netty(看不懂你来找我)

一、Netty 简介 Netty 是基于 Java NIO 的异步事件驱动的网络应用框架,使用 Netty 可以快速开发网络应用,Netty 提供了高层次的抽象来简化 TCP 和 UDP 服务器的编程,但是你仍然可以使用底层...

爱码小士
2019/06/14
224
0
带你通透Netty原理之架构解析

Netty 是一个异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。 给大家推荐一个程序员学习扣群:854818273。群里有分享的视频,还有思维导图 群公告有视频,...

java知识分子
2018/11/05
68
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周四乱弹 —— 水果你们都没吃全

Osc乱弹歌单(2020)请戳(这里) 【今日歌曲】 @ 莱布妮子:分享五月天的单曲《温柔》@小小编辑 @cIouddyy @clouddyy 《温柔》- 五月天 手机党少年们想听歌,请使劲儿戳(这里) @FalconChe...

小小编辑
32分钟前
91
1
聚合支付网站被黑客攻击 导致数据库被篡改的防御办法

2020春节即将来临,收到新聚合支付平台网站客户的求助电话给我们Sinesafe,反映支付订单状态被修改由原先未支付修改为已支付,导致商户那边直接发货给此订单会员了,商户和平台的损失较大,很多码...

网站安全
昨天
63
0
MySQL-基于SELECT查询的UPDATE查询

我需要检查(从同一张表)基于日期时间的两个事件之间是否存在关联。 一组数据将包含某些事件的结束日期时间,另一组数据将包含其他事件的开始日期时间。 如果第一个事件在第二个事件之前完成...

javail
昨天
70
0
将PostgreSQL数据库复制到另一台服务器

我正在将生产PostgreSQL数据库复制到开发服务器。 什么是最快,最简单的方法? #1楼 pg_dump the_db_name > the_backup.sql 然后将备份复制到您的开发服务器,并使用以下命令进行还原: ps...

技术盛宴
昨天
130
0
[译]软件架构师之路

今天给大家带来一篇自己翻译的干货《软件架构师之路》。本周Github上升很快的项目。其内容对致力于成为软件架构师(不论前后端)的同学应该都会有极大的帮助。 项目地址: 中文地址 https://...

gamedilong
昨天
79
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部