Answers:
多任务操作系统内核的作用之一是调度:确定何时执行哪个执行线程。因此,这样的内核具有线程或进程的概念。线程是正在执行的顺序代码,具有自己的堆栈,有时还有其他数据。在操作系统上下文中,人们通常使用进程来表示具有自己的内存空间的线程,并使用线程来表示与其他线程共享其内存空间的线程。一个进程可以具有一个或多个线程。
某些操作系统(例如,较旧的unix系统)仅提供进程:内核管理的每个线程都有自己的内存空间。其他操作系统(例如,大多数现代的UNIX系统)允许进程包含多个执行线程:它们提供了内核级的线程概念。
进程也可以管理自己的线程。在协作多线程中,每个线程的代码都包含切换到另一个线程的指令。在抢占式多线程中,进程从内核请求周期性的异步通知,并通过切换到其他线程来对这些通知做出反应。这样,在用户级别的库中,无需内核合作即可实现多线程。
系统可以同时提供内核级和用户级线程。这就是所谓的混合线程。
用户级和内核级线程各有其优点和缺点。用户级线程之间的切换通常更快,因为不需要重置内存保护即可切换到内核内调度程序,而无需再次切换回该进程。对于使用大量非常短命的线程的大规模并发系统(例如某些高级语言(尤其是Erlang)及其绿色线程),这尤其重要。用户级线程需要较少的内核支持,这可以使内核更简单。内核级线程允许一个线程运行,而同一进程中的另一个线程在系统调用中被阻塞; 具有用户级线程的进程必须注意不要阻塞系统调用,因为它们会阻塞进程的所有线程。内核级线程可以在多处理器计算机上同时运行,而纯粹的用户级线程则无法实现。
将内核级线程视为“ 虚拟处理器 ”,而将用户级线程视为简单线程(现在就这样称呼它们)。现在,要执行的线程已经分配给处理器了吗?因此,每个线程都分配给一个虚拟处理器,以便可以执行它。
这是事实
创建一个新的虚拟处理器有点昂贵。(内核必须在线程控制块中创建一个条目,分配堆栈等。)
与创建新的虚拟处理器相比,创建线程非常简单。应用程序开发人员可以使用编程语言提供的线程库创建线程,并在用户空间中进行管理。并且不同的语言实现了多线程以不同的方式。
如果将线程映射到单个虚拟处理器,则必须注意不要在任何一个线程中进行阻塞的系统调用,因为其他线程不能再同时运行。
如果可以创建更多的虚拟处理器,则可以克服此限制。现在,线程可以并发运行(如果存在多个真实处理器,则可以并行运行)。一个线程不会影响映射到其他虚拟处理器上的其他线程。
在后一种模型中,可以将一个或多个线程映射到虚拟处理器上。
以上模型分别命名为“多对一”,“一对一”和“多对多”。
Referenes:Galvin等人的操作系统概念。主题:线程->多线程模型