IO操作性能

操作系统--阻塞,睡眠,挂起

参考: https://www.jianshu.com/p/ad29c92324a1

java中io操作会使线程阻塞,那IO操作怎么完成

image.png

场景:main方法开启工作线程A 执行阻塞式read()操作,A进入阻塞状态直到read()方法返回

疑问:

  • 阻塞期间A无法获得cpu时间片,read()操作怎么执行的?
  • 为何io操作会使线程阻塞? 我在A线城执行其他耗时操作(比如复杂的数学计算),为何A会一直运行

解答:


image.png
  • 看这个就能知道, 阻塞IO在阻塞时候的操作不是在用户线程执行,用户线程现在被阻塞, 而是操作系统来完成(这个时候Java的线程只能等待), 等操作系统那边准备好数据以后用户线程才继续.

I/O会一直占用CPU吗?

  • 阻塞io情况下,比如磁盘io,accept ,read,recv,write等调用导致进程或者线程阻塞,这时候线程/进程 会占用cpu吗?比如连接mysql,执行一条需要执行很长的sql语句,recv调用的时候阻塞了,这个时候会不会大量占用cpu时间?磁盘io是什么操作,比如linux调用cp拷贝大文件的时候会大量占用cpu吗?

  • 计算机硬件上使用DMA(Direct Memory Access,直接内存存取)来访问磁盘等IO,也就是请求发出后,CPU就不再管了,直到DMA处理器完成任务,再通过中断告诉CPU完成了。所以,单独的一个IO时间,对CPU的占用是很少的,阻塞了就更不会占用CPU了,因为程序都不继续运行了,CPU时间交给其它线程和进程了。虽然IO不会占用大量的CPU时间,但是非常频繁的IO还是会非常浪费CPU时间的,所以面对大量IO的任务,有时候是需要算法来合并IO,或者通过cache来缓解IO压力的。所以IO密集型其实是很耗CPU的。

知乎: https://www.zhihu.com/question/27734728

参考:https://segmentfault.com/q/1010000012982974/a-1020000012983411
https://www.zhihu.com/question/27734728/answer/37877484

你可能感兴趣的:(IO操作性能)