专业网站建设人工智能研发,晋城网站开发,wordpress和typecho编辑器,网站建设前期讲到epoll#xff0c;就必须了解Socket#xff0c;上篇博客写了Socket的基本使用方法#xff0c;步骤主要为创建一个socketsocket是进程之间通信的#xff0c;那么进程通信如何找到这个socket呢#xff1f;当然是端口号#xff0c;所以socket就要和端口号进行绑定#x…讲到epoll就必须了解Socket上篇博客写了Socket的基本使用方法步骤主要为创建一个socketsocket是进程之间通信的那么进程通信如何找到这个socket呢当然是端口号所以socket就要和端口号进行绑定使用bind把信息初始化完成以后需要把socket状态设置成监听模式监听是否有客户端的socket来找到该socket如果有就建立连接accept接受数据recv上面是一个程序当程序在接受数据的时候没法干下一步的工作进入阻塞状态。那收到数据了就去唤醒该进程继续执行代码。recv函数返回的是接收到的数据。socket本身是一个对象维护一个输入缓冲区输出缓冲区以及等待队列。在阻塞的时候就会把进程A放在socket的等待队列地址而并非完全复制过来。当socket数据recv完了以后就会唤醒进程A重新将进程A放入工作队列中。上面对应的是一个socket的情况如果一个进程在等待多个socket怎么办这种场景应该还是比较常见的服务端一般都要接受多个客户端的访问。那么recv只能监视一个socket显然是不能满足需要的。监视多个socketselect监视多个socket一种很朴素的思想是维护一个socket列表把所有的socket放在一起我就盯着这些socket看如果有一个socket收到数据完了就把该进程唤醒。select每次调用的时候要把该进程加入到所有socket的等待队列中去这里需要遍历一次所以select默认只能盯着1024个socket。而且进程被唤醒之后不知道哪些socket收到数据这样还需要遍历一次。epollselect不知道哪些socket收到数据挨个遍历效果太低了。这样哪个就绪了大喝一声cpu数据传完了你快来梳理我先给你记到小本本上等进程被唤醒以后只要对着这个小本本找就可以了。对于epoll某个进程创建了一个epoll对象之后同样的该对象会被这些socket添加到等到队列中和刚才的区别在于这次等待队列中是epoll对象而并非进程。rdlist里面存放的是就绪的socket列表socket接收到数据以后会调用中断程序让rdlist添加这个socket进去与此同时唤醒eventpoll等待队列中的进程。