1
0
mirror of https://github.com/Snailclimb/JavaGuide synced 2025-06-16 18:10:13 +08:00

修改了什么是上下文切换的描述。

This commit is contained in:
VinterHe 2021-06-22 11:05:19 +08:00 committed by GitHub
parent 287e73c9e0
commit c50a6d2469
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -155,13 +155,15 @@ Java 线程在运行的生命周期中的指定时刻只可能处于下面 6 种
## 7. 什么是上下文切换?
多线程编程中一般线程的个数都大于 CPU 核心的个数,而一个 CPU 核心在任意时刻只能被一个线程使用为了让这些线程都能得到有效执行CPU 采取的策略是为每个线程分配时间片并轮转的形式。当一个线程的时间片用完的时候就会重新处于就绪状态让给其他线程使用,这个过程就属于一次上下文切换。
线程在执行过程中会有自己的运行条件和状态也称上下文比如上文所说到过的程序计数器栈信息等。当出现如下情况的时候线程会从占用CPU状态中退出。
- 主动让出CPU比如调用了sleep(),wait()等。
- 时间片用完因为操作系统要防止一个线程或者进程长时间占用CPU导致其他线程或者进程饿死。
- 调用了阻塞类型的系统中断比如请求IO线程被阻塞。
- 被终止或结束运行
概括来说就是:当前任务在执行完 CPU 时间片切换到另一个任务之前会先保存自己的状态,以便下次再切换回这个任务时,可以再加载这个任务的状态。**任务从保存到再加载的过程就是一次上下文切换**。
这其中前三种都会发生线程切换线程切换意味着需要保存当前线程的上下文留待线程下次占用CPU的时候恢复现场。并加载下一个将要占用CPU的线程上下文。这就是所谓的上下文切换
上下文切换通常是计算密集型的。也就是说,它需要相当可观的处理器时间,在每秒几十上百次的切换中,每次切换都需要纳秒量级的时间。所以,上下文切换对系统来说意味着消耗大量的 CPU 时间,事实上,可能是操作系统中时间消耗最大的操作。
Linux 相比与其他操作系统(包括其他类 Unix 系统)有很多的优点,其中有一项就是,其上下文切换和模式切换的时间消耗非常少。
上下文切换是现代操作系统的基本功能因其每次需要保存信息恢复信息这将会占用CPU内存等系统资源进行处理也就意味着效率会有一定损耗如果频繁切换就会造成整体效率低下。
## 8. 什么是线程死锁?如何避免死锁?