【操作系统】线程
进程用于把资源集中到一起。也就是资源管理的单位,而线程则是在CPU上被调度运行的实体。线程概念试图实现的是。共享一组资源的多个线程的运行能力,以便这些线程能够为完毕某一任务而共同工作。在有了多进程的情况下。还须要多线程的原因有下面几点:
- 同一进程中的多个线程执行在同样的地址空间并共享全部可用数据,而进程则在互不同样的地址空间中。
- 线程比进程更轻量级。创建和撤销也更快。
- 使得多个不同操作的线程能够重叠进行。
比如一个线程占用CPU,还有一个处理I/O。
- 使得在多CPU环境下,真正的并行成为可能。
使用多线程的一个典型的样例是Webserver。
一个server进程分为多个线程:一个分派线程和多个工作线程。当client的请求到达时,分配线程选择一个工作线程对处理进行对应。
工作线程从Web页面快速缓存直接返回响应或从磁盘调取Web页面(I/O操作)。
在这个过程中。分派线程是能够继续接受来自client的请求并选择还有一个工作线程进行响应的,工作线程进行的耗时的I/O操作并没有影响整个server的性能。这个样例使用多线程不仅由于其并行性。并且其Web页面快速缓存是被这些线程所共享的,而多个进程是无法实现这种共享的。
假设一个程序须要进行:读—处理—写这三个步骤时。使用多线程分别完毕三个阶段的工作是非常有优势的。
线程模型
因为线程具有进程的某些性质,全部有时被称为轻量级进程。
多进程和多线程的形象表演示样例如以下图所看到的:
a中的三个进程执行在不同的地址空间,而b中的三个线程则执行在同样的地址空间。对多进程和多线程的选择往往要依据实际情况。当三个任务不须要不论什么关联的时候。选择a中的多线程;当三个任务之间相互协作、关系密切时,则使用b中的多线程。
每一个线程都有自己的堆栈。
由于每一个线程都有一系列的函数调用。这些调用所要保存的信息应该是彼此分离地存放在每一个线程相应的堆栈中的。这使得不同的线程有各自不同的运行历史,例如以下图所看到的:
用户空间线程
整个线程都在在用户空间中执行,内核对线程包一无所知。内核仅仅是将它视为单线程进程。这些线程由执行时系统管理。执行时系统是一个管理线程的函数集合,比如:pthread_create等函数接口。一个进程中包括一个线程表,用于跟踪本进程内的线程状态,线程表由执行时系统管理。线程间的调度是通过执行时系统来管理的。执行时系统总是选择自己进程中的线程进行切换。
用户空间线程例如以下图所看到的:
内核空间线程
在内核空间的线程不再须要执行时系统,每一个进程中也无需线程表。一个记录系统中全部线程的线程表放在内核中。线程的创建或销毁都是通过系统调用并改动线程表来完毕的。线程间的调度由内核来负责,不同于执行时系统。内核会在全部线程范围内选择下一个执行的线程,而不仅仅是局限于某一个进程。线程的每一次堵塞都要通过系统调用陷入内核才干完毕,从而增大了内核空间线程的开销。内核空间线程例如以下图所看到的:
參考:
《现代操作系统》 P53-P62.