Linux网络编程之I/O模型(详解)


本博客参考《Linux C/C++ 服务器开发实践》——朱文伟 李建英

一、I/O模型是什么?

I/O即数据的读取或写入的操作,通常用户进程中的一个完整I/O分为两个阶段:
用户进程空间 <——> 内核空间
内核空间 <——> 设备空间。
其中,I/O分为内存I/O、网络I/O 和 磁盘I/O。
这里主讲网络。

二、网络I/O

基于上面的推理,网络I/O操作通常包括两个不同阶段:
(1)等待网络数据到达网卡,把数据从网卡读取到内核缓冲区,准备好数据。
(2)从内核缓冲区复制数据到用户进程空间。

网络应用需要处理两个大类的问题:网络I/O 和 数据计算处理。网络I/O是设计高性能服务器的基础,相对于后者,网络I/O的延迟给应用带来的性能瓶颈更大。

网络I/O的分类图:
在这里插入图片描述

三、区分同步异步、阻塞非阻塞两个概念

同步和异步

对于一个线程的请求调用来讲,同步和异步的区别在于是否要等待这个请求出最终结果。
举个例子:比如你去快餐店,同服务员要一份薯条,服务员说:“对不起,薯条要现做,需要十分钟。”于是,你有了两个选择:(1)一直在前台等待,直到薯条做好了,然后再去做别的事;(2)先去做别的事,薯条做好后,服务员再wx通知你,你再去取。很明显,前者和后者就是同步和异步的区别。使用异步方式编程,性能是会高于同步的,但是编程模型会复杂。

阻塞和非阻塞

阻塞和非阻塞与等待消息通知是的状态有关。阻塞调用是指调用结果返回之前,当前线程会被挂起,函数得到结果后,才唤醒去做下一步。非阻塞则指不能立即得到结果之前,该函数不会阻塞线程,线程不会休眠,而是立即返回,并设置相应的errno。虽然非阻塞更能“压榨”线程,提高CPU的利用率,但也要综合考虑系统线程切换的成本。
线程被阻塞的原因有如下:
(1)线程通过调用sleep方式进去休眠状态;
(2)线程调用一个在I/O上被阻塞的操作,该操作在输入/输出操作完成之前不会返回结果;
(3)线程试图得到一个锁,而该线程正被其它线程持有,于是只能进入阻塞状态,等待锁;
(4)线程在等待某个触发的条件(条件变量);
(5)线程执行了一个对象的wait()方法,直接进入阻塞状态,等待其它线程执行notify()或者notifyAll()方法。

这里再对第二条展开说明:
能够阻塞的Linux socket API调用如下:
(1)输入操作。recv、recvfrom函数。如果套接字缓冲区内没有数据可读,则调用线程在数据到来之前一直阻塞。
(2)输出操作。send、sendto函数。如果套接字缓冲区没有可用的空间,线程会一直休眠,直到有空间。
(3)接受连接。accept函数。如果此时没有连接请求,线程就会进入阻塞状态。
(4)外出连接。connect函数。该函数在收到服务器的应答之前,不会返回。这意味着TCP连接总会等待至少到服务器的一次往返时间。
注:可用将socket设置成非阻塞的模式,这样上面的函数就变成了非阻塞了。

我们可以看出,阻塞函数一定要等待结果返回才做下一步,所以阻塞函数一定是同步的。但同步函数不一定是阻塞的,比如同步函数在计算一件很复杂的事情,得出结果再返回,此时它没有让线程阻塞,却是同步的。
反之,异步一定是非阻塞的。

同步异步和阻塞非阻塞之间的关系

同步阻塞:一直干看着,等待薯条做好;
同步非阻塞:边打王者边等待薯条做好,每打完一局王者后,就看一看薯条是否做好了(轮询);
异步非阻塞:边打王者边等待薯条做好,薯条做好后,服务员直接叫你去拿(中断),你可以打完这局王者再去拿,或者直接挂机然后去拿。

四、五种I/O模型比较

在这里插入图片描述
前四种I/O都是同步操作,它们的区别在于第一阶段,而第二阶段是相同的:在数据从内核复制到应用缓冲区期间,进程阻塞于recvfrom的调用,这个阻塞时间就是数据的拷贝时间。而异步I/O模型在等待数据和接收数据的这两个阶段都是非阻塞的,可以处理其他的逻辑,用户进程将整个I/O操作交由内核完成,内核完成后发送通知。在此期间,用户进程不需要检查I/O操作的状态,也不需要主动拷贝数据。

都读到这里了,请给个免费的赞吧~
后期,我会按照上面模型,循环渐进讲解服务器的开发,关注我不迷路~

更多内容,请诸位移步下面博客

http://t.csdnimg.cn/jtLMK

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值