服务器端的socket编程,在如何处理TCP连接的时候,一般有两种思路:
- 多进程、多线程的方式
- IO多路复用的方式
其中,多进程,多线程的方式就是每来一个TCP的连接,就用一个线程或者进程来管理,但是线程或者进程的数量是有上限的,而TCP连接的数据往往大余这个上限。
所以后来发展出来IO多路复用的方式,英文叫 IO Multiplexing。其实更准确的叫法应该是IO的分时复用。 在概念上和CPU的分时复用划分时间片的形式是一样的。
这里,所谓的分时,就是在不用的时间点处理不同的连接,复用就是用同一个socket来接受这些连接。
IO 多路复用的常见技术有3种,select -> poll -> epoll. 而且就是按照这个顺序发展而来的。
epoll 可以看做是一种数据结构,用来管理连接。epoll可以十分高效的找出处于活跃状态的TCP连接,丢给操作系统,读写数据。
epoll之所以高效, 是因为存在这一一个现实,在建立大量TCP连接的服务端,真正处于活跃状态的TCP连接的数量很少,而select 或者poll 每次要读写数据的时候都需要把所有的TCP连接丢给操作系统判断是否可以读写,因此浪费了大量时间。
如果服务器端的大量TCP连都是活跃的,那么epoll的优势就不明显了。
像epoll这种IO多路复用的技术在服务器端也只适用于IO型的服务,如果你的服务器端运行的是RPC服务且任务的类型是CPU密集型的,属于企业内部的调用,TCP连接的数量不多但是都属于长连接,这种情况采用多进程的方式比较适合。