系统适合开启多少线程数量?

1.什么是上下文切换?

操作系统利用了时间片轮转的方式,CPU给每个任务都服务一定的时间,当前任务在执行完CPU时间片后,切换到另一个任务之前会保存自己的状态以便下次在切回这个任务时,可以在加载这个任务的状态。任务从保存到再加载的过程就是一次上下文切换。上下文切换意味着会消耗大量的CPU时间。

2.线程是如何执行的?

线程的执行是由CPU进行调度的,一个CPU在同一时刻只会执行一个线程

3.为什么要使用多线程?

3.1.从计算机底层来说
线程可以比作是轻量级的进程,是程序执行的最小单位,线程间的切换和调度的成本远远小于进程。另外,多核CPU时代意味着多个线程可以同时运行,这减少了线程上下文切换的开销。
3.2.从系统并发处理来说
现在的系统动不动就要求百万级甚至千万级的并发量,而多线程并发编程正式开发高并发系统的基础,利用好多线程机制可以大大提高系统整体的并发能力以及性能。
并发能力主要体现在吞吐量:吞吐量越大,意味着程序能处理的请求越多
性能主要体现在延迟上:延迟越短,意味着程序执行得越快,性能也就越好。
使用多线程的主要目的:降低延迟,提高吞吐量

4.使用多线程带来的问题

并发编程的目的就是为了能提高程序的执行效率提高程序运行速度,但是并发编程并不总是能提高程序的运行速度的,而且并发编程可能遇到很多问题,如:内存泄漏,上下文切换,死锁等。还可能受限于硬件和软件的资源闲置问题。

5.多线程的应用场景

在并发编程领域,提升性能本质上就是提升硬件的利用率,也就是提升I/O的利用率和CPU的利用率,需要解决CPU和I/O设备综合利用率的问题。

这里借用某老哥画的一个图来说明下怎么合理使用多线程。
下图中,我们只有一个线程A,线程进行CPU操作后,接着I/O进行操作,如同一条线,这时候我们不难发现,当我们进行I/O操作的时候,CPU是处于空闲状态的。
在这里插入图片描述
我们在看如下这个图,我们发现当线程A正在使用CPU的时候,线程B正在使用I/O,而当线程B使用CPU的时候,线程A正在使用I/O,因此对于如下这个图,我们不难发现,那就是CPU一直处于工作状态。
在这里插入图片描述
而我们要想通过多线程来提升我们的性能和并发能力,那就是在减少上下文切换的时候,充分的利用CPU资源以及I/O资源。

6.CPU密集、I/O密集任务怎么判断?

6.1.CPU密集任务

CPU密集型会消耗掉大量的CPU资源,例如需要计算圆周率、大量的计算、视频渲染、仿真等。计算密集型任务的特点是要进行大量的计算,消耗CPU资源,全靠CPU的运算能力。这种计算密集型任务虽然也可以用多任务完成,但是任务越多,花在任务切换的时间就越多,CPU执行任务的效率就越低
这个时候CPU就卯足了劲在运行,这个时候切换线程,反而浪费了切换的时间,效率不高。

如果把我们的大脑比作CPU,当你在上物理课,数学课、算法课的时候,其实这时候你的大脑处于高负载工作状态,全精力投入你都不一定能听的懂老师在说什么。然后这个时候突然你想起了来了,明天你要去面试,你要准备很多面试八股文。然后你旁边的人正在看英雄联盟S11总决赛,EDG和DK正在大杀四方,你内心激动的不得了,忍都忍不住的看了好几眼。
那么这时候你只有三种选择,要么老老实实上课,要么准备八股文面试,要么全身心的观看比赛,为EDG选手的操作连连称赞。这时候的你是绝对不能三件事同时去做的。这时候你的大脑压根没有资源让你能同时做这三件事,如果你非得都要干,也就是开启多线程,结果就是观看比赛体验不好,老师讲的课没听懂,该准备的八股文没背下来。

6.2.I/O密集任务

IO密集型,涉及到网络、磁盘IO的任务都是IO密集型任务,这类任务的特点是CPU消耗很少,任务的大部分时间都在等待IO操作完成(因为IO的速度远远低于CPU和内存的速度)。对于IO密集型任务,任务越多,CPU效率越高,但也有一个限度。常见的大部分任务都是IO密集型任务,比如Web应用。

还是以我们的大脑当作CPU,此时的你正在坐在电脑面前听着歌;时不时瞄一眼你的微信,因为你给你女神发了消息,你女神还没回复你;想到晚上下班在地铁上又是一个小时,你庆兴你们单位没有国美那么变态,去监控每个人上网使用流量,因此你打算下载一部电影,准备在地铁上看;摸了摸脖子有点酸痛,常年坐在工作岗位上,身体一天不如一天,然后你去茶水间泡了一大杯枸杞…

此时划水的你,一边听歌,一边等女神回复消息,一边下载电影,一边喝枸杞…然而都这样了,你的脑袋瓜子,仍有余力干其他的事。比如拿着手机翻看你女神的朋友圈;比如吐槽下你领导和客户是傻逼;和产品经理在撕逼,这个功能,我做不了;和测试小姐姐说,这不是BUG,是需求不明确…

这就是I/O密集任务,因为你大脑此时任然不饱和,还能干很多事,换句话说就是,你太闲了。

创建多少线程合适?

一般来说,对于创建多少线程,我们先要确定我们属于CPU密集型还是I/O密集型。

CPU密集型

