用户线程与内核线程

空间类型

用户空间

用于执行用户代码, 如计算,循环等非I/O相关代码。

内核空间

用于执行系统级的代码,如调度线程、处理I/O等。可通过时间片耗尽中断(以及其他类型的中断)或用户空间的程序主动调用systemcall进行空间之间的切换。

线程

一般进程由若干个线程组成,而所有的线程组成了进程的流程。线程拥有自己的PC、寄存器以及栈,但是进程中的所有线程共享了同一个代码和数据片段,以及打开的文件。

线程与进程的区别

S.N. Process Thread
1 Process is heavy weight or resource intensive. Thread is light weight, taking lesser resources than a process.
2 Process switching needs interaction with operating system. Thread switching does not need to interact with operating system.
3 In multiple processing environments, each process executes the same code but has its own memory and file resources. All threads can share same set of open files, child processes.
4 If one process is blocked, then no other process can execute until the first process is unblocked. While one thread is blocked and waiting, a second thread in the same task can run.
5 Multiple processes without using threads use more resources. Multiple threaded processes use fewer resources.
6 In multiple processes each process operates independently of the others. One thread can read, write or change another thread’s data.

线程的优势

  1. 上下文切换的代价较少
  2. 线程充分发挥了处理器的并行处理能力
  3. 线程间的通讯更加便捷
  4. 相对于进程来说,创建和切换线程代价更小
  5. 在多处理器的环境下,os的任务调度器能够把线程适当分配到不同的处理器上,充分发挥多处理器的平行处理能力

线程类型

用户空间线程

顾名思义,这种线程由用户进行管理并运行于用户空间中,对于内核中的线程管理程序来说,这种线程是不可见的。 由于线程的创建、销毁、切换以及数据的共享都在用户空间中因此这种线程比较轻量。

优势
  1. 该线程的切换不需要进入内核空间
  2. 该种线程可运行在不支持系统级线程的OS中
  3. 该线程的调度可由用户程序决定
  4. 该线程的创建和管理都较为轻量
劣势
  1. 由于内核不知道用户线程的存在,因此当线程阻塞会导致线程所属的进程阻塞,从而导致整个线程组阻塞
  2. 任务调度器只会分配单个处理器给用户进程,因此该用线程组无法充分利用多处理器进行并行处理。

内核空间线程

程序还可以通过系统调用来创建内核空间线程。在这中模式下,由于线程交由内核管理,因此在用户程序中并不需要管理线程的相关代码。
内核此时负责管理的上下文不仅包括了进程还有进程中的所有线程。此时任务调度会基于线程进行。

优势

  1. 任务调度器基于内核线程调度,可充分利用多处理器的并行处理优势。
  2. 若线程阻塞,调度器会把处理器分配给同一进程中的其他线程,而不是阻塞整个线程组。

劣势

  1. 该种线程线程的创建较用户线程慢
  2. 该种线程的切换(调度)需要陷入到内核中。例如,用户空间执行某段流程(正在执行的线程)是触发I/O,需要进入内核把线程换出,并把就绪的线程换入,最后返回用户空间。

线程模型

多对多

多个用户空间线程对应小于或等于户空间线程数的内核空间线程。

特点

由于内核线程和被分配到多个处理器上执行,因而能够充分利用多处理器的优势。虽然用户线程阻塞时会导致对应的内核线程阻塞,但是被阻塞的内核线程对应的其他用户线程可以切换到其他的内核线程上继续运行

p.s Golang使用了这种多线程模型

多对一

多个用户空间线程对应一个内核空间线程。

特点

不能充分发挥多处理器的优势

一对一

一个用户空间线程对应一个内核空间线程。

特点

创建一个用户线程等于创建一个内核线程,虽说能充分利用多处理器的优势,但当线程数量大时上下文切换会成为负担。

对比

S.N. User-Level Threads Kernel-Level Thread
1 User-level threads are faster to create and manage. Kernel-level threads are slower to create and manage.
2 Implementation is by a thread library at the user level. Operating system supports creation of Kernel threads.
3 User-level thread is generic and can run on any operating system. Kernel-level thread is specific to the operating system.
4 Multi-threaded applications cannot take advantage of multiprocessing. Kernel routines themselves can be multithreaded.
5 Without limitation of quantity Usually with limitaion of quantity

你可能感兴趣的:(操作系统,操作系统)