Java网络编程基础(一)3分钟了解linux网络IO模型

Kernel Space(内核空间)与User Space(用户空间)

linux为了避免用户对操作系统的文件胡乱改写,造成系统崩溃,区分了内核空间与用户空间。内核空间用来存储操作系统文件与驱动程序,而用户空间来跑用户的应用程序。

所有的系统资源都是在内核空间进行操作的,包括网卡。所以一次网络IO的读取,远程的服务器发送过来的数据,到达网卡后,网卡先拷贝到内核缓冲区,内核缓冲区再拷贝到用户空间的内核缓冲区。然后才能被应用程序读取到。网络的IO的写入恰好相反,数据从用户空间的缓冲区拷贝到内核空间的缓冲区,然后内核缓冲区再通过网卡发送出去。

Socket(套接字)

所有的网络协议都是基于Socket进行通信的,Socket连接可以建立在不同的协议之上,如TCP、UDP等等。Linux内核将所有的外部设备当做文件处理,对一个文件的IO操作,会返回一个文件描述符(fd)。对Socket的IO操作也同样返回对应文件描述符(socketfd)。有了上面的知识,接下来让我看下IO的五大模型吧。

Blocking IO(阻塞IO)

在Jdk1.4之前,Java的所有Socket通信都用的这个模型。当一个进程调用recvfrom函数后,它会进入阻塞状态,这段时间它就在那摸鱼傻等,啥正事都不干,直到数据返回。

NIO(非阻塞IO)

Jdk1.4开始才引入Nio的包,但是还有很多不足,直到Jdk1.7对Nio类库进行了升级,才比较完善。NIO比起上面的BIO就变聪明了,它不会一直傻等,它开启了轮询,每隔一段时间,就会找内核问下:你好了没有?内核空间如果没好,就会直接给它返回一个错误EWOULDBLOCK。NIO进程会重复调用recvfrom,一直问下去,直到内核返回数据为止。

IO multiplexing(IO多路复用)

不管是BIO还是NIO,你都得盯着内核空间查看数据好了没。只有一个连接还好,要是有个成千上万,系统可能都要发不起这些盯梢的工资了。所以为了成本考虑,那就只留下一个盯梢的就好。其他的都毕业向社会输送人才。这就是IO多路复用,使用select、epoll等函数进行阻塞,盯着所有的Socket连接。

Signal-Drive IO(信号驱动IO模型)

你(应用程序)告诉京东快递(内核)快递柜自取,快递员在快递柜塞好你的快递后,然后给你发取货码(SIGIO)。你收到信号,去取快递,这个流程就是信号驱动IO模型。在京东给你发取货码之前,你是自由的,有很多选择。

Asynchornours IO(异步IO)

你知道我跟上面的信号驱动IO模型的区别是什么吗?你在京东下单买完东西,快速直接送到了你房门口,你只要开门去拿就行。在京东快递员(内核)给你打电话之前,你是自由的,想干啥就干啥。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值