在进行比较之前,让我们首先了解什么是线程。 线程是独立进程域内的轻量级进程。 之所以需要它们,是因为过程繁重,消耗大量资源,更重要的是,
两个单独的进程不能共享内存空间。
假设您打开一个文本编辑器。 它是在内存中执行的具有独立可寻址位置的独立进程。 在此过程中,您将需要许多资源,例如插入图形,拼写检查等。为每种功能创建单独的过程并在内存中独立维护它们是不可行的。 为了避免这种情况,
可以在一个进程中创建多个线程,这可以 共享一个进程中独立存在的公用内存空间。
现在,一次回到您的问题。
我不太确定用户级线程和内核级线程之间的区别。
线程根据其执行域大致分为用户级线程和内核级线程。 在某些情况下,一个或多个用户线程映射到一个或多个内核线程。
-用户级线程
用户级线程通常位于应用程序级,在此应用程序创建这些线程以维持其在主内存中的执行。 除非需要,否则这些线程与内核线程隔离工作。
因为它们不必引用许多寄存器,并且上下文切换比内核级线程快得多,所以它们更易于创建。
用户级别的线程通常会导致应用程序级别的更改,而内核级别的线程将继续以自己的速度执行。
-内核级线程
这些线程大部分独立于正在进行的进程,并由操作系统执行。
操作系统需要这些线程来执行诸如内存管理,进程管理等任务。
由于这些线程维护,执行和报告操作系统所需的进程; 内核级线程的创建和管理成本更高,并且这些线程的上下文切换很慢。
大多数内核级线程不能被用户级线程抢占。
MS DOS written for Intel 8088 didn't have dual mode of operation. Thus, a user level process had the ability to corrupt the entire operating system.
-映射到内核线程上的用户级线程
这也许是最有趣的部分。 许多用户级线程映射到内核级线程,内核级线程又与内核进行通信。
一些重要的映射是:
一对一
当一个用户级线程仅映射到一个内核线程时。
优点:每个用户线程都映射到一个内核线程。 即使用户线程之一发出阻止的系统调用,其他进程也不会受到影响。
缺点:每个用户线程都需要一个内核线程进行交互,并且内核线程的创建和管理成本很高。
多对一
当许多用户线程映射到一个内核线程时。
优点:因为可以将相似的用户线程映射到一个内核线程,所以不需要多个内核线程。
缺点:即使一个用户线程发出了阻塞的系统调用,映射到该内核线程的所有其他用户线程也会被阻塞。
另外,由于内核一次仅处理一个内核线程,因此无法实现良好的并发水平。
多对多
当许多用户线程映射到等于或更少数量的内核线程时。 程序员决定将多少个用户线程映射到多少个内核线程。 一些用户线程可能仅映射到一个内核线程。
优点:实现了高水平的并发。 程序员可以确定一些潜在危险的线程,这些线程可能发出阻塞的系统调用,并将它们与一对一映射放置在一起。
缺点:如果不谨慎决定内核线程的数量,可能会减慢系统速度。
您问题的另一部分:
内核支持的线程可以访问内核以进行系统调用 以及用户级线程无法使用的其他用途。
那么,用户级线程仅仅是程序员创建的线程吗? 然后利用内核支持的线程来执行 由于其状态而无法正常执行?
部分正确。 由于内核线程负责执行OS的进程,因此几乎所有内核线程都可以访问系统调用和其他关键中断。 用户线程将无法访问其中一些关键功能。 例如 文本编辑器永远无法拍摄能够更改进程物理地址的线程。 但是,如果需要,用户线程可以映射到内核线程,并发出一些作为独立实体无法执行的系统调用。 然后,内核线程将该系统调用映射到内核,并在认为合适的情况下执行操作。