对于CPU密集型的计算场景,也就是使用CPU是比较多的,这时候不建议开过多线程,因为本身CPU使用就很频繁了,这时候增加多线程,CPU资源除了不够用以外,还会导致上下文切换。因此CPU密集型任务开启多少线程主要还是取决于CPU的核数来决定。

理论上线程的数量 = CPU核数 就是最合适的
工程上线程的数量 = CPU核数 + 1,这样的话,当线程因为偶尔的内存页失效或其他原因导致阻塞时,这个额外的线程可以顶上,从而保证CPU的利用率。

I/O密集型

对于I/O密集型的计算场景,也就是说大多时候CPU是处于空闲状态的,这时候就可以增加多线程来提升CPU的利用率。因此这个时候,即使多线程会产生上下文切换,但是产生的影响可能对于CPU的利用率提升来说,就显得微不足道了。
针对单核处理器
一般我们先去计算出I/O和CPU的耗时资源比,比如I/O读写需要5秒,CPU计算需要1秒,也就是说这个时候,我们CPU对比I/O,我们有5倍的时间里面,都是属于空闲的,因此此时想提升CPU利用率,我们完全可以开启5个线程。
单核处理器最佳线程数 = 1 + ( I/O耗时 / CPU耗时 )

除了使用CPU和I/O的耗时来计算,我们也可以使用CPU利用率来计算,CPU等待时间除以工作时间,我们就知道CPU处于等待时候的占比了。空闲占比乘以利用率,即可以 求出最佳线程数
单核处理器最佳线程数 = CPU利用率×( 1+ 平均等待时间 / 平均工作时间 )
针对多核处理器
上面我们计算了单核处理器,那么计算多核处理器就比较简单了,就是多核 x 单核线程数
多核处理器最佳线程数 = CPU核数 × [1 + ( I/O耗时 / CPU耗时 )]

当然除了采用耗时来计算,我们也可以采用利用率和等待时间占比
多核处理器最佳线程数 = CPU核数 × CPU利用率 × ( 1+ 平均等待时间 / 平均工作时间 )

  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
易点内容管理系统(DianCMS)是基于微软.NET Framework 2.0、AJAX1. 0技术,采用Microsoft Access/SQL Server 2000/2005/2008存储过程进行多层架构开发的内容管理系统。其功能设计主要面向中大型企业、各个行业、事业单位以及政府机关等复杂功能站点。系统已建立文章系统、图片系统、下载系统、个人求职、企业招聘、房产系统、音乐系统、视频系统、网上商店。使用自定义模型、自定义字段、自定义表单、自定义录入界面、会员系统等功能,您还可以轻松、灵活的建立适合自身需求的任何系统功能,最大化满足每个用户任何时候的不同需求。 DianCMSv5.3.0更新内容_2015-03-02 【增加】是否型字段默认选中True或者Flase选项 【增加】独创函数<=TimeToInt()> 时间转时间戳、<=IntToTime()>时间戳转时间、<=For()>循环 【修改】在线客服。 【增加】商城购买完成页模板设置、修改商城多次点击购物车后,购物车数量变化选择。 【调整】百度sitemap为最新xml格式 【增加】多个邮件服务器地址配置,随机邮箱发送注册确认邮件等。 【增加】在栏目展示标签中增加了Where条件筛选,可以使用类似于:ename like 'a' and parentid=1等SQL语句筛选。 【增加】采集每个URL时间设定,防止采集时被目标服务器屏蔽。 【优化】分站功能。 【增加】数据字典批量添加、模板导入到数据字典功能,大大提高创建数据字典的快捷性。 【增加】字符过滤列表页搜索功能,实现快速查找过滤字符。 【增加】调用多图第一张图样式、读取多图数量样式 【增加】二级联动、*联动在信息列表中指定显示类别信息 【增加】关闭手机网站功能,需要时再打开。 【增加】用户扩展信息列表。 【开放】本地测试(http://localhost)时,体验标准版功能。 程序特点如下: 1、自定义内容模型、表单、用户注册模型 2、自定义内容录入界面、表单录入界面、用户注册界面 3、自定义搜索及搜索结果显示方式 4、自定义Sitemap 5、超强字段管理功能:单行文本、多行文本、单选项、多选项、二级联动、*联动、附件等等 6、超强表单功能管理 7、普通标签任意条件组合调用 8、完善的单页管理管理 9、首次引用一条数据属于多个栏目功能 10、全站录入界面统一生成aspx文件,方便管理和扩展 11、全站使用SEO优化设置 12、后台支持选项卡功能,可记录最近Cao作的8个功能连接 13、会员系统、会员组权限设置 14、管理员组权限设置 15、管理员、用户日志记录 16、多种生成内容方式 17、Excel完美导入 18、超强采集系统:采用多线程设计可暂停、继续、终止采集任务 19、灵活的VS自由标签 20、终极列表内置24种分页效果,满足不同网站风格 21、集成文章系统、下载系统.使用导入模型功能,可增加多种系统功能 22、数据字典内置多种常用类别:*地区、个人爱好、评分等级等 23、站内链接功能 24、特殊字符过滤功能 25、Email邮件单发、群发 26、备份和压缩数据库 27、录入信息使用正则表达式验证 28、站点短消息系统 29、上传文件管理 30、任意广告制作系统 31、URL伪静态功能:采用微软URLRewriter核心架构 32、评论系统 33、后台5种风格主题供选择 34、VS Free标签——任意表数据调用 35、关键字管理 36、完善的会员系统:用户投稿、好友分组、短消息管理、推广奖励、备忘录自动提醒等

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值