【java】【07】BIO和NIO
1.BIO
BIO是accept和recv都是阻塞的系统调用,新启动一个线程来进行recv系统调用,服务的最大连接数受到线程的限制
Socket 系统调用
bind 系统调用
listen 系统调用
accept 系统调用
recv 系统调用
socket 系统调用 返回文件描述符3
bind 系统调用 绑定文件描述符3和端口
listen 系统调用 3
accept 系统调用 阻塞接受新城连接
每一个连接启动一个线程
连接1 ---- 线程1 recv 系统调用 阻塞接受数据
连接2 ---- 线程1 recv 系统调用 阻塞接受数据
。。。
2.NIO
NIO是socket系统调用增加noblocking参数使得accept和recv都变成非阻塞的
accept和recv调用后立即返回,如果是-1表示没有数据,这种设计会有很多空跑系统调用
socket 系统调用 返回文件描述符5
bind 系统调用 绑定文件描述符5和端口
listen 系统调用 监听文件描述符5
fcntl 系统调用 把5变成非阻塞的
while(true)
accept 系统调用 非阻塞接受新城连接 没有连接返回-1,继续循环
…
accept 系统调用 非阻塞接受新城连接 没有连接返回6
fcntl 系统调用 把6变成非阻塞的
while(true){
recv 系统调用 非阻塞的接受数据
recv 系统调用 非阻塞的接受数据
。。。。。
}
)
3.IO多路复用技术
select 系统调用可以知道有那些文件描述符有系统调用,不用循环空跑系统调用了,但是每次都有很多文件描述符传输,也是一个一个轮询问
epoll 通过以下三个系统调用epoll_create创建实例,通过epoll_ctl系统调用把文件描述符放到内核空间,
通过epoll_wait和cpu的中断把有数据的文件描述符交给应用程序处理
epoll_create
epoll_ctl
epoll_wait