「这是我参与2022首次更文挑战的第21天,活动详情查看:2022首次更文挑战
CPU 密集型
在面试中,我们该如何跟面试官聊这道题。CPU 密集型和 IO 密集型,它们设置的线程是不一样的。CPU 密集型是一个完整的请求。那么 IO 操作可以在很短的时间完成。CPU 有很多的运算需要处理,也就是说了一个 CPU 的计算比例占很大部分,线程等待时间接近 0.
那么这个时候怎么办呢?单核 CPU 一个完整的请求,I/O 操作可以在很短难完成,CPU 还又很多运算要处理。所以线程等待是零,也就几乎线程不等待。所以单核 CPU 处理 CPU 密集型的时候,并不适合多线程。你想想每个线程都不会去阻塞,抢 CPU,那最终保证的是什么?你能保证你的响应时间吗?保证不了,你只能保证你的吞吐量。但是吞吐量大家都都知道,吞吐量其实并不重要,重要是什么,你的线程的审议时间。
多核 CPU 处理 CPU 密集型,那么这个时候我们就可以最大化的利用 CPU 怎么办?理论上我们 I/O 几乎不存在,那怎么办?全部直接上核心数,就所有线程它的数量正好等于 CPU 数量。当然实际上是一般会设置 CPU 它的核心数 +1 的一个经验值,因为可能会发生一些缺点中断或其他情况导致暂停。那么有一个额外 线程,这个时候保证 CPU 在中间,它还会继续执行这个线程的工作。
I/O 密集型
与 CPU 密集型来相比,这个就相当于很多 I/O 操作而做,I/O 占比比较大,而计算比较少。那么这个时候,我们就需要越多的线程。当然这个线程它是越多越好。你比如像后面我们看聊这个一个线程 CPU 时间所占比的比例越高就越少线程。那什么意思?你比如有多个线程,比如我开的越多越好,但是当你这个线程多到一定的地步,比如说你后面有一堆排队,然后这些线程它的 I/O 都全部完成了,这个又退化成什么,CPU 密集型。而 CPU 运行最怕的是什么?多余核心数的线程。所以说我们要进行经验性的线程设置。那么iI/O 密集型的最佳线程= CPU 的核心数 (1/CPU利用率)=CPU核心数(1+(I/O耗时/CPU耗时)),这个时候其实算出来的是什么?算出来就是你所需要这个时间占比和你的 I/O占比。
如果我们全是 I/O 的耗时,那么 CPU 的耗时几乎接近为零,直接 2N。 N 为 CPU 的核心数。有时候也有 2N+1,1 就是 backup.