多线程的上下文切换

本人写博客是为了加深对知识内容的理解,文中的大部分内容都是参考于大牛方腾飞的《Java并发编程的艺术》,也可能会有一些自己的理解,如有错误,欢迎指正。

相信大家在面试的时候,都经常会被问到这个问题 – “多线程的速度一定比单线程快吗”。这么问也就说明答案是否定的,而这道题的精髓就在于你能不能说出上下文切换这几个字。那什么是上下文切换呢?

上下文切换

定义1:即使是单核的cpu也能够执行多线程,cpu通过给每个线程分配时间片来实现这个机制。时间片是cpu分配给各个线程的时间,因为时间非常短,所以cpu通过不断地切换线程,让我们感觉多个线程是同时执行的,一般时间片为几十毫秒。
cpu通过时间片分配算法来循环执行任务,当前任务执行一个时间片后切换到下一个任务。但是,在切换前会保存上一个任务的状态,以便下次切换回这个任务时,可以再加载这个任务的状态。所以任务从保存到再加载的过程就是一次上下文切换

读到这个定义的时候,算是对上下文切换有了点认识,但总觉得有点抽象、不够具体,所以又从《Java多线程编程实战指南》查找了一下概念。
定义2:多线程环境中,当一个线程的状态由Runnable转换为非Runnable(Blocked、Waiting、Timed_Waiting)时,相应线程的上下文信息(包括cpu的寄存器和程序计数器在某一时间点的内容等)需要被保存,以便相应线程稍后再次进入Runnable状态时能够在之前的执行进度的基础上继续前进。而一个线程从非Runnable状态进入Runnable状态可能涉及恢复之前保存的上下文信息。这个对线程的上下文进行保存和恢复的过程就被称为上下文切换。

上下文切换会带来额外的开销,这包括对线程上下文信息保存和恢复的开销,对线程进行调度的cpu时间开销以及cpu缓存失效的开销。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值