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的一些基础概念,包括内核空间-用户空间、网络IO的流程以及Socket。重点是TCP/IP网络体系、内核空间-用户空间以及Socket的关系。后面我们将开始讲述各种网络IO模型。