文章目录
- 并发和并行
- 并发和并行的区别
- 上下文切换
- 相关问题
- 为什么循环次数少的情况下,单线程快?
- 什么时候需要用多线程?
- 线程上下文切换消耗的时长?
- 用什么测试的线程上下文?面试回答下面的工具会加分:
- 如何减少上下文切换?
- 减少上下文切换实战
- 如何打印(查看)线程信息?
——————————————————————————
并发和并行
- 并发是多线程竞争同一个资源。
- 并行是指多线程运行,没有资源的竞争。
注:什么叫做资源?
——>变量、方法等都叫资源,占了内存的都叫资源,总之,资源就是变量
并发和并行的区别
- 并发有资源竞争,并行没有资源竞争
- 并发是指多线程对同一个变量进行读写操作【多线程对相同资源进行竞争】
- 并行是进行不同变量的操作,没有相同变量的竞争
上下文切换
- 是单核处理器也支持多线程执行代码,CPU通过给每个线程分配CPU时间片来实现
- 以CPU通过不停地切换线程执行,让我们感觉多个线程是同时执行的
- 大部分线程,cpu执行完就销毁,cpu就让出来了,有的线程执行完就销毁,有的线程一直执行
- 不同的操作系统分配的时间片是不同的(linux操作系统分配时间片是等长的20ms,windows操作系统分配时间片是不等长的几ms~几十ms)
- 有的线程寿命很短,有的线程执行时间特别长,对于寿命特别长的线程,cpu也得切换到下一个线程执行,只是给这个线程不断分配时间片。
- cpu在切换前会保存上一个任务的状态,以便下次切换回这个任务时,可以再加载这个任务的状态。任务从保存到再加载的过程就是一次上下文切换。
- 线程上下文: 线程上下文需要记录上次执行的位置和切换,切换是有消耗的
- 多线程在切换的时候有性能损耗和时间损耗
相关问题
为什么循环次数少的情况下,单线程快?
因为循环次数少的话,启动其他核去执行任务,本身线程是进入就绪态让cpu去选,选的时候也需要消耗时间;单线程时,数量少的话瞬间就能执行完毕;多线程时,有切换的时间消耗。
循环次数多的时候,一般是多线程快,不过并不意味着线程多就一定快
什么时候需要用多线程?
cpu产生浪费的时候使用多线程,才会让性能得到提升;
像操作系统同时运行qq,微信等多个线程是为了体验好,开多个线程后性能是会变慢的
线程上下文切换消耗的时长?
线程上下文切换消耗的时长——将近1ms一次——达到毫秒级别,消耗很大
用什么测试的线程上下文?面试回答下面的工具会加分:
- 使用Lmbench3可以测量上下文切换的时长。
- 使用vmstat可以测量上下文切换的次数。
如何减少上下文切换?
减少上下文切换的方法有无锁并发编程、CAS算法、使用最少线程和使用协程。
协程: 在单线程里实现多任务的调度,并在单线程里维持多个任务间的切换。
减少上下文切换实战
命令:
sudo -u admin切换管理员权限
注:dump线程信息:显示这一瞬间的线程信息;dump不知存在于线程中,在其他地方也有,比如数据库等,时记录一瞬间状态的
如何打印(查看)线程信息?
jstack命令
注:命令的意思:
sudo -u admin:切换到管理员权限
在 /opt/ifev/java/bin/ :在这个文件夹下面
执行jstack指令
传递3117这个参数查询3117这个进程
保存到/home/tengfei.fangtf/dump17这个文件里面
grep指令
grep:筛选,经常用来查询内容
——>统计,排序,按照一定格式输出
JBOSS:类似于tomcat,放网站进行运行