线程和线程池

2023-11-19

线程和线程池

并发和并行

并发是指在单个CPU核心上,多个线程占用不同的CPU时间片,但由于每个线程占用的CPU时间片非常短(比如10ms),看起来就像是多个线程在共同执行一样,但在微观物理上看其实还是串行执行的。这样的场景称作并发。
在这里插入图片描述

并行是指在CPU多个核心上,多个线程是在真正的同时执行。(每个CPU核心也在并发的执行)
在这里插入图片描述

多线程的优势

多线程程序一定就好吗?不一定,要看具体的应用场景:

IO密集型,运算较少,涉及磁盘或网络、外部设备等IO操作较多,会阻塞等待情况较频繁。
无论是CPU单核、CPU多核、多CPU,都是比较适合多线程程序的

CPU密集型,运算多,IO操作少,阻塞情况少。
CPU单核下,多线程存在上下文切换,是额外的花销,线程越多上下文切换所花费的额外时间也越多,不如一个线程一直进行计算,不适合多线程。
CPU多核下,多个线程可以并行执行,可以提高CPU利用率。

线程的消耗

为了完成任务,创建很多的线程可以吗?线程真的是越多越好?
线程的创建和销毁都是非常"重"的操作
线程的创建需要由系统来完成,需要内核的参与,这就涉及到用户空间到内核空间的切换。要给线程分配内核栈、页目录、页表等描述线程的资源和数据结构。创建完成后是要交给用户来使用,需要再切回用户空间。

线程创建完成后,在用户空间处理执行业务,执行完就需要销毁线程,同样也需要内核的参与。

操作系统上创建线程和销毁线程都是很"重"的操作,耗时耗性能都比较多,那么在服务执行的过程中,
如果业务量比较大,实时的去创建线程、执行业务、业务完成后销毁线程,那么会导致系统的实时性能
降低,业务的处理能力也会降低。

线程栈本身占用大量内存
在32位地址空间下,内核给每个进程分配了4G大小的地址空间,用户空间3个G,内核空间1个G,一个进程创建的所有线程共享进程的地址空间。Linux系统下栈的空间大小默认是8M:
在这里插入图片描述
3G的空间除去代码段、数据段等,一个进程大概能创建380个线程。
如果程序一开始就创建了大量的线程,程序的地址空间都被线程栈占了,连变量都定义不了多少,还怎么做业务呢?

线程的上下文切换要占用大量时间
线程数量如果过多,就会涉及到线程的调度,线程调度是需要进行上下文切换的,切耗费的是CPU的时间,切换的时候CPU什么都没做,就会降低CPU的利用率。

大量线程同时等待同一个事件,唤醒时会使系统经常出现锯齿状负载或者瞬间负载量很大导致宕机

为了减少创建线程和销毁线程的性能和时间耗费,可以在服务进程启动之初,就事先创建好线程池里面的线程,当业务流量到来时需要分配线程,直接从线程池中获取一个空闲线程执行task任务即可,task执行完成后,也不用释放线程,而是把线程归还到线程池中继续给后续的task提供服务。

fixed模式线程池

线程池里面的线程个数是固定不变的,一般是ThreadPool创建时根据当前机器的CPU核心数量进行指定。

cached模式线程池

线程池里面的线程个数是可动态增长的,根据任务的数量动态的增加线程的数量,但是会设置一个线程数量的阈值(线程过多的坏处上面已经讲过了),任务处理完成,如果动态增长的线程空闲了设定时间还没有处理其它任务,那么关闭线程,保持池中最初数量的线程即可。

线程池模型:
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

线程和线程池 的相关文章

