1.概述
每个线程是CPU使用的一个基本单元,包括线程ID、程序计数器、寄存器组和堆栈。
传统单线程:
多线程进程:
2.动机
在某些情况下,单个应用程序可能需要执行多个类似的任务。例如,一个Web服务器接受有关网页、图像、声音等的客户请求。一个繁忙的Web可能有多个用户并发访问它。如果一个Web服务器作为单个线程的传统进程来执行,那么只能一次处理一个请求,这样客户需要等待很长时间。一种解决方法是让服务器作为单个进程运行,以便接受请求。当服务器收到请求时,它会创建一个进程以便处理请求,但是创建进程很耗费时间和资源。如果新进程与原进程执行同样的任务,为什么要承担这些开销呢?通常,使用一个包含多个线程的进程更加有效。如果服务器是多线程的,那么可以创建一个单独的线程,以便监听客户需要。
3.优点
- 提高程序的响应速度。在多线程程序中,可以将一个耗时的任务放在一个线程中执行,另一个线程可以执行其他任务,从而提高了程序的响应速度。
- 提高系统的资源利用率,在多线程程序中,多个线程可以共享计算机的资源,如CPU、内存、硬盘等,提高了系统的资源利用率。
- 线程的创建更加经济,线程创建所需内存和资源比进程的创建要少很多,而且线程间的切换也更加迅速
- 对于多核CPU,多线程可以在多核上并行运行。
4.多核编程
大体意思就是不是CPU的核越多越好,一个程序中串行代码,和并行代码,如下:
a=b+1;
c=a*c;//c的处理要等到a计算完成
————————————————————————————————————
a=3;
c=4;//并行算法,两个可以并发执行
代码中如果串行代码较多,代码要等到其需要的过程执行完成,才能进行下一步。即使有再多的核,也需要“排队执行”。
Amdahl定律:
5.多线程模型
有两种不同的方法来支持线程,一种是用户层的用户线程、一种是内核层的内核线程。用户线程位于内核之上,它的管理不需要内核支持,而内核线程由操作系统直接支持与管理。
5.1多对一模型
映射多个用户线程到一个内核线程。线程管理是由用户空间的线程库来完成的,因此效率较高。但是如果一个线程执行阻塞系统调用,那么整个线程将会阻塞。再者因为一个时间只有一个线程可以访问内核,所以多个线程不能在多核系统上并行运行。
5.2一对一模型
映射每个用户线程到一个内核线程,一个线程阻塞时另一个线程可以继续执行,有更好的并发性,也允许多个线程并行地在处理器上运行。唯一缺点是每创建一个用户线程就要创建一个相应的内核线程,由于创建系统线程的开销可能会影响程序性能,所以大多数模型限制了支持线程数量。
5.3多对多模型
实现难度高,需要根据用户和程序来创建线程。
6.线程池
在进程开始时创建一定数量的线程,并加到池中等待工作(若每请求一次创建一次,耗费时间太多)。当服务器收到请求时,它会唤醒池内的一个线程,并将需要的服务传递给它。