头号码甲的错题本

头号码甲的错题本

1. 用户态和内核态

Linux整个体系分为用户态和内核态(或者叫用户空间和内核空间), 那内核态究竟是什么呢?

本质上我们所说的内核态, 它是一种特殊的软件程序,特殊在哪?
统筹计算机的硬件资源,例如协调CPU资源、分配内存资源、并且提供稳定的环境供应用程序运行。

字节一面:go的协程相比线程,轻量在哪?-LMLPHP

2. 为什么线程切换会导致用户态和内核态的切换?

  • 线程是cpu调度的基本单位,进程是资源占有的基本单位。
  • 因为线程中的代码是在用户态运行,而线程的调度是在内核态,所以线程切换会触发用户态和内核态的切换。
  • 线程上下文切换的代价是高昂的:上下文切换的延迟取决于不同的因素,大概是50到100 ns左右,考虑到硬件平均在每个核心上每ns执行12条指令,那么一次上下文切换可能会花费600到1200条指令的延迟时间。

3. 导致线程上下文切换的时机


4. 线程切换的开销

字节一面:go的协程相比线程,轻量在哪?-LMLPHP

5. go的协程轻量级体现在哪?

如上面所述,线程切换会导致 用户态和内核态的切换,其中内核态耗时较长,且不受用户代码控制。

go将goroutine的调度维持在用户态, 这是由GPM中的P Process来完成的,做用户态任务的调度器,功能类比于常规的操作系统线程调度器,所以又被称为逻辑处理器。

字节一面:go的协程相比线程,轻量在哪?-LMLPHP

P 是G、M之间的桥梁,调度器对于goroutine的调度,很明显也会有切换,这个切换是很轻量的: 只涉及PC SP DX三个寄存器的值的修改;而对比线程的上下文切换则需要陷入内核模式、以及16个寄存器的刷新。

6. GO GMP 调度方式

  • 由逻辑处理器P调度协程G进系统线程M (若本地队列没有G,从其他队列/全局队列偷取G),
  • 线程M执行G, 遇到[系统调用], G和M分离,拿新的M去接管原逻辑处理器P

字节一面:go的协程相比线程,轻量在哪?-LMLPHP

请仔细阅读上图,出处不可考证,感谢原图作者。

ref


本文来自博客园,作者:{有态度的马甲},转载请注明原文链接:https://www.cnblogs.com/JulianHuang/p/16008107.html

欢迎关注我的原创技术、职场公众号, 加好友谈天说地,一起进化
字节一面:go的协程相比线程,轻量在哪?-LMLPHP
03-15 15:39