网络编程(三)

网络编程I/O  模型


1.分类、原理

五种,
阻塞式I/O       网络编程(三)
非阻塞I/O       区分recv返回值-1,判断errno==EWOULDBLOCK==EAGAIN,轮询网络编程(三)
多路复用I/O     同时关注多个套接字,哪个套接字准备好就处理哪个网络编程(三)
信号驱动I/O     事先注册新号处理函数,告诉内核,关注哪个套接字,如果有数据,内核就告诉应用程序拷贝数据网络编程(三)
异步I/O aio_read告诉内核,内核直接把数据拷贝给应用程序网络编程(三)

2.非阻塞IO模型的实现方法
有两种


3.多路复用有三种表现形式
select
掌握select函数第一个参数的意义?
除了第一个参数外,其它的都是值结果参数
缺点:
1.关注的套接字有限;
2.每次调用需要重新告诉内核关注哪些套接字;
3.内核要不停地扫描关注的套接字(内核一直扫描占用CPU),每次调用的时候,都需要所有被监听的文件的描述符。内核必须遍历所有被监视的文件描述符。当这个表变得很大时,每次调用,都会成为性能降低。
poll

epoll 
优点:
1.关注的套接字比select多,支持几十万的请求的并发量;cat /proc/sys/fs/epoll/max_user_watches
2.不用每次都要重新告诉内核关注哪些套接字,只需要告诉一次
3.高效,内核中采用回调机制,有事件准备好就唤醒,内核不用不停地扫描;
4.采用边沿触发(EPOLLET)eage triggered,和非阻塞结合使用

创建一个epoll实例:  int epoll_create(int size);


int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
第一个参数:epoll描述符
第二个参数:命令
第三个参数:描述符
第四个参数:事件

int epoll_wait(int epfd, struct epoll_event *events,int maxevents, int timeout);
第一个参数:epoll描述符
第二个参数:哪些事件发生,结果,这个是指向结构体数组
第三个参数:数组长度
第四个参数:超时
返回值:有多少个事件发生,返回0,表示超时返回

工作当中select能用就选择select,满足不了需求就换epoll。


4.什么时候使用多路复用
一般来说满足用户的请求,服务器能够很快的处理完;
适用于1w个连接以下,保证七八千连接之内,大部分情况,服务器都能很快处理
对于需要长时间处理的,服务器单独创建进程去实现,如下载视频操作……