多线程的上下文切换以及线程调度问题和算法

本文详细介绍了线程上下文切换的概念、原因及其带来的问题,包括CPU寄存器和程序计数器的作用。上下文切换可能导致额外开销,可通过减少线程、使用无锁并发和协程来优化。Java使用抢占式线程调度,线程调度器按优先级分配CPU时间片。讨论了多种调度算法,如先来先服务、短作业优先、时间片轮转等,以及Java中线程让出CPU的情况。
摘要由CSDN通过智能技术生成

什么是上下文切换

CPU 利用时间片轮询来为每个任务都服务一定的时间,然后把当前任务的状态保存下来,继续服务下一个任务。任务的状态保存及再加载的过程叫做线程的上下文切换。

进程:指一个运行中的程序的实例。在一个进程内部可以有多个线程同时运行,并与创建它的进程共享同一地址空间(一段内存区域)和其他资源。

上下文:指线程切换时 CPU 寄存器和程序计数器所保存的当前线程的信息

寄存器:指 CPU 内存容量较小但速度很快的内存区域(与之对应的是 CPU 外部相对较慢的 RAM 主内存)。寄存器通过对常用值(通常是运行的中间值)的快速访问来加快计算机程序运行的速度。

程序计数器:是一个专用的寄存器,用于表明指令序列中 CPU 正在执行的位置,存储的值为正在执行的指令的位置或者下一个将被执行的指令的位置,这依赖于特定的系统。

上下文切换:指的就是内核(操作系统的核心)在 CPU 上对进程或者线程进程切换。上下文切换过程中的信息被保存在进程控制块(PCB-Process Control Block)中,PCB 又被称作切换帧(SwitchFrame)。上下文切换的信息会一直被保存在 CPU 的内存中,直到被再次使用。
  1. 挂起一个线程,将这个线程在 CPU 中的状态(上下文信息)存储与内存的 PCB 中。
  2. 在 PCB 中检索下一个线程的上下文并将其在 CPU 的寄存器中恢复。
  3. 跳转到程序计数器所指向的位置(即跳转到线程被中断时的代码行)并恢复该线程。
    在这里插入图片描述

引起上下文切换的原因

  1. 当前正在执行的任务完成,系统的 CPU 正常调度下一个任务
  2. 当前正在执行的任务遇到 I/O 等阻塞操作,调度器挂起此任务,继续调度下一个任务。
  3. 多个任务并发抢占锁资源,当前任务没有抢到锁资源,被调度器挂起,继续调度下一个任务。
  4. 用户的代码挂起当前任务,比如线程执行的 sleep 方法,让出 CPU。
  5. 硬件中断。

上下文切换带来的问题

上下文切换会导致额外的开销,常常表现为高并发执行时速度会慢串行,因此减少上下文切换次数便可以提高多线程程序的运行效率。

● 直接消耗:指的是CPU寄存器需要保存和加载, 系统调度器的代码需要执行, TLB实例需要重新加载, CPU 的pipeline需要刷掉

● 间接消耗

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值