作者回复: 对的,异步I/O模型在Linux内核中没有实现
作者回复: 你好,这篇I/O性能优化主要是普及NIO对I/O的性能优化。I/O这块的知识点很多,包括IO模型、事件处理模型以及操作系统层的事件驱动,如果都压缩到一讲,由于字数有限,很难讲完整。对于一些童鞋来说,也不好理解。
我将会在后面的一讲中,补充大家提到的一些内容。谢谢你的建议。
作者回复: 一个设备接口试图通过总线直接向外部设备(磁盘)传送数据时,它会先向CPU发送DMA请求信号。外部设备(磁盘)通过DMA的一种专门接口电路――DMA控制器(DMAC),向CPU提出接管总线控制权的总线请求,CPU收到该信号后,在当前的总线周期结束后,会按DMA信号的优先级和提出DMA请求的先后顺序响应DMA信号。CPU对某个设备接口响应DMA请求时,会让出总线控制权。于是在DMA控制器的管理下,磁盘和存储器直接进行数据交换,而不需CPU干预。数据传送完毕后,设备接口会向CPU发送DMA结束信号,交还总线控制权。
而通道则是在DMA的基础上增加了能执行有限通道指令的I/O控制器,代替CPU管理控制外设。通道有自己的指令系统,是一个协处理器,他实质是一台能够执行有限的输入输出指令,并且有专门通讯传输的通道总线完成控制。
作者回复: 我们通常在通信时,使用的是字节流FileInputStream来实现数据的传输,你会发现,我们在读取read()和写入write()的时候都是先将字符转成字节码再进行写入操作,同样读取也是类似。如果是中文,在gbk中一般一个中文占用两个字节,如果通过字节流的方式只读取一个字节,是无法转编码为一个中文汉字。
而字符流就是为了解决这种问题,如果用字符流去读取,字符流会根据默认编码一次性的读取一个字符,即若若是gbk编码就会一次读取2个字节。因此字符流是根据字符所占字节大小而决定读取多少字节的。这就是字符流和字节流的本质不同。
作者回复: 这一讲中提到了DirectBuffer,也就是零拷贝的实现。谢谢你的建议,后面我会补充下几种网络I/O模型的底层原理。
作者回复: 阻塞线程在阻塞状态是不会占用CPU资源的,但是会被唤醒争夺CPU资源。操作系统将CPU轮流分配给线程任务,当线程数量越多的时候,当某个线程在规定的时间片运行完之后,会被其他线程抢夺CPU资源,此时会导致上下文切换。抢夺越激烈,上下文切换就越频繁。
作者回复: 1、是通一个directbuffer,是一个临时堆外内存;
2、就是DMA处理器;
3、内存处理比磁盘处理的IO好很多。
作者回复: 总结的很好,这章后面需要再优化
编辑回复: 感谢这位同学的建议,老师会在11讲中集中补充有关IO的一些实战内容。
作者回复: direct buffer是用户态内存,已更新这一小节
作者回复: 尝试看看是否可分片并行处理。
作者回复: 1、阻塞会引起上下文切换,文中强调的是上下文切换;
2、如果能读到则是一样的。在没有bytebuff缓存的情况下,一旦读取数据的SO_RCVBUF满了,将会通知对端TCP协议中的窗口关闭(滑动窗口),将影响TCP发送端,这也就影响到了整个TCP通信的速度。而有了bytebuff,我们可以先将读取的数据缓存在bytebuff中,提高TCP的通信能力。
作者回复: 是否可以改用分页查询呢?或者将重要信息先传输到页面,次要的通过单次点击查看。
作者回复: 可以转到11讲,有详细答案