• 技术文章 >运维 >linux运维

    linux环境下,哪些操作有可能引起线程切换

    (*-*)浩(*-*)浩2019-12-19 09:20:03原创1539

    linux采用一对一的线程模型,用户线程切换与内核线程切换之间的差别非常小。同时,如果忽略用户主动放弃用户线程的执行权(yield)带来的开销,则只需要考虑内核线程切换的开销。 (推荐学习:linux教程

    注意,这里仅仅是为了帮助理解做出的简化。实际上,用户线程库在用户线程的调度、同步等过程中做了很多工作,这部分开销不能忽略。

    如JVM对Thread#yield()的解释:如果底层OS不支持yield的语义,则JVM让用户线程自旋至时间片结束,线程被动切换,以达到相似的效果。

    什么引起线程切换

    时间片轮转

    线程阻塞

    线程主动放弃时间片

    直接开销

    直接开销是线程切换本身引起的,无可避免,必然发生。

    用户态与内核态的切换

    线程切换只能在内核态完成,如果当前用户处于用户态,则必然引起用户态与内核态的切换。(<font color="red">“用户态与内核态的切换”具体带来什么成本???</font>)

    上下文切换

    前面说线程(或者叫做进程都随意)信息需要用一个task_struct保存,线程切换时,必然需要将旧线程的task_struct从内核切出,将新线程的切入,带来上下文切换。除此之外,还需要切换寄存器、程序计数器、线程栈(包括操作栈、数据栈)等。

    线程调度算法

    线程调度算法需要管理线程的状态、等待条件等,如果根据优先级调度,则还需要维护优先级队列。如果线程切换比较频繁,该成本不容小觑。

    间接开销

    间接开销是直接开销的副作用,取决于系统实现和用户代码实现。

    缓存缺失

    切换进程,需要执行新逻辑。如果二者的访问的地址空间不相近,则会引起缓存缺失,具体影响范围取决于系统实现和用户代码实现。如果系统的缓存较大,则能减小缓存缺失的影响;如果用户线程访问数据的地址空间接近,则本身的缓存缺失率也比较低。

    以上就是linux环境下,哪些操作有可能引起线程切换的详细内容,更多请关注php中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:linux
    上一篇:linux df命令详解 下一篇:shell关系运算符介绍
    千万级数据并发解决方案

    相关文章推荐

    • linux系统下workerman无法启动• 什么是linux操作系统• linux系统下防止由于终端关闭导致workerman退出• linux系统有什么
    1/1

    PHP中文网