1、传统IO底层发生了什么?为什么OS层面是相当昂贵的操作?
- JVM发送read()系统调用
- OS进行上下文切换到内核态,从socket buffer中读取数据。
- OS内核拷贝数据到user buffer,然后进行上下文切换,回到用户态,read()方法返回。
- JVM进程继续执行代码逻辑,然后发送write()系统调用。
- OS进行上下文切换到内核态,将user buffer的数据拷贝到socket buffer。
- OS进行上下文切换到用户态,write方法返回,JVM继续执行代码逻辑。
可以看到,一个简单的传统IO操作,涉及了4次上下文切换和2次数据拷贝,所以说这个效率是相当低下的。如果在并发要求极高的中间件系统中,这样的效率是无法容忍的。
2、JDK是如何优化传统的IO操作,实现zero-copy效果的?
zero-copy的意思是不会将数据从内核态拷贝到用户态,而非不进行数据拷贝。
之所以内核态还会发生