本文共 841 字,大约阅读时间需要 2 分钟。
其实在Linux下设计并发网络程序,有以下方法:
(1)、典型的Apache模型(ProcessPer Connection,简称PPC),(一连接一进程)
(2)、TPC(ThreadPerConnection)模型(一连接一线程)
(3)、select模型
(4)、poll模型
(5)、epoll模型
PPC/TPC模型
这两种模型思想类似,就是让每一个到来的连接一边自己做事去,别再来烦我。只是PPC是为它开了一个进程,而TPC开了一个线程。可是别烦我是有代价的,它要时间和空间啊,连接多了之后,那么多的进程/线程切换,这开销就上来了;因此这类模型能接受的最大连接数都不会高,一般在几百个左右
select模型
1. 最大并发数限制,因为一个进程所打开的FD(文件描述符)是有限制的,由FD_SETSIZE设置,默认值是1024/2048,因此Select模型的最大并发数就被相应限制了。自己改改这个FD_SETSIZE?想法虽好,可是先看看下面吧…
2. 效率问题,select每次调用都会线性扫描全部的FD集合,这样效率就会呈现线性下降,把FD_SETSIZE改大的后果就是,大家都慢慢来,什么?都超时了?
3. 内核/用户空间 内存拷贝问题,如何让内核把FD消息通知给用户空间呢?在这个问题上select采取了内存拷贝方法
poll模型
基本上效率和select是相同的,select缺点的2和3它都没有改掉。
Epoll模型
1. Epoll没有最大并发连接的限制,上限是最大可以打开文件的数目,这个数字一般远大于2048,一般来说这个数目和系统内存关系很大,具体数目可以cat/proc/sys/fs/file-max察看。
2. 效率提升,Epoll最大的优点就在于它只管你“活跃”的连接,而跟连接总数无关,因此在实际的网络环境中,Epoll的效率就会远远高于select和poll。
3. 内存拷贝,Epoll在这点上使用了“共享内存”,这个内存拷贝也省略了。
转载地址:http://qvtgi.baihongyu.com/