首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >并发编程之上下文切换

并发编程之上下文切换

作者头像
爱撒谎的男孩
发布2019-12-31 15:10:29
发布2019-12-31 15:10:29
1.1K0
举报
文章被收录于专栏:码猿技术专栏码猿技术专栏

文章目录

1. 多线程之上下文切换

1.1. 定义

1.2. 上下文切换的分类和诱因

1.2.1. 自发性的上下文切换

1.2.2. 非自发性上下文切换

1.3. 上下文切换的花销

1.3.1. 直接开销

1.3.2. 间接开销

多线程之上下文切换

定义

在单处理器的情况下,每个线程的执行时间是根据时间片大小决定或者自身的其他原因,如果一个线程被迫或者主动暂停运行时,另外一个线程(可能是同一个进程中的线程或者其他进程中的)可以被操作系统(线程调度器)选中占用处理器开始或者继续运行。这种一个线程被暂停,即是被剥夺处理器使用的权利,另外一个线程被选中开始或者继续运行的过程就叫做上下文切换 一个线程被剥夺处理器的使用权而被暂停运行就被称之为切出 一个线程被操作系统(线程调用器)选中占用处理器开始或者继续运行就被称之为切入 在线程的数量大于核心处理器的数量的时候,我们看到连续运行的线程,实际上是以断断续续的运行方式使其任务进展的。这种方式意味着在切入和切出的时候操作系统需要保存和恢复相应线程的进入信息,即是切入和切出的那一刻线程执行的任务进行到什么程度了(如计算结果以及执行到了哪条指令)。这个保存的进度信息叫做上下文 在切出的时候,操作系统需要将上下文信息保存在内存中,以便稍后处理器继续运行该线程的时候能够在此信息的基础上继续运行 在切入的时候操作系统需要从内存中加载和恢复被选中的线程上下文信息,以在之前的基础上继续运行

上下文切换的分类和诱因

自发性的上下文切换

自发性上下文切换是指线程由于自身因素导致的切出。一个线程在运行过程中执行下列方法可能会导致线程自发性的上下文切换

  1. sleep()
  2. wait()
  3. yield(() : 这个方法可能导致
  4. join()
  5. LockSupport.park()
  6. 线程发起了IO操作(如读取文件) 或者等待其他线程的持有的锁也会导致自发性上下文切换

非自发性上下文切换

由于线程调度器的原因被迫切出

  1. 时间片用完
  2. 一个更高优先级的线程需要运行
  3. 垃圾回收器在执行垃圾回收的过程中可能也是需要暂停线程才能完成工作

上下文切换的花销

上下文切换的花销是必须的,即使在多核的处理器系统中上下文切换也是必须的,因为我们需要执行的线程的数量总是大于处理器的数量。

直接开销

  1. 操作系统保存和恢复上下文所需要的开销,主要是时间的开销
  2. 线程调度器进行线程调度的开销(比如按照一定规则决定哪一个线程会占用处理器)

间接开销

  1. 处理高速缓存重新加载的开销,一个被迫切出的线程在另外一个处理器切入运行,由于这个处理器之前可能没有运行过该线程,那么这个线程在运行过程中需访问的变量仍然需要该处理器从主内存或者通过一致性协议从其他处理器加载到高速缓存之中,这个也是需要时间消耗的
  2. 上下文切换可能导致整个一级高速缓存被冲刷(Flush),即一级高速缓存中的内容会被写入下一级高速缓存或者主内存中。
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-06-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 多线程之上下文切换
    • 定义
    • 上下文切换的分类和诱因
      • 自发性的上下文切换
      • 非自发性上下文切换
    • 上下文切换的花销
      • 直接开销
      • 间接开销
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档