netty学习笔记01——IO多路复用模型
阻塞I/O模型
阻塞i/o模型就是常见的io模型,请看如下的一个例子:
server = new ServerSocket(port);
server.accept();
上述的代码会被阻塞在server.accept()
,因为服务器在监听访问端口的请求,直到有访问到来,这个进程才继续进行。如果同时有大量的请求来访问服务器,后一个请求必须等前一个请求完成才能进行处理,这会造成服务器的效率极低。
一个解决办法是每当一个请求来临,都创建新的线程来处理,主线程继续监听服务器端口。这种办法导致创建和销毁线程的开销非常大。解决办法是使用线程池和队列。有些问题依旧没有得到解决,当网络传输较慢的时候,读取输入流的一方线程也将会被同步阻塞60s。在此期间,其他输入消息只能在消息队列中排队。
关于这个问题的解决放在下一篇文章中讨论,本节继续阐述阻塞i/o。
阻塞i/o模型在进程空间调用recvfrom,它的系统调用直到数据包到达且被复制到应用进程的缓冲区中或者发生错误时才返回,在此期间一直会等待,进程在从调用recvfrom开始到它返回的整段时间内都是被阻塞的,因此被称为阻塞i/o模型。——《netty权威指南》