IO操作方式
阻塞等待
好处:不占用CPU宝贵的时间片
缺点:同一时刻只能处理一个操作,效率低
{多线程或多进程}
非阻塞,忙轮询
好处:提高了程序的执行效率
缺点:需要占用更多的CPU和系统资源
解决方案:
1.select(最高链接1024个文件描述)/poll(数组无限制)
只会提示有几个客户端链接, 需要服务器遍历找出是哪些?
2.epoll
不止提示有几个客户端链接, 还会提供是哪些链接信息
I/O多路转接技术
1.先构造一张有关文件描述符的列表,将要监听的文件描述符添加到该文件
2.然后调用一个函数,监听该表中的文件描述符,直到这些描述符表中的一个进行I/O操作时,该函数才返回。
该函数为阻塞函数
函数对文件描述符的检测操作是由内核完成的
阻塞等待
好处:不占用CPU宝贵的时间片
缺点:同一时刻只能处理一个操作,效率低
{多线程或多进程}
非阻塞,忙轮询
好处:提高了程序的执行效率
缺点:需要占用更多的CPU和系统资源
解决方案:
1.select(最高链接1024个文件描述)/poll(数组无限制)
只会提示有几个客户端链接, 需要服务器遍历找出是哪些?
2.epoll
不止提示有几个客户端链接, 还会提供是哪些链接信息
I/O多路转接技术
1.先构造一张有关文件描述符的列表,将要监听的文件描述符添加到该文件
2.然后调用一个函数,监听该表中的文件描述符,直到这些描述符表中的一个进行I/O操作时,该函数才返回。
该函数为阻塞函数
函数对文件描述符的检测操作是由内核完成的
3.在返回时,它告诉进程有多少(哪些)描述符要进行I/O操作。
1.水平触发模式-根据读来解释
只要fd对应的缓冲区有数据
epoll_wait返回
返回的次数与发送数据的次数没有关系
epoll默认的工作模式
2.边沿触发模式-ET
fd - 默认阻塞属性
客户端给server发送数据
发一次数据 server 的 epoll_wait返回一次
不在乎数据是否读完
如果读不完,如何全部读出来?
while(recv())
数据读完之后recv会阻塞
解决阻塞问题
设置非阻塞 - fd
3. 边沿非阻塞触发
效率最高
如何设置非阻塞
1.open()
设置flags
必须 O_WDRW | O_NONBLOCK
终端文件: /dev/tty
2.fcntl
int flag = fcntl(fd, F_GETFL);
flag |= O_NONBLOCK;
fcntl(fd, F_SETFL, flag);
将缓冲区的全部数据都读出
while(recv() > 0)
{
printf():
}
当缓冲区数据读完之后 , 返回为0