初探IO复用
前言
在之前的文章中,我具体实现了一个并发回射服务器并给它加载了僵尸子进程的自动清理信号机制。在正常情况下,它已经可以很好地工作了,但它能否合理应对一些特殊情况呢?
问题发现
先来看看当服务器的客户子进程突然崩溃的情况。
1. 终端启动上篇文章中已经实现了的并发服务器
2. 在另一个终端中启动上篇文章中已经实现了的客户端并执行回射测试:
可以看到运行良好
3. 找到服务器子进程的ID,然后kill掉它:
4. 再回到客户端执行回射,但这一次我们得到这样的结果:
表面上看,客户端的响应也是正常的,但在实际应用中却大错特错了。因为当服务器的客户子进程结束,这边客户端应该立马收到连接失效的信息,而不是还“ 一厢情愿 ”地往里面输数据白白浪费时间。在《UNIX网络编程中》作者是这样描述这种情况的“ 当FIN分节到达时,客户正阻塞在fgets上。客户实际是应对两个描述符 --- 套接字分节和用户输入。程序不能阻塞于这两个描述符中的某一个上,而是应该阻塞于任何一个上 ”。那么如何做到“ 阻塞于任何一个上 "?这就引出了本文要讨论的重要概念 --- IO复用。
重要概念:IO复用
在程序有多个IO( 如套接字描述符和用户输入 )的情况下,内核一旦发现某个或多个IO条件就绪,就通知进程。这个能力就叫做IO复用。
具体实现
请看接下来的两篇文章:IO复用之select实现 或者 IO复用之poll实现
初探IO复用的更多相关文章
- 第十六篇:初探IO复用
前言 在之前的文章中,我具体实现了一个并发回射服务器并给它加载了僵尸子进程的自动清理信号机制.在正常情况下,它已经可以很好地工作了,但它能否合理应对一些特殊情况呢? 问题发现 先来看看当服务器的客户子 ...
- 第十七篇:IO复用之select实现
前言 在看过前文:初探IO复用后,想必你已对IO复用这个概念有了初步但清晰的认识. 接下来,我要在一个具体的并发客户端中实现它(基于select函数),使得一旦服务器中的客户进程被终止的时候,客户端这 ...
- IO复用之select实现
前言 在看过前文:初探IO复用后,想必你已对IO复用这个概念有了初步但清晰的认识.接下来,我要在一个具体的并发客户端中实现它( 基于select函数 ),使得一旦服务器中的客户进程被终止的时候,客户端 ...
- Libevent的IO复用技术和定时事件原理
Libevent 是一个用C语言编写的.轻量级的开源高性能网络库,主要有以下几个亮点:事件驱动( event-driven),高性能;轻量级,专注于网络,不如 ACE 那么臃肿庞大:源代码相当精炼.易 ...
- Linux网络编程-IO复用技术
IO复用是Linux中的IO模型之一,IO复用就是进程预先告诉内核需要监视的IO条件,使得内核一旦发现进程指定的一个或多个IO条件就绪,就通过进程进程处理,从而不会在单个IO上阻塞了.Linux中,提 ...
- IO复用三种方式
简介 IO复用技术,简单来说就是同时监听多个描述符.在没有用到IO复用以前,只能是一个线程或一个 线程去监听,服务端同时有多个连接的时候,需要创建多个线程或者进程.而且,并不是所有的连 接是一直在传输 ...
- IO复用_select函数
select函数: #include <sys/select.h> #include <time.h> #include <sys/types.h> #includ ...
- 简单聊下IO复用
没图,不分析API Java中IO API的发展:Socket -> SocketChannel -> AsynchronousSocketChannelServerSocket -> ...
- IO复用(Reactor模式和Preactor模式)——用epoll来提高服务器并发能力
上篇线程/进程并发服务器中提到,提高服务器性能在IO层需要关注两个地方,一个是文件描述符处理,一个是线程调度. IO复用是什么?IO即Input/Output,在网络编程中,文件描述符就是一种IO操作 ...
随机推荐
- 如何从sql server导出到csv文件
如何从sql server导出到csv文件,具体代码如下: private static void WriteHeader(SqlDataReader reader, TextWriter outpu ...
- Quotes in shell(bash, csh)
There are three kinds of quote: single quote('), double quote("), backslash(\), how shell expla ...
- utilize HttpClient to generate a SSL access and generate REST access to fetch data, async programming? cool and brief
WebRequestHandler handler = new WebRequestHandler(); try { X509Certificate2 certificate = new X509Ce ...
- Intent显示启动与隐式启动
Android的Acitivity启动大致有两种方式:显式启动与隐式启动.下面分别介绍: 1.显示启动: 清单文件注册Activity <activity android:name=" ...
- jq ajax之beforesend(XHR)
用于在向服务器发送请求前添加一些处理函数.例如:搜寻附近店铺,未搜寻出来的时候显示:正在搜寻中... 常见的一种效果,在用ajax请求时,没有返回前会出现前出现一个转动的loading小图标或者“内容 ...
- Mongodb的使用(下)
高级操作 讲解关于mongodb的高级操作,包括聚合.主从复制.分片.备份与恢复.MR 完成python与mongodb的交互 聚合 aggregate 聚合(aggregate)主要用于计算数据,类 ...
- 如何获取MAC的进程数
参考链接: https://www.cnblogs.com/watchdatalearn2012620/p/3182477.html https://segmentfault.com/q/101000 ...
- jquery小技巧:使用jquery.confirm和PNotify实现弹出提示和消息提示
在从UIKIT前端换到BOOSTRAP前端时,一些转换的技巧. https://myclabs.github.io/jquery.confirm/ http://sciactive.github.io ...
- 模块化开发(seajs)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- Codeforces 597B Restaurant(离散化 + 贪心)
题目链接 Restaurant 题目意思就是在$n$个区间内选出尽可能多的区间,使得这些区间互不相交. 我们先对这$n$个区间去重. 假如有两个区间$[l1, r1],[l2, r2]$ 若满足$l1 ...