00:01
Java a IO基本介绍。我们前面说了bio。NIO,还有一个呢,就是Java的AIO,我们也做一个简单的介绍,JDK7呢,它引入了异步IO。Go在进行IO编程中,其实我们常用的两种模式对吧,一个是reactor,叫反应器模式,还有pro actor这个这种模式呢,一般是AIO来使用的,在我们Java的NIO就是用的reactor,后面呢,我们也就是其实IO本身就是一个reactor,明白吧。只是呢,在后我们后面讲na的时候呢,他对IO的reactor进行了一个改进。那它的基本的原理是当有事件触发的时候,服务器端得到通知,进行相应的处理,是不是这样子的?大家还记不记得我们那个select。选择器其实就是属于一个监听状状态,当有发现某一个通道有事件发生的时候就去处理。
01:06
AIO呢,也叫NIO2.0,呃,有也就是说有些人是说他是对IO的一个升级。叫做异步不阻塞IOIO引入异步通道的概念呢,采用了这样的一个模式,简化了编程呃,程序的编写,它的特点是在有效,在有有效请求时才去启动线程,特点是先由操作系统完成后才通知服务器端启动线程,啊这样呢,它比较适用于连接数较多且连接时间较长的应用。对,AO,但是有一点呢,在前面其实我已经说过了,IO目前呢,没有得到广泛的应用,你比如说nit nit其实就是基于NIO的,而不是AIO,所以说关于n I na IO呢,我们就不做详细介绍,同学们如果有兴趣的话呢,可以看这个网址对应的一篇文章,叫Java新一代网络。
02:01
编程模型AO原理及linu可使系统A介绍,有兴趣的同学自己去看一下,因为本章呢,呃,我们ni呢,也是基于NIO的,所说AIO我们就不做过多介绍了,最后呢,我们拿一点时间对这几个模型啊编程模型来进行一个比较。从IO模型来看呢,有这么几种是吧,然后编程难度BIIO是我们传统的加vao相对简单,NIO其实就相对比较复杂了,因为它上面它是在这个bio上面做了一层封装,AIO呢,它的复杂度也很高,它是异步非主色。可靠性呢?BIIO是比较差的,NIO和AIO都比较高,都比较好。吞吐量就是所谓吞吐量,就是说能不能接受一个大的并发,那么吞吐量谁哪一个高呢?显然是后面这两个比较高,对。低Bo是比较低的,那如果我们再举一个例子来说一下什么是同步不阻塞,同步非阻塞和异步非阻塞,我举一个咱们到理发店理发的案例来形象的说明一下。
03:13
怎么理解同步阻塞呢?说你到理发店去理发。这个时候呢,理发师正在跟。别的顾客理发,这个时候呢,你可以在这儿一直等。直到轮到自己。就去理发,在这个等的过程中,你什么事情都不知道,都不干。叫同步阻塞。同步非主色呢,就是到理发店去理发,发现前面有其他人理发,给理发师,理发师说一声我先干别的事情,比如说你要说一声过后你呃,你到理发店说哎,我嗯,该该我多多长时间,比如说半个小时或者一个小时。我我再回来理发,在这个说完了打招,打完招呼过后呢,你可以干别的事儿,干完了过后你再回来。看看,轮到自己了。这是同步非阻塞。
04:02
还有一种就是异步非阻塞,这时呢,你可以给理发师打电话,让理发师上门服务。电话一打完,你自己干别的事情,理发师呢,到家里面,他来找你,给你理发。哎,这就叫异步肺主色。比较形象的说明一下它的特点,那现在呢,我们把前面讲的这个内容做一个梳理。从哪里开始梳理呢?从ZERO0拷贝。打开我们的笔记。往下走。好的。我们这块讲的是NIO的零拷贝,首先我们对零拷贝做了基本的介绍,何为零拷贝?零跑零,零拷贝这个概念呢,其实是我们在做网络编程的时候,进行性能优化的一个关键,对他有至少同学们要知道。在Java程序中呢,我们零拷贝有这么几种形式式内存映射,还有一个是底层用的是set file,对,然后呢,我们分别对内存映射和set file2种零拷贝的这个实现啊来做了一个介绍,其实内存映射呢,就是第一种没有真正实现零拷贝。
05:18
对吧,他少了一只是他,但是他还是少了一次拷贝。然后后面我们说了NIO是怎么实现零拷贝的一个案例,好,下面呢我们进行梳理。首先这一个传统的代码是吧,我们先把这个传统代码拿过来,然后呢,针对这个代码我们说一下传统的方式,传统IO啊,它是怎么样去处理的,因为你既然要说内存映射和send file它比较好,你首先得说传统IO它有什么问题。那传统IO它在进行这个读写和内存进进行拷贝的时候呢,这是他的一个示意图,我把这个示意图拿过来。
06:00
哦。传统IO的一一个这个这个模型。呃,实际操作模型啊。写到这来吧,就这么一个模型,在这个模型里面呢,我们首先有一个概念必须要知道什么叫做DMA。Copy,什么叫做CPU copy,其实在这里呢,我已经说了一下,所以所以d ma它指的是什么呢?简单的讲就是我们所说的,翻译成中文呢,就是直接内存拷贝,直接内存拷贝就是在这个过程中没有CPU的参与。啊,没有CPU的参与,整个呢,就是一个直接拷贝,就是直接从我们的外设就hard disk直接放到我们内核的buffer,啊,这个叫D。那说完说完这个东西呢,我们就说了传统地方,其实他一共进行了几次拷贝啊,他一共进行了四次拷贝。对,然后呢,呃,他这个上下文的切换,上下文切换呢,其实你可以看到,呃,如果从这看的话,13次,如果你要从第一次算上就四次的切换,对吧?好这个我就不说了,然后分析完了过后呢,最第一种我们进行优化的方案就是用。
07:13
内存映射。对内存映射,那内存映射它是怎么来实现的呢?其实很简单,就把文件映射到内存缓冲区。对,同时呢,用户空间可以共享内核空间的数据,这样子呢就会少,这样在进行传输的时候呢,就减少了内核空间到用户空空间写错了。空间的拷贝次数。好,我们把这个示意图也给同学们板述过来。就他。没问题吧,哪里少了呢?就这次少了。就就这个地方不需要再做了啊,这这条线。就是原先我们不是要把宽的东西拷贝到用户buffer,然后在这地方进行修改吗?不需要了,因为这两者可以映射起来。好的少了一次,那接着我们继续看,因为这个m map呢,没有实现真正的零拷贝,所以说还有一个叫通过这个send file,当这个send file要我们底层的这个操作系统支持才才会有效果的哈,所以说。
08:15
好,我们这说了一下send file它的优化的方案。这file呢,他在进行优化的时候呢,也是经历过了,经历过了什么呀。就是两两个阶段,第一次呢,是2.0这个版本,另2.0这个版本呢,它其实是靠,就是它整个。拷贝的次数还是没有少,但是呢,减少了一次上下文切换,对示意图我们拿过来。示意图就是这个图。可以看到啊拷贝你看这是一次拷贝,这又是一次拷贝,其实他还是三次拷贝是吧,其实他这拷贝的一次CPU还拷贝跟前面那个MMP来说呢,呃,其实他从拷贝的次数上来说,也没有实现真正的零拷贝。
09:06
于是我们又提出在2.4Linux2.4里面呢,他又干什么呢,又做了一个新的版本啊,新的一个呃,一个方案,我来看一下是怎么样子的,这样子啊。在这儿。这个这些地方我就不要了,对吧。诶,这个我就不要了。那这次呢,在2.4这个版本呢,它它做了一个修改,避免了从乐内存缓冲区到我们socket buffer的一个拷贝。啊,然后它可以直接从这个内核通过DMA拷贝到我们的协议站,虽然这个内存color,呃,Color buffer呢,有一有少量的数据还是会,诶不是这啊,这个图不对,是这个图啊,这个图没有拿过来。就这。这个图就就是对应的,就说你你从这个地方可以直接进行一个DNA。
10:00
D ma的拷贝。那么科。Buffer到socket只有少量数据,因此可以忽略不计啊,所以说到这个模型,其实就实现了真正的零拷贝。那么实现这个真正零拷贝以后呢,是不是我们就说一下对零拷贝的一个理解,就是什么叫零拷贝呢?主要是从操作系统的角度来看的,你不能说诶说老师,那你最后不不是还是有两次拷贝吗?我们说了零拷贝是从操作系统的角度来看的。对啊,就说只要在你整个过程中,你的内核缓内内核缓冲区之间就是没有重复数据啊,那这没有重复数据,没有产生相同的这种这种这种数据的话呢,那才是真正的零拷贝,那这就只有一份好的。紧接着,我们继续往下梳理。最后呢,我们是不是举了一个例子啊啊,这还整理了一下m map和set fair的区别,那为了如果面试官问题的话呢,你把这三点区别给面试官聊一下就可以了,他可能会问对不对。
11:03
好的。把它的区别说完了以后,我们举了一个例子。关于。Zero,那就是就是我们NIO0拷贝的实现,放这儿代码好。那这里面呢,我们首先写了一个传统方案,再写了我们IO0拷贝的传递方式,传统方案呢,我们就不说了,我们直接把这个。就是。NIO的零拷贝它是怎么实现的?其实这个零拷贝最核心的就是什么呀?就是那个transfer to方法,其他的就是为了讲这个transfer to而写了一段辅助代码给大家看了一下效果是不是这个道理?啊,就是六。六。6IO server。6I。得加。就是为了讲,为了讲这个呢,就是我们没有办法写了一些其他的代码,其实主要是说这个transfer to对不对,但是你要看效果呀,所以说你只能把其他。
12:07
代码也写出来六。什么呀,I。OCLA。得交啊。好的,同学们,我把这段代码呢也给朋友们拿过来吧。在哪里哈,在这儿CLA。6l client其实重点就是transfer to,那transfer to是不是老师还说了在不同的操作系统。Transfer to呢,它的使用是不一样的,如果在Linux下面。啊,在那下面,其实你一条语句就可以把这个文件传过去,嗯,但是在Windows下面呢。你最这个传输一次只能发送八兆,所以说对于大文件你还要想办法进行分段传输。呃,我也把分段传输的思路给他说了,其实很简单,只要稍微学学过这个Java同学就知道怎么去割,这就其实就是一个简单的文件,一个分割,分割完了过后呢,把这个文件通过transfer transfer to传过去就行了,大家呢,做一个课后练习或者课后思好把它完成一下。
13:09
并不难哈。然后后面为了呃,体系完整的,我们也说了一下Java a IO的东西,其实JA Java a IO呢,呃,就是。实际上目前没有得到一个广泛的使用,因此呢,这也不是我们的一个重点。这也不是我们一个重点哈,所以说你知道有这个东西就行了。放这。好的。对,最后我们还说做了一个比较,就是关于bio IO a IO的。比较。对比哈,把对比呢,它的特点说了一下,放这就可以了。我们直接把这个图截过来。同学们。关于。
14:00
这一节就是关于我们零拷贝还有AIO的内容的讲解和梳理,就到这里大家消化一下。
我来说两句