连接数不太多,线程非常廉价情况
在C/C++,Java,线程廉价不满足,解决方法是IO复用,用户态线程出现1993年,linux2.7版本
IO复用一个进程可以处理多个文件描述符。
tcp/ip 1983 bsd的4.2版本。socket api也是bsd 4.2版本引入的。
io复用和socket api出来时间一样长
同步,复用线程
io复用一般和non-blocking使用
问题:发送方和接收方不是相互独立的,用的阻塞io,可能有阻塞
在socket出现前unix进程可以处理处理多个文件描述符,一个进程可以打开多个磁盘文件,读写这些文件,比如做外部排序
为什么bsd 4.2要引用select?因为磁盘文件是被动的,一个程序可以自行决定什么时候去读写磁盘文件,不会遇到阻塞的情况
socket是主动的,是一个流stream,socket什么时候可读取决于对方什么时候发数据,和磁盘文件根本不同。一个进程同时打开多个socket fd,不能自己决定读哪个fd,所以进入IO复用,在读之前查一下,哪些fd可读
server:./chargen -l 1234 只发数据不接受
client:strace python netcat.py localhost 1234 < /dev/zero > /dev/null
https://github.com/chenshuo/recipes/blob/master/python/netcat.py
https://github.com/chenshuo/recipes/blob/master/python/netcat-nonblock.py
如果使用阻塞io,如果某个事件阻塞了,也会把其余的事件挡住了
chargen 接收缓冲区满了