4.1 线程
每个线程是cpu使用的一个基本单元,它包括线程ID、程序计数器、寄存器组和堆栈。它与同一进程的其他线程共享代码段、数据段和其他操作系统资源。
多线程编程的优点:响应性、资源共享、经济、可伸缩性。
4.2 多核编程
对于单核系统,并发仅意味着线程随着时间交替执行,因为处理核只能同一时间执行单个线程。
对于多核系统,并发表示线程能够并行运行,因为系统可以给每个核分配一个单独的线程。
并行性和并发性的区别:
并行系统可以同时执行多个任务,并发系统支持多个任务,允许所有任务都取得进展。没有并行,并发也是可能的。
4.3 多线程模型
通过用户线程和内核线程来提供线程支持。用户线程位于内核线程之上,它的管理无需内核支持,而内核线程由操作系统来直接支持与管理。
多对一模型
映射多个用户线程到一个内核线程。
线程管理由用户控件的线程库来完成,因此效率高。但一个线程执行阻塞系统调用,那么整个进程将会阻塞。任一时间只有一个线程可以访问内核,所以多个线程不能并行运行在多处理核系统上。
一对一模型
映射每个用户线程到一个内核线程。
一个线程执行阻塞系统时,允许另一个线程继续执行,同时也允许多线程并行运行在多核系统上。唯一的缺点是创建一个用户线程就要创建一个内核线程,由于创建内核线程的开销会影响应用程序的性能,所以这种模型的大多数限制了系统支持的线程数量。
多对多模型
多路复用多个用户线程到同样数量或更少的内核线程。
可以创建任意多的用户线程,并且在多核系统上并行执行。当一个线程执行阻塞系统调用时,内核可以调度另一个线程来执行。
4.4 线程库
线程库为程序员提供创建和管理线程的API。
4.5 隐式多线程
将多线程的创建和管理交给编译器和运行时库来完成,这种策略叫隐式线程。
4.5.1 线程池
思想:在进程开始时创建一定数量的线程,并且加到池中等待工作,当收到请求时,会唤醒池中的一个可用线程,一旦线程完成了任务,它会返回池中等待工作。如果迟中没有可用线程,那么会等待直到有空线程为止。