随机推荐

  • Taint analysis and pattern matching with Pin

    Taint analysis and pattern matching with Pin by Jonathan Salwan 2013 08 08 Last weeks I played with the Pin API and this
  • html+css+JavaScript实现每日签到功能

    用户每日签到主要在于实现点击 签到 显示即时时间 本次使用的是原生js实现签到功能 绑定签到按钮点击需要显示的内容 获取网络时间 获取年月日 再对文字进行拼接 最后再进行插入html中的展示内容 下面附上实现代码 js部分 签到按钮 fun
  • JS 字符串常用方法总结

    初识字符串 字符串可以是对象 var firstName new String Bill typeof firstName gt object new 关键字使代码复杂化 字符串方法 所有的字符串方法都是返回新的字符串 不会更改原始字符 l
  • erp故障处理流程图_工厂有了ERP,为什么还要上MES?

    制造车间的信息黑洞随着ERP在企业应用的深入 ERP系统逐渐显示出其局限性 当ERP下达的工单到生产现场后 产品制造是以产线 工单 或 批次 Batch 为线索的执行过程 在这个过程中 现场管理人员需要实时信息进行决策 比如 不同产线上目前
  • 计算机视觉之三维重建(一)(摄像机几何)

    针孔摄像机 添加屏障 使用针孔 o 光圈 针孔 摄像机中心 实现现实与成像一对一映射 减少模糊 其中针孔与像平面的距离为f 焦距 虚拟像平面位于针孔与真实物体之间 与像平面互为倒立关系 位置映射 利用相似三角形得到现实坐标在像平面上的映射坐
  • Win 10 +Ubuntu双系统

    我们的神器WSL 神器WSL在官方称为适用于Linux系统的Windows子系统 里面的各种命令操作跟原生的Linux系统操作是一样的 完全可以让自己应用上 安装 在安装前我们需要做下准备工作 首先确保我们的系统能进行这样的操作 准备工作
  • SSH常见面试题

    1 项目中为什么使用SSH框架 使用Struts是因为struts是基于MVC模式的 很好的将应用程序进行了分层 使开发者更关注于业务逻辑的实现 另外struts有着丰富的taglib 如能灵活运用 则能大大提高开发效率 使用Hiberna
  • 单片机检测信号通断通用电路(3.3V/5V直流信号,24V+直流信号,220V交流信号)

    在实际的电路设计中 往往需要用到单片机检测某些信号通断 检测电压有无 在一定的范围内 比如3 3V的直流信号 单片机的IO是可以直接连接信号检测的 但是往往实际信号各种各样 24V 48V直流 220V交流 甚至380V交流 单片机就无法直
  • pc连接用access,交换机互联用trunk

    实验目的 同一个里vlan下面的所有主机可以相连 vlan10和vlan100可以相通 实验前提 把pc的基本配置做完 让他们在一个网段里 给pc1和pc3按照要求用vlan10 pc2用vlan100 交换机1 首先让交换机创建10 10
  • html中使用js实现体彩11选5随机选号

    体彩11选5随机选号 页面预览 代码实现
  • OpenCV简单应用(一、摄像头拍照)

    1 首先安装OpenCV 当然所用电脑要有摄像头 且接入网络 比较简单粗暴的做法是到Python所在的目录下 Scripts下运行 pip install opencv python 2 以下代码是开启摄像头 按任意键退出 import c
  • QT2023新版安装教程

    目录 前言 一 QT在线安装包下载 1 官方网站 2 镜像 清华大学 二 QT安装 1 更换安装源 2 安装界面 3 组件选择 重点 参考 Qt2023新版保姆级 安装教程 前言 本文主要介绍2023新版QT安装过程 希望能帮到大家 一 Q
  • mybatisplus是什么?

    Mybatis Plus 简称为Mybatis 或MP 是一个开源的Mybatis增强框架 它是在Mybatis基础上进行了扩展和增强 Mybatis Plus旨在简化开发过程 提高代码的开发效率 并提供更多的便捷功能 Mybatis Pl
  • 仿网易云音乐小程序

    一 程序描述 仿网易云音乐小程序 调用网易云API真实接口 实现了音乐播放 音乐切换 歌词显示 搜索音乐 视频播放 用户登录退出等功能 以下是效果展示 仿网易云小程序 二 代码介绍 1 目录介绍 2 搜索 代码讲解 实现思路 先把搜索的静态
  • 台式电脑切换集成显卡和独立显卡

    台式电脑切换集成显卡和独立显卡 1 背景 2 认识 3 步骤 3 1 确认是否有两个显卡以及当前显示器连接显卡 3 2 更新驱动 3 3 确认显示器连接接口 3 4 显卡设置 4 总结 1 背景 发现电脑在处理画面时有非常卡顿 想着电脑装的
  • html中图片热区链接怎么设置,html图像热区链接做好之后怎么上传到网页上让别人打开?...

    html图像热区链接做好之后怎么上传到网页上让别人打开 以下文字资料是由 历史新知网www lishixinzhi com 小编为大家搜集整理后发布的内容 让我们赶快一起来看一下吧 图像热区链接做好之后怎么上传到网页上让别人打开 做的是静态
  • 使用session实现同一账号只能同时一个人使用

    使用session实现同一账号只能同时一个人使用 今天我们要讲的就是 实现同一个账号只能同一时间让一个人使用 实现起来也是非常的简单 其实我这里讲到的是我前几天做出来的一个大概核心代码和核心思路 我也是查遍了很多网站 看了很多人的源码然后都
  • QT绘图之自动缩放画线和点

    需求 用 作为画板 把纸条缩放到 上 纸条长度不定 宽度固定 纸条上任意位置画点或者线 点距或者线距不固定 点数和线数也不固定 要成比例映射到 上直观显示 话不多说 上代码 ool sprayer Widget eventFilter QO
  • 导入Unity 2D Animation插件没有生效

    导入Unity 2D Animation后 打开Sprite Editor发现没有Skinning Editor选项 这可能是因为导入插件后与项目原有的Plugin下的库产生冲突导致的 这时候点击Packages Editor Unity
  • 线程和线程池

    线程和线程池 并发和并行 并发是指在单个CPU核心上 多个线程占用不同的CPU时间片 但由于每个线程占用的CPU时间片非常短 比如10ms 看起来就像是多个线程在共同执行一样 但在微观物理上看其实还是串行执行的 这样的场景称作并发 并行是指