Socket+Select+Epoll笔记

讲到epoll,就必须了解Socket,上篇博客写了Socket的基本使用方法,步骤主要为

  1. 创建一个socket

  1. socket是进程之间通信的,那么进程通信如何找到这个socket呢?当然是端口号,所以socket就要和端口号进行绑定,使用bind

  1. 把信息初始化完成以后,需要把socket状态设置成监听模式

  1. 监听是否有客户端的socket来找到该socket,如果有,就建立连接accept

  1. 接受数据recv

上面是一个程序,当程序在接受数据的时候,没法干下一步的工作,进入阻塞状态。那收到数据了,就去唤醒该进程,继续执行代码。recv函数返回的是接收到的数据。

socket本身是一个对象,维护一个输入缓冲区,输出缓冲区以及等待队列。

在阻塞的时候就会把进程A放在socket的等待队列(地址而并非完全复制过来)。当socket数据recv完了以后,就会唤醒进程A,重新将进程A放入工作队列中。


上面对应的是一个socket的情况,如果一个进程在等待多个socket怎么办?这种场景应该还是比较常见的,服务端一般都要接受多个客户端的访问。

那么recv只能监视一个socket,显然是不能满足需要的。


监视多个socket

select

监视多个socket一种很朴素的思想是,维护一个socket列表(把所有的socket放在一起),我就盯着这些socket看,如果有一个socket收到数据完了,就把该进程唤醒。

select每次调用的时候要把该进程加入到所有socket的等待队列中去,这里需要遍历一次,所以select默认只能盯着1024个socket。

而且进程被唤醒之后,不知道哪些socket收到数据,这样还需要遍历一次。

epoll

select不知道哪些socket收到数据,挨个遍历效果太低了。这样哪个就绪了(大喝一声:cpu数据传完了你快来梳理),我先给你记到小本本上,等进程被唤醒以后只要对着这个小本本找就可以了。

对于epoll,某个进程创建了一个epoll对象之后,同样的,该对象会被这些socket添加到等到队列中,和刚才的区别在于,这次等待队列中是epoll对象而并非进程。rdlist里面存放的是就绪的socket列表,

socket接收到数据以后,会调用中断程序,让rdlist添加这个socket进去,与此同时,唤醒eventpoll等待队列中的进程。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
"select"、"poll"和"epoll"都是用于处理I/O事件(如文件、网络连接等)的机制,它们在Linux系统中被广泛使用。这些机制都提供了一种方式来监视多个文件描述符(通常是网络连接或文件句柄)的状态,以便在数据可读、可写或其他事件发生时进行通知。 1. **select**:这是最早的I/O多路复用机制之一。它通过一个循环来检查多个文件描述符的状态,看是否有可用的输入或输出。然而,select在处理大量文件描述符时效率较低,因为它需要为每个文件描述符开一个单独的线程或进程。 2. **poll**:poll是另一种I/O多路复用机制,它提供了比select更高的效率,尤其是在处理大量文件描述符的情况下。但是,它的实现比较复杂,因此在一些新版本的Linux系统中,已经被更好的机制如epoll所取代。 3. **epoll**:相比于select和poll,epoll提供了一种更有效的方式来处理大量的文件描述符。它的核心是一个事件循环(Event Loop),能够通过记录所有需要监听的事件来提高效率。当有事件发生时,epoll会立即通知应用程序。此外,epoll还支持非阻塞操作,可以更有效地处理并发连接。 在编程语言中,这些机制通常由操作系统提供的系统调用或库函数来实现。例如,在Python中,可以使用`select`模块来实现类似的功能。对于需要处理大量并发连接的服务器编程,使用如Python的`socketserver`或`tornado`库或C语言的libevent库会更方便。 以上是对select、poll和epoll的基本介绍。你可以根据项目需求和系统的具体配置来选择适合的I/O多路复用机制。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值