Unix/Linux 编程:网络编程之 IO模型

本文详细介绍了Unix/Linux系统中的各种IO模型,包括阻塞IO、多线程、非阻塞IO、异步IO和信号驱动IO。重点讨论了Reactor和Proactor服务器模型,阐述了它们的原理、优缺点以及应用,强调了在高并发场景下的性能和扩展性考虑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、阻塞IO(blocking)

主线程阻塞等待用户连接请求(accept阻塞)。等请求达到以后再调用(recv)系统调用接收数据,这时候又阻塞等待。

等内核将数据接受好并从内核空间拷贝到用户空间后,系统调用返回,表明数据读取完毕。

这个操作在等待IO的时候会将主线程挂起而不能执行其他操作,浪费了大量服务器性能。

二、多线程(blocking+multithread)

由于accept系统调用会对每个客户端的连接都返回一个fd,因此可以利用多线程的方法。主线程只负责accept处理连接请求。

在收到具体的请求以后 ,将客户请求的fd作为参数传给工作线程,工作线程会调用相应的线程函数来处理。

理解值观,在处理并发量不太高的时候效果可以。但是如果并发量特别高的情况下,线程的切换和调度会带来大量cpu资源的浪费(可能有大量的线程被阻塞再IO等待)并且创建线程的开销也不低。

三、非阻塞IO(no-blocking)

非阻塞IO在数据未准备好的情况下,recv等系统调用也能立即返回。而不会将整个主线程阻塞,主线程可以去处理其他操作。

然而需要主线程自行去检查每个IO队应的fd是否准备就绪(轮询select/poll或者等待系统通知epoll等)。

select/epoll的优势不是在于对于单个连接能处理得更块,而是在于能够处理更多的连接!

而传统的阻塞式的web模型,再处理连接数不是那么高的情况下,性能还是可以的。当连接数上去以后就会遇到性能瓶颈!因为大量的线程切换也是需要开销的。并且线程之间的数据同步,需要用到大量的锁等资源,还容易造成死锁等问题。

 

四,异步IO

asynchronous I/O Linux下的异步IO通常用于磁盘操作,不可用于网络。<

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值