代码拉取完成,页面将自动刷新
同步操作将从 柳诗妍/Java-Interview-Advanced 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
File file = new File("xxx.txt");
RandomAccessFile raf = new RandomAccessFile(file, "rw");
byte[] arr = new byte[(int) file.length()];
# read读取数据,用户态切换内核态
raf.read(arr);
Socket socket = new ServerSocket(8080).accept();
#
socket.getOutputStream().write(arr);
内核态切换到用户态 使用read读取数据的时候,会有一次用户态到内核态的切换,也就是说从用户角度切换到了内核角度去执行,这个时候基于DMA引擎把磁盘上的数据拷贝到内核缓冲里去;
内核态切换到用户态 接着会从内核态切换到用户态,基于CPU把内核缓冲里的数据拷贝到用户缓冲区里去
用户态切换到内核态 接着我们调用了Socket的输出流的write方法,此时会从用户态切换到内核态,同时基于CPU把用户缓冲区里的数据拷贝到Socket缓冲区里去,接着会有一个异步化的过程,
基于DMA引擎从Socket缓冲区里把数据拷贝到网络协议引擎里发送出去
内核态切换回用户态 都完成之后,从内核态切换回用户态
总结
所以说,从本地磁盘读取数据,到通过网络发送出去,用户态和内核态之间,要发生4次切换,这是其一;
其二,数据从磁盘拿出来过后,一共要经过4次拷贝;
所以说,这4次切换和4次拷贝,让普通的IO操作都性能较低
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。