CPU密集型和IO密集型与CPU内核之间的关系

2023-12-07 22:36

本文主要是介绍CPU密集型和IO密集型与CPU内核之间的关系,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

CPU密集型和IO密集型与CPU内核之间的关系

一、CPU密集型

  1. 介绍

    CPU密集型,也叫计算密集型,是指需要大量CPU计算资源,例如大量的数学运算、图像处理、加密解密等。这种类型的任务主要依赖于CPU的计算能力,会占用大量的CPU时间片,使得CPU内核在执行任务时负载较重。CPU密集型任务在执行过程中主要消耗CPU资源,而对IO操作的需求相对较少。

  2. 与CPU内核的关系

    CPU密集型任务与CPU内核之间的关系在于任务的执行方式和CPU资源的利用。CPU密集型任务需要大量的CPU计算资源,通常会占用大量的CPU时间片,使得CPU内核在执行任务时负载较重。在多核处理器系统中,如果任务可以充分利用所有的CPU内核,那么整体的计算性能会得到提升。

    在自定义线程池中可以设置 核心线程数=CPU内核数+1,在处理CPU密集型任务时,通常希望充分利用系统中的所有CPU内核,同时避免线程频繁地创建和销毁带来的开销。根据经验,将核心线程数设置为CPU核数加1可以在大多数情况下达到比较好的性能表现。

    设置核心线程数为CPU核数加1的原因是为了确保在系统负载较重的情况下,仍然有一个空闲的线程可以立即执行任务,从而避免因线程创建和销毁带来的性能损失。这样可以更好地利用系统的计算资源,提高CPU密集型任务的执行效率。

  3. 代码测试

    public class CPUAndIOTest {public static void main(String[] args) {int availableProcessors = Runtime.getRuntime().availableProcessors();System.out.println("CPU内核数:" + availableProcessors);// 测试CPU密集型任务testCPUIntensiveTask(availableProcessors);}private static void testCPUIntensiveTask(int availableProcessors){long startTime = System.currentTimeMillis();int taskCount = 100; // 任务数量int corePoolSize = availableProcessors + 1;ExecutorService executor = Executors.newFixedThreadPool(corePoolSize);for (int i = 0; i < corePoolSize; i++) {try {Thread.sleep(50);} catch (InterruptedException e) {throw new RuntimeException(e);}executor.execute(() -> {// 模拟CPU密集型任务double result = 0;for (int j = 0; j < taskCount/corePoolSize; j++) {try {Thread.sleep(50);} catch (InterruptedException e) {throw new RuntimeException(e);}result += Math.random();}});}executor.shutdown();while (!executor.isTerminated()) {}long endTime = System.currentTimeMillis();System.out.println("CPU密集型任务执行时间:" + (endTime - startTime) + "ms");}
    }
    

    模拟执行总量相同的CPU密集型任务,通过修改核心线程数,看看执行时间是多少,得出的结果如下

    核心线程数corePoolSize = 1时

    image-20231207210345776

    核心线程数corePoolSize = availableProcessors + 1也就是CPU内核数加1时

    image-20231207210448524

    核心线程数corePoolSize = availableProcessors * 2也就是CPU内核数*2时

    image-20231207210537937

    结果差不多如预期一样,当核心线程数=CPU内核数加1时执行时间要比另外2种更短,效率更高。

二、IO密集型

  1. 介绍

    IO密集型,是指需要大量的IO操作,例如文件读写、网络通信、数据库访问等。这种类型的任务主要涉及大量的IO操作,而CPU的计算能力相对较少。在执行IO密集型任务时,CPU内核的负载相对较轻,因为大部分时间都用于等待IO操作完成。IO密集型任务的性能瓶颈通常在于IO操作的速度和延迟,而不是CPU的计算能力。

  2. 与CPU内核的关系

    IO密集型任务与CPU内核之间的关系在于任务的执行方式和对系统资源的需求。IO密集型任务通常需要大量的IO操作,例如文件读写、网络通信、数据库访问等,而对CPU计算资源的需求相对较少。

    在自定义线程池中可以设置 核心线程数=CPU内核数*2,在处理IO密集型任务时,通常会出现大量的IO等待时间,而不是CPU计算时间。在这种情况下,可以充分利用系统中的多个CPU内核来处理其他线程的计算任务,从而提高系统的整体性能。

    将核心线程数设置为CPU核数的两倍的原因是为了确保在执行IO密集型任务时,系统能够充分利用CPU内核来处理其他线程的计算任务,同时保持足够的线程数量来处理IO操作。这样可以更好地利用系统的资源,提高IO密集型任务的执行效率。

  3. 代码测试

    public class CPUAndIOTest {public static void main(String[] args) {int availableProcessors = Runtime.getRuntime().availableProcessors();System.out.println("CPU内核数:" + availableProcessors);// 测试IO密集型任务testIOIntensiveTask(availableProcessors);}private static void testIOIntensiveTask(int availableProcessors) {long startTime = System.currentTimeMillis();int corePoolSize = availableProcessors * 2;ExecutorService executor = Executors.newFixedThreadPool(corePoolSize);for (int i = 0; i < corePoolSize; i++) {executor.execute(() -> {// 模拟IO密集型任务try {Thread.sleep(5000/corePoolSize);} catch (InterruptedException e) {e.printStackTrace();}});}executor.shutdown();while (!executor.isTerminated()) {}long endTime = System.currentTimeMillis();System.out.println("IO密集型任务执行时间:" + (endTime - startTime) + "ms");}
    }
    

    结果如下

    核心线程数corePoolSize = 1时

    image-20231207211624930

    核心线程数corePoolSize = availableProcessors + 1也就是CPU内核数加1时

    image-20231207211638205

    核心线程数corePoolSize = availableProcessors * 2也就是CPU内核数*2时

    image-20231207211648650

从以上的结果可以看出,随着线程数的增加,IO密集型任务执行时间会逐渐变短,但线程过多也会导致线程的大量切换,造成资源的浪费,所以一般IO密集型任务设置的核心线程数为CPU内核数*2。

三、总结

  1. CPU密集型:

    核心线程数=CPU内核数+1

  2. IO密集型:

    核心线程数=CPU内核数*2

这篇关于CPU密集型和IO密集型与CPU内核之间的关系的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/467596

相关文章

【Linux进阶】UNIX体系结构分解——操作系统,内核,shell

1.什么是操作系统? 从严格意义上说,可将操作系统定义为一种软件,它控制计算机硬件资源,提供程序运行环境。我们通常将这种软件称为内核(kerel),因为它相对较小,而且位于环境的核心。  从广义上说,操作系统包括了内核和一些其他软件,这些软件使得计算机能够发挥作用,并使计算机具有自己的特生。这里所说的其他软件包括系统实用程序(system utility)、应用程序、shell以及公用函数库等

java中查看函数运行时间和cpu运行时间

android开发调查性能问题中有一个现象,函数的运行时间远低于cpu执行时间,因为函数运行期间线程可能包含等待操作。native层可以查看实际的cpu执行时间和函数执行时间。在java中如何实现? 借助AI得到了答案 import java.lang.management.ManagementFactory;import java.lang.management.Threa

在 Java 中,JDK、JRE、JVM 分别代表什么,有何关系和区别?

在Java开发的世界中,我们会经常听到JDK、JRE和JVM这三个词。它们都与Java的运行环境以及Java程序的编译和运行有关,它们之间也存在一些关联性和区别。 什么是JDK、JRE和JVM 我们来看它们分别是什么。 JDK,全称Java Development Kit,即Java开发工具包。顾名思义,JDK是用于Java开发的一套工具包,里面包含了Java的编译器javac、

ccp之间是不可以直接进行+,-的,要用ccpSub和ccpAdd。

1.  http://www.cnblogs.com/buaashine/archive/2012/11/12/2765691.html  上面有好多的关于数学的方面的知识,cocos2dx可能会用到的 2.学到了   根据tilemap坐标得到层上物体的id int oneTiled=flagLayer->tileGIDt(tilePos);

1_CString char* string之间的关系

CString转char*,string string转char*,CString char* 转CString,string 一、CString转char*,string //字串转换测试 CString CString1; std::string string1; CHAR* char1=NULL; //1string1=CString1.GetBuffer();CStri

【Linux文件系统】被打开的文件与文件系统的文件之间的关联刨析总结

操作系统管理物理内存以及与外设磁盘硬件进行数据的交换 操作系统如何管理物理内存呢? 其实操作系统内核先对内存先描述再组织的!操作系统管理内存的基本单位是4KB,操作系统会为每一个4KB大小的物理内存块创建一个描述该4KB内存块的struct page结构体,该结构体存储着这4KB内存块的属性信息,通过管理struct page来对内存进行管理,page结构体的大小比较小,OS通常将它们组成一个

Java——IO流(一)-(5/8):IO流概述、字节流-FileInputStream 每次读取一个字节

IO流概述 介绍 输入输出流,用于读写数据。 I指Input,称为输入流:负责把数据读到内存中去。 O指Output,称为输出流:负责写数据出去。 IO流的应用场景 文件内容的读写永久保存应用数据复制粘贴对话通信等等 怎么学IO流 理清楚IO六点分类和体系循序渐进、深入学习每个IO流的作用和用法 IO流的分类 IO流总体来看就有四大类: 字节输入流:以内存

国产数据库 - 内核特性 - CloudberryDB中的Runtime Filter

国产数据库 - 内核特性 - CloudberryDB中的Runtime Filter 今年5月份GreenPlum官方将GitHub仓库代码全部删除,各个分支的issues和bugs讨论等信息全部清除,仅将master分支代码进行归档。对于国内应用GPDB的用户来说,这是一个挑战性事件,对与后期维护、升级等都变得非常困难。有幸HashData开源了基于GP衍生版本CloudberryDB版本,

java NIO 缓存区之内核空间、用户空间和虚拟地址

IO是基于缓存区来做的,所谓的输入和输出就是从缓存区中移入和移出数据。以IO输入为例,首先是用户空间进程向内核请求某个磁盘空间数据,然后内核将磁盘数据读取到内核空间的buffer中,然后用户空间的进程再将内核空间buffer中的数据读取到自身的buffer中,然后进程就可以访问使用这些数据。     内核空间是指操作系统内核运行的空间,是为了保证操作系统内核的能够安全稳定地运行而为内核专

关于CPU的一点知识

首先说一下,CPU是干啥的: CPU所负责的就是解释和运行最终转换成机器语言的程序内容 我们需要知道的CPU结构:重点需要关注寄存器 运算器 简单说就是负责运算从内存读取到寄存器中的数据,可以看作一个数据加工厂,就是对寄存器中的数据做运算,这些运算包含基本的算术和逻辑运算。 算术逻辑单元(ALU) 这个是运算器中重要的一个组成,主要负责的就是对数据的处理,从而实现对数据的算术和