大家好,今日小爱来为大家解答以上的问题。iocp模型,iocp模型落后吗很多人还不知道,现在让我们一起来看看吧!
1、上面的retval如果为0,且其他也不满足就会导致空循环状态,就处于阻塞状态了windows select模型说明:而select模型主要是解决在单一线程模式下只能处理一个套接字的问题,这样可以避免线程膨胀问题,但是。
2、下面看完原型再讲起不足之处select模型:winsock库主要有两个版本,这里主要以winsock2版本为说明,select模型int select(int nfds,fd_set readfds,fd_set writefds,fd_set exceptfds,const struct timeval timeout);其实主要是两者采用的标准一致,所以接口基本跟linux一致,不过nfds在windows其实是没有意义的,主要是为了兼容其他版本处理过程:设以read为例,在这里windows主要是先将套接字s添加到readfds中,然后等待select函数返回,在select函数里面会移除没有未决的I/O作的套接字句柄,即已经处理过的IO套接字句柄,然后看s是否认仍然还是readfs中,在就说明s可读了,但是这里面可读,不一定有数据不足:其实添加到fd_set套接字数量是有限制的,winsock2.h定义的64,自定义也不超过1024,因为值太大,会对的性能有影响,更高的就是可伸缩的IOCPlinux select模型其实原理跟windows是不多的,只是处理过程在底层上有点区别处理过程:也是先将的文件添加到文件描述符中,调用select,判断文件是否发生变化,但是在底层调用的确是poll方法;首先使用poll_wait将等待队列添加到poll_table中,返回描述符的掩码poll原型:unsigned int (poll)(struct filefilp,poll_wait wait)看如下一个简单的处理过程{struct mem_dev dev = filp->private_data;unsigned int mask = 0;/将等待队列添加到poll_table /poll_wait(filp, &dev->inq, wait);mask |= POLLIN | POLLRDNORM; / readable 如:swich(WSAGETSELECT(socket))/return mask;}在这里只是添加队列,返回if (he_data)可读可写的掩码,真正阻塞的不是这里,是在do_select(...)函数中,在linux内核fs/select.c里面int do_select(int n, fd_set_bits fds, struct timespec end_time)这个函数mask = DEFAULT_POLLMASK;if (f_op && f_op->poll) {wait_key_set(wait, in, out, bit);}这里面是先判断文件存在,然后读取你自己定义的作设备I/O的f_op函数,这里有一个默认的mask,接着才判断然后返回描述符mask = (f_op->poll)(file, wait);用于区分当前哪个被触发了;接着判断f_op&f_op->poll在这里我们默认定义了poll函数,所以这里会进入此判断语句,mask = (f_op->poll)(file, wait);这个就是调用默认的poll函数进行处理,关键的是如何区分不同的读、写、异常过程?if (retval || timed_out || signal_pending(current))break;。
本文到这结束,希望上面文章对大家有所帮助。