网络通信和IO(1):网络通信与IO基本概念/什么是IO,什么是网络通信/文件IO和网络IO的区别/什么是文件描述符/什么是阻塞IO(BIO)/什么是非阻塞IO(NIO)/JAVA中的IO

IO和网络通讯基本概念

首先要从冯诺依曼说起,由他提出的计算机体系结构:

计算器控制(CPU…) ——> 主存(内存…) ——> 输入输出(硬盘、网卡、显示器、键盘…)

IO说白了就是输入输出,宏观角度讲可以分为IO设备和IO接口两个部分,IO设备就是输入输出设备,IO设备的工作方式可以由程序进行控制的。IO接口可以理解为 “计算机和其他计算机”,或者 ,“程序与计算机的IO设备”之间的传输接口。

IO它对于任何计算机系统都非常关键,因为所有 I/O 的主体实际上是内置在操作系统中的。程序一般是调用系统为它们完成大部分的工作。

网络通讯,就相当于一台计算机给另外一台计算机传输数据,中间的过程就叫做通信,也就是通过IO接口输入输出到另一台计算机,这个就叫做网络IO,可以把网络通讯理解为IO的一种,很多人会把网络IO和文件IO的概念区分开,其实他俩是一样的,只不过是通过不同的方式把数据输入输出到了不同的地方。

操作IO的模式也有很多种,有BIO、NIO之类的,这些可以对应到Java中的类来加深我们的概念。

java.io包基于流模型实现,提供File抽象、输入输出流等IO的功能。交互方式是同步、阻塞的方式,在读取输入流或者写入输出流时,在读、写动作完成之前,线程会一直阻塞。java.io包的好处是代码比较简单、直观,缺点则是IO效率和扩展性存在局限性,容易成为应用性能的瓶颈

java.net包下提供的部分网络API,比如Socket、ServerSocket、HttpURLConnection
也可以被归类到同步阻塞IO类库,因为网络通信同样是IO行为

在Java 1.4中引入了NIO框架(java.nio 包),提供了Channel、Selector、Buffer等新的抽象,可以构建多路复用IO程序,同时提供更接近操作系统底层的高性能数据操作方式

在Java7中,NIO有了进一步的改进,也就是NIO2,引入了异步非阻塞IO方式,也被称为AIO(Asynchronous IO),异步IO操作基于事件和回调机制

以上提到的NIO、BIO、AIO、多路复用等概念会在后文详细介绍

详细说IO和网络通讯前,还需要先有一个文件描述符的概念,这是一个实际可以看到的东西,我们先用Linux和java来说下计算机如何运行程序的。后面再来看这个文件描述符是什么鬼

文件描述符

我们编写的代码是放在某一个输出输入设备当中,当程序被执行的时候,代码会被加载到主存中,最终代码变成计算机指令,再由计算机控制完成计算等等其他操作。即程序的运行是由内存和计算机控制完成运行的。最终程序执行是对系统内核的调用,系统内核再对硬件进行调用。

以java代码来讲,java文件编译后是class字节码文件,字节码文件也是普通的文本文件,只不过里面是字节,存储序列化的东西,这个字节码会运行在C语言写的JVM虚拟机或者其他java进程里面,JVM或java进程会把字节码解析成系统指令再去调用系统的API完成java程序要做的事。(正是因为不同的JVM虚拟机可以把java代码解析成对应的系统指令,所以java才可以跨平台)

说完这些之后我们来看看如何调用Linux系统内核的API,在Linux系统中,有一个思想就是“一切皆文件”,包括输入输出设备都被看做文件,比如把打印机抽象为文件,那么我们向打印机文件写入的话,就会把我们写入的打印出来。那么如何去控制这个打印机这个文件帮我们输出打印呢?其实就是怎么操作系统提供的API的事。

在Java中可以通过调用对象去做事情。在Linux当中没有对象的概念,而是都抽象为文件了,那么我们对想操作的设备,或是想操作的连接都变成了一个占位符,其实就是个数字,它的专业名词就叫做“文件描述符”,就像java中对象的引用变量一样。内核正是利用文件描述符来访问文件,打开或者新建文件时,内核会返回一个文件描述符,读写文件也需要使用文件描述符来指定待读写的文件。

百度百科:文件描述符(File descriptor)是计算机科学中的一个术语,是一个用于表述指向文件的引用的抽象化概念。文件描述符在形式上是一个非负整数。实际上它是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表。当程序打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件描述符。在程序设计中,一些涉及底层的程序编写往往会围绕着文件描述符展开。但是文件描述符这一概念往往只适用于UNIX、Linux这样的操作系统而windows为句柄的概念

如上介绍可能还是有些抽象,后面会实际看到这个东西,并操作它,然后我们再铺垫个东西,学一下怎么查看linux系统内核提供的API文档,方便后面学习

Linux API文档

在Linux系统当中可以通过安装 帮助程序 和 帮助页 插件查看一些系统内核API或命令

yun install man man-pages

比如我们查看怎么读取一个文件,读就是read,2就代表第二类,即我们查询的是操作系统内核对程序的系统调用

man 2 read

网络通信和IO(1):网络通信与IO基本概念/什么是IO,什么是网络通信/文件IO和网络IO的区别/什么是文件描述符/什么是阻塞IO(BIO)/什么是非阻塞IO(NIO)/JAVA中的IO_第1张图片
因为Linux是C语言写的,这里可以看到调用和java类似,有参数,fd这个数值类型的参数就是file descriptor,也就是文件操作符,这个操作符怎么得到呢?前面也提到过打开或者新建文件时,内核会返回一个文件描述符

比如说read之前需要先打开一个文件

man 2 open

网络通信和IO(1):网络通信与IO基本概念/什么是IO,什么是网络通信/文件IO和网络IO的区别/什么是文件描述符/什么是阻塞IO(BIO)/什么是非阻塞IO(NIO)/JAVA中的IO_第2张图片
在这里插入图片描述
我们可以看到传入一个文件名称,返回的就是一个file descriptor 文件操作符

除了open以外还有socket也能得到文件操作符

man 2 socket

网络通信和IO(1):网络通信与IO基本概念/什么是IO,什么是网络通信/文件IO和网络IO的区别/什么是文件描述符/什么是阻塞IO(BIO)/什么是非阻塞IO(NIO)/JAVA中的IO_第3张图片
在这里插入图片描述

结尾

到现在就有一个IO的基本概念了,可以把文档插件装上,试一下,后面还会一直用到,下章使用文件描述符模拟浏览器获取网页,带大家感受通信,可以关注我的公众号,里面有完整系列的文章,回复关键字“资源”,可以免费领取架构师、大数据、AI等课程
网络通信和IO(1):网络通信与IO基本概念/什么是IO,什么是网络通信/文件IO和网络IO的区别/什么是文件描述符/什么是阻塞IO(BIO)/什么是非阻塞IO(NIO)/JAVA中的IO_第4张图片

原文链接:https://mp.weixin.qq.com/s?__biz=MzI5MDk1Mzc3MQ==&mid=100000012&idx=1&sn=cf49e575b6305d37ff541018d181b674&chksm=6c194e485b6ec75e6834b6a71d34d23896b8a6bbffb4d70a1519b656cf3d7cb34b06899a94fb&scene=25#wechat_redirect

你可能感兴趣的:(IO与网络通信)