一般我们在运行用户程序时,执行的都是用户态线程,当需要系统调用时(I/O操作),则会靠内核从用户态进行模式切换到内核态,至于下一步会不会切换到内核态线程,就取决于用户程序为什么要切换到内核态了。
先声明,内核态线程是例如 watchdog:看门狗线程用于监控系统中的硬件或软件组件的运行状态,并在发现异常时采取相应措施,如重启或报告错误。
因此内核态线程就是实实在在的线程,通常都是用来维护系统正常运行的线程。
用户态线程:
优点-轻量性:用户态线程由用户程序创建、同步、调度和管理。因此说用户态线程创建、销毁和切换的开销较小,不涉及内核态的切换。
优点-跨平台:用户态线程能够实现跨平台的,通常可以在不同的操作系统上运行。只要用户程序是使用了特定的线程库(如POSIX)提供的API来创建、同步、调度和管理线程。
缺点-调度与并行问题:用户态线程的管理对操作系统内核而言是不可见的。用户态线程的调度需要用户程序的线程库做中转,最终被处理器执行还得靠操作系统的调度。因此当用户态线程只与一个内核态线程关联时,无法充分利用多核CPU的性能。
缺点-阻塞问题:当被处理器调度的某一线程需要进行阻塞操作时,整个进程将被标记为阻塞状态。而这将导致进程内的其他线程无法被调度。
内核态线程:
优点-权限高:内核态线程由内核负责创建、调度、同步和销毁,能够执行与内核相关的任务,拥有较高的权限,能够执行与内核相关的任务。
优点-真正的并行性:内核可以同时把同一个进程中的多个内核态线程调度到多个处理器中,实现真正的并行执行。
缺点-开销大:创建、销毁、和切换都需要内核的介入。因此开销较大。