IO是什么
IO,也就是input/output,输出和输入。
咱们开发各种程序,实质上都是为了数据。数据须要存储和传输,就须要IO。
平时波及的IO次要是磁盘IO和网络IO,本系列次要记录网络IO。
根底概念-用户空间和内核空间
首先咱们先来看内核态和用户态。
咱们晓得软件性能的实现是须要硬件反对的,软件的底层就是对硬件的操作,比方读取内存、读取文件等。然而,如果每个软件都能够间接任意操作硬件,那么势必会造成凌乱。那么就须要依据软件的应用场景,来划分不同的硬件操作权限。内核态和用户态就是这么一种状态用来划分不同的资源操作权限。
在具体实现上,应用了分层和封装的形式。内核态能够调用所有系统资源,而用户态只能通过内核态封装的零碎调用来操作资源。这些零碎调用依据权限设计,凋谢肯定范畴的权限用于操作资源。
内核态和用户态对应的内存空间,就是内核空间和用户空间。两个内存空间之间互相隔离不影响。
咱们来看断代码
int money = 100 * 30; //我在用户空间String text = String.format("我这个月赚了%s", money); //我是在用户空间OutputStream outputStream = new FileOutputStream("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模型。