V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
tuzhenyu
V2EX  ›  程序员

关于 Java 多线程上下文切换的疑问

  •  
  •   tuzhenyu · 2018-04-12 10:59:51 +08:00 · 2684 次点击
    这是一个创建于 2219 天前的主题,其中的信息可能已经有所发展或是发生改变。

    求教大佬们一些疑问 (1) Java 中多线程上下文环境切换这里的上下文主要是指什么呢?是线程私有的栈和程序计数器吗?(2) 上下文切换会造成大量的内核空间和用户空间之间的数据拷贝,是指要将线程相关的信息装载到内核吗?谢谢~

    6 条回复    2018-04-13 08:57:58 +08:00
    wwqgtxx
        1
    wwqgtxx  
       2018-04-12 12:07:03 +08:00 via iPhone
    你需要看看操作系统原理这本书
    pwrliang
        2
    pwrliang  
       2018-04-12 13:46:28 +08:00 via Android
    每个线程应该是有独立的 PC,但是寄存器应该是共享,所以上下文应该包括通用寄存器?还有,不知道 jvm 线程实现是用户级还是内核级别的?求大佬解答
    qwertty01
        3
    qwertty01  
       2018-04-12 13:55:16 +08:00
    @pwrliang 内核级的
    wizardforcel
        4
    wizardforcel  
       2018-04-12 16:23:35 +08:00 via Android
    每个线程有自己的栈,但在同一个 va 里面,所以不用切换栈,切换 bp 和 sp 就行了,当然他们也是一种寄存器。
    gabon
        5
    gabon  
       2018-04-12 17:58:09 +08:00 via Android
    每个 Java 线程都映射为 Linux 内核线程,java 线程切换就是 Linux 线程切换,而 Linux 里线程和进程实现一致,都需要切换寄存器等等,相比之下线程不需要切换内存,换页等等,缓存也不会失效。有问题请指教。
    crb912
        6
    crb912  
       2018-04-13 08:57:58 +08:00 via Android   ❤️ 1
    这个和 java 没关系,操作系统原理。每个进程拥有自己的资源空间和执行的时间线,以及线程。假设线程 P1,还没执行结束,就要被迫暂停,那么操作系统会保留它的进度,包括变量,指令执行的位置,等等。然后切换新的线程,假设 P2。这个过程就是上下文切换。当 P2 运行结束之后,会再次切换回 P1。
    这是计算机实现并发运行的手段。目的是看上去“同时”可以执行多个任务。
    实际上频繁切换,反而导致效率的降低
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2963 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 36ms · UTC 15:19 · PVG 23:19 · LAX 08:19 · JFK 11:19
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.