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