赞
踩
目录
2、《Java并发编程实践》:具体的线程数该如何设置?线程池参数如何设置?
即,计算密集型,I/O能够在很短的时间内完成,而相对的CPU却有大量运算要处理。例如计算大量的加减乘除、矩阵运算等,都属于CPU密集型。
我们知道,线程是最小的可执行单位。
严格来说,每个核心在同一时间只能处理一条线程的指令,因此如果是单核CPU的情况下,创建再多的线程其实也不会加快运算速度,反而会因为单核的线程并发导致线程上下文的切换而降低效率。(类似于一个工人干了多个活)
而在多核cpu下,可以创建多个线程让多个cpu并行运算,一起工作。(多个工人同时做多个活),从而提升效率。
IO密集型指的是系统的CPU性能相对硬盘、内存要好很多,此时,大部分的状况是CPU在等I/O (硬盘/内存) 的读/写操作,但CPU的使用率不高。
在实际开发中,IO密集型任务也很常见,例如:
磁盘IO:读写本地的数据库、Redis,等。网络IO:http 请求、远程数据库读写、远程 Redis 读写,等
这里需要解释一下,什么叫“CPU在等I/O (硬盘/内存) 的读/写操作”?
在传统的阻塞式 I/O 操作模型中,当 CPU 发起一个 I/O 请求后,发起该操作的线程会一直阻塞等待 I/O 操作的完成:
当线程发起一个阻塞式的 IO 操作时,它会等待操作完成,期间线程将被挂起,无法继续执行其他指令,这种模型导致了CPU的使用率不高。需要注意的是,IO 阻塞并不是直接阻塞 CPU 的执行,而是阻塞了发起 IO 操作的线程。其他未受影响的线程仍然可以继续执行。
在上面的基础上我们知道,在处理IO密集型任务,即使创建了线程,也可能因为IO的阻塞等待而让线程阻塞、从而导致CPU不干活一直摸鱼
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。