IO什么是IO,即input/output,输入输出。我们开发的程序本质上是针对数据的。数据需要存储和传输,这就需要IO。通常涉及的IO主要是磁盘IO和网络IO。本系列主要记录网络IO。基本概念——用户空间和内核空间首先我们来看一下内核态和用户态。我们知道,软件功能的实现需要硬件的支持,而软件的底层就是对硬件的操作,比如读取内存、读取文件等。但是,如果每一个软件都可以直接任意操作硬件,那就令人困惑。那么就需要根据软件的使用场景来划分不同的硬件操作权限。内核态和用户态就是这样一种状态,用来划分不同的资源操作权限。在具体实现上,采用了分层和封装的方式。内核态可以调用所有的系统资源,而用户态只能通过封装在内核态的系统调用来操作资源。这些系统调用都是按照权限设计的,对操作资源开放一定范围的权限。内核态和用户态对应的内存空间就是内核空间和用户空间。两个内存空间之间隔离,互不影响。让我们看看代码intmoney=100*30;//我在用户空间Stringtext=String.format("我这个月赚了%s",money);//我在用户空间OutputStreamoutputStream=newFileOutputStream("bookKeep.txt");outputStream.write(text.getBytes(StandardCharsets.UTF_8));//在内核空间上面的代码中,逻辑计算是在用户空间进行的,当进行文件操作时,转入内核空间。可以看到outputStream.write最后调用了native方法。总之,我们需要知道的是,内核空间和用户空间是相互独立的,我们的应用程序是在用户空间执行的。网络IO的流程上图从数据传输的角度描述了读写数据的流程。读取数据时:数据从网卡缓冲区->内核缓冲区->用户缓冲区。写数据时:数据从用户缓冲区->内存缓冲区->网卡缓冲区。Socket那么在具体的代码层面,我们是如何操作的呢?从前面对内核空间和用户空间的描述,我们可以知道我们的应用是工作在用户空间的。如果我们需要对资源进行操作,就需要通过系统调用进入内核空间,而这个系统调用就是Socket。Socket是操作系统提供给应用程序操作网络资源的一组接口。用一张图来展示:Socket进程:总结本文是网络IO的第一篇,主要介绍网络IO的一些基本概念,包括内核空间-用户空间、网络IO进程和Socket。重点是TCP/IP网络系统、内核空间-用户空间和Socket之间的关系。稍后我们将开始描述各种网络IO模型。
