Socket网络编程_之I/O多路复用

1. IO多路复用:
每一次网络通信都是一个Socket的I/O流,对于服务器而言,有两种方法
1.传统的多进程并发模型(每进来一个新的I/O流会分配一个新的进程管理。)
2.方法二就是I/O的多路复用(单线程,记录跟踪每一个Socket的状态,来即使管理多个I/O流。)

io多路复用就是多个Sock复用一根网线,这个是由内核与驱动层实现。

Socket网络编程_之I/O多路复用_第1张图片

2.select ,poll,epoll(linux下的)
select(最早)
• select 会修改传入的参数数组,这个对于一个需要调用很多次的函数。
• select 如果任何一个sock(I/O stream)出现了数据,select 仅仅会返回,但是并不会告诉你是那个sock上有数据,于是你只能自己一个一个找。
• Select 只监视1024个链接。

Poll(其次)
• poll 去掉了1024个链接的限制,于是要多少链接呢, 主人你开心就好。
• poll 从设计上来说,不再修改传入数组,不过这个要看你的平台了

Epoll:
• epoll 告诉你sock组里面数据,还会告诉你具体哪个sock有数据,你不用自己去找。

其中除了Epoll是线程安全,其他的poll,select都不是线程安全的

简单说epoll和select/poll最大区别是
1.epoll内部使用了mmap共享了用户和内核的部分空间,避免了数据的来回拷贝
2.epoll基于事件驱动,epoll_ctl注册事件并注册callback回调函数,epoll_wait只返回发生的事件避免了像select和poll对事件的整个轮寻操作。

你可能感兴趣的:(linux,实习之路)