1、什么是线程?
简单来说,我们知道一个进程就是一段程序的执行,但是一段程序可以实现很多功能,而我们可以简单的认为,每一个功能就是一个线程,线程就是进程内执行的任务。一个进程内部可以有很多的线程。线程是CPU使用的基本单元,它由线程ID、程序计数器、寄存器集合和栈组成。它与属于同一进程的其他线程共享代码段、数据段和其他操作系统资源。
2、多线程的优点;
(1)响应度高:如果对一个交互程序采用多线程,即使有部分线程阻塞或执行冗长的操作,该程序也能继续执行,从而增加对用户的相应程度
(2)资源共享:多线程默认共享他们所属进程的内存和资源
(3)经济:进程创建所需要的内存和资源的分配比较昂贵,由于线程能够共享他们的进程的资源,所以创建线程比进程经济;
(4)多处理器体系结构的利用:多线程的优点是充分利用多处理器体系结构,以便每个进程能够并行运行在不同的处理器上。
3、多线程的模型:
有两种不同的方式来提供线程支持:用户层的用户线程和内核层的内核线程,根绝内核线程和用户线程的对应关系,多线程的模型可以分为三种:
(1)多对一模型:
就是将多用户线程映射到一个内核线程,线程管理是在用户空间进行的,因而效率比较高,但是如果一个线程阻塞,那么整个进程就会阻塞,因为任意时刻只有一个线程访问内核,所以多个线程并不能运行在多处理器上;
(2)一对一模型:
将每个用户线程映射到一个内核线程上,该模型在一个线程执行阻塞系统调用时,能允许另一个线程继续执行,所以效率比多对一模型高;
(3)多对多模型:
允许多个用户线程复用一个内核线程,也允许一个用户线程专用一个内核线程,这称为“二级模型”,效率比上面两种模型都高,但是相对的,实现也更加困难。
4、多线程的问题:
(1)fork()和exec()函数问题
unix系统有两种形式的fork(),一种是复制所有的线程,另外一种是只复制调用了系统fork()函数的线程。
调用了exec()函数之后,exec()参数指定的程序会替换整个进程。
(2)线程取消:
要取消的线程我们成为目标线程,主要由两种方式:
(1)异步取消:一个线程立即终止目标线程
(2)延迟取消:目标线程不断检查它是都应终止,这允许目标线程有机会以有序方式来终止自己。