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

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. 基础知识 1.1、 基本概念、 功能 冯诺伊曼体系结构1、计算机处理的数据和指令一律用二进制数表示2、顺序执...
    yunpiao阅读 5,458评论 1 22
  • 转 # https://www.cnblogs.com/easypass/archive/2010/12/ 08/...
    吕品㗊阅读 9,833评论 0 44
  • 必备的理论基础 1.操作系统作用: 隐藏丑陋复杂的硬件接口,提供良好的抽象接口。 管理调度进程,并将多个进程对硬件...
    drfung阅读 3,595评论 0 5
  • 一. 操作系统概念 操作系统位于底层硬件与应用软件之间的一层.工作方式: 向下管理硬件,向上提供接口.操作系统进行...
    月亮是我踢弯得阅读 6,033评论 3 28
  • 液体活检作为体外诊断的一个分支,是指一种非侵入式的血液测试,能监测肿瘤或转移灶释放到血液的循环肿瘤细胞(CTC)和...
    井底蛙蛙呱呱呱阅读 710评论 0 0