Concept:
线程是CPU使用的基本单元,由线程ID、程序计数器、寄存器集合和栈组成。
线程共享代码段、数据段、和其他操作系统资源
- Process: Ownership of memory, files, other resources
- Thread: Unit of execution we use to dispatch
进程是资源的拥有者,线程是程序的执行者
Benefits:
- Responsiveness(响应度高):即使部分阻塞或执行较冗长的操作,该程序仍能继续执行
- Resource Sharing(资源共享):线程默认共享它们所属进程的内存和资源
- Economy(经济):进程创建所需要的内存和资源的分配比较昂贵,线程能共享它们所属进程的资源
- Utilization of MP Architectures(多处理器体系结构的利用):不管有多少CPU,单线程进程只能运行在一个CPU上。在多CPU上使用多线程加强了并发功能
Multithreading Models(多线程模型)
User and Kernel Threads
- User Threads: Thread management done by user-level threads library in user space
- Kernel threads: Threads directly supported by the kernel
Many-to-One(多对一模型)
多对一模型将许多用户级线程映射到一个内核线程,线程管理是由线程库在用户空间进行的,因此效率比较高。但是如果一个线程执行阻塞了系统调用,那么整个进程会阻塞。而且,任何时候只有一个线程能够访问内核,多个线程不能并行运行在多处理器上。
One-to-One(一对一模型)
一对一模型将每个用户线程映射到一个内核线程。当一个线程执行阻塞系统调用时,能允许另一个线程继续执行,也能够并行运行在多处理器系统上。但是每创建一个用户线程就需要创建一个相应的内盒线程,开销大,也就限制了线程数量。
Many-to-Many(多对多模型)
多对多模型允许将多个用户线程映射到多个内核线程,同时能够创建足够多的内核线程。
Two-level Model(二级模型)
Thread Pools(线程池)
线程池的主要思想是在进程开始时创建一定数量的线程,并放到池中等待工作。当服务器收到请求时,它会唤醒池中的一个线程(如果有可用的线程),并将要处理的请求传递给它。一旦线程完成了服务,它会返回到池中等待工作。如果池中没有可用的线程,那么服务器会一直等待直到有空线程为止。
线程池具有如下有点:
- 通常用现有线程处理请求要比等待创建新的线程快
- 线程池限制了在任何时候可用线程的数量。这对那些不能支持大量并发线程的系统非常重要
Thread Specific Data(线程特定数据)
一个进程的线程共享进程数据,但是,某些情况下每个线程可能需要拥有自己一些数据的副本,这种数据称为线程特定数据,在我们区别一个进程中的某个线程时尤其有效