一. 什么是线程
在一个程序里的一个执行路线就叫做线程(thread).更准确的定义是:线程是"一个进程内部的控制序列"
一切进程至少都有一个执行线程.
二. 进程与线程
进程是资源竞争的基本单位
线程是程序执行的对小单位
线程共享进程数据,但也拥有自己的一部分数据
线程ID
一组寄存器
栈
errno
信号状态
优先级
三. fork 和创建新线程的区别
当一个进程执行一个fork调用的时候,会创建出进程的一个新拷贝,新进程将拥有它自己的变量和它的自己的PID.
这个新进程的运行时间是独立,它在执行时几乎完全独立创建它的进程.
在进程里面创建一个新线程的时候,新的执行线程会拥有自己的堆栈(因此也就有自己的局部变量),但要与它的创建者共享全局变量,文件描述符,信号处理器和当前的工作目录状态.
四. 线程的优点
(1) 创建一个新线程的代价要比创建一个新进程小的多
(2) 与进程之间的切换相比,线程之间的切换需要操作系统做的工作要少的多
(3) 线程占用的资源要比进程少的多
(4) 能充分利用多处理器的可并行数量
(5) 在等待慢速I/O操作结束的同时,程序可执行其他的计算任务.
(6) 计算密集型应用,为了能在多处理器系统上运行,将计算分解到多个线程中实现.
(7) I/O密集型应用,为了提高性能,将I/O操作重叠.线程可以同时等待不同的I/O操作.
五. 线程的缺点
(1)等候使用共享资源时造成程序的运行速度变慢。这些共享资源主要是独占性的资源 ,如打印机等。
(2)对线程进行管理要求额外的 CPU开销。线程的使用会给系统带来上下文切换的额外负担。当这种负担超过一定程度时,多线程的特点主要表现在其缺点上,比如用独立的线程来更新数组内每个元素。
(3)线程的死锁。即较长时间的等待或资源竞争以及死锁等多线程症状。
(4)对公有变量的同时读或写。当多个线程需要对公有变量进行写操作时,后一个线程往往会修改掉前一个线程存放的数据,从而使前一个线程的参数被修改;另外 ,当公用变量的读写操作是非原子性时,在不同的机器上,中断时间的不确定性,会导致数据在一个线程内的操作产生错误,从而产生莫名其妙的错误,而这种错误是程序员无法预知的。
六: 三种线程模型
N:1 用户线程模型
1:1 核心线程模型
N:M 混合线程模型
在一个程序里的一个执行路线就叫做线程(thread).更准确的定义是:线程是"一个进程内部的控制序列"
一切进程至少都有一个执行线程.
二. 进程与线程
进程是资源竞争的基本单位
线程是程序执行的对小单位
线程共享进程数据,但也拥有自己的一部分数据
线程ID
一组寄存器
栈
errno
信号状态
优先级
三. fork 和创建新线程的区别
当一个进程执行一个fork调用的时候,会创建出进程的一个新拷贝,新进程将拥有它自己的变量和它的自己的PID.
这个新进程的运行时间是独立,它在执行时几乎完全独立创建它的进程.
在进程里面创建一个新线程的时候,新的执行线程会拥有自己的堆栈(因此也就有自己的局部变量),但要与它的创建者共享全局变量,文件描述符,信号处理器和当前的工作目录状态.
四. 线程的优点
(1) 创建一个新线程的代价要比创建一个新进程小的多
(2) 与进程之间的切换相比,线程之间的切换需要操作系统做的工作要少的多
(3) 线程占用的资源要比进程少的多
(4) 能充分利用多处理器的可并行数量
(5) 在等待慢速I/O操作结束的同时,程序可执行其他的计算任务.
(6) 计算密集型应用,为了能在多处理器系统上运行,将计算分解到多个线程中实现.
(7) I/O密集型应用,为了提高性能,将I/O操作重叠.线程可以同时等待不同的I/O操作.
五. 线程的缺点
(1)等候使用共享资源时造成程序的运行速度变慢。这些共享资源主要是独占性的资源 ,如打印机等。
(2)对线程进行管理要求额外的 CPU开销。线程的使用会给系统带来上下文切换的额外负担。当这种负担超过一定程度时,多线程的特点主要表现在其缺点上,比如用独立的线程来更新数组内每个元素。
(3)线程的死锁。即较长时间的等待或资源竞争以及死锁等多线程症状。
(4)对公有变量的同时读或写。当多个线程需要对公有变量进行写操作时,后一个线程往往会修改掉前一个线程存放的数据,从而使前一个线程的参数被修改;另外 ,当公用变量的读写操作是非原子性时,在不同的机器上,中断时间的不确定性,会导致数据在一个线程内的操作产生错误,从而产生莫名其妙的错误,而这种错误是程序员无法预知的。
六: 三种线程模型
N:1 用户线程模型
1:1 核心线程模型
N:M 混合线程模型
(1)N:1 用户线程模型
"线程实现"建立在"进程控制"机制之上,由用户空间的程序库来管理. OS内核完全不知道线程信息.这些线程称为用户空间线程这些线程工作在"进程竞争范围"
在N:1线程模型中,内核不干涉线程的任何生命活动,也不干涉同一进程中的线程环境切换.
在N:1线程模型中,一个进程中的多个线程只能调度到一个CPU,这种约束限制了可用的并行总量.
第二个缺点是如果某个线程执行了一个"阻塞式"操作(如read),那么,进程中的所有线程都会阻塞,直至那个操作结束.为此,一些线程的实现是为这些阻塞式函数提供包装器,用非阻塞版本替换这些系统调用,以消除这种限制.
(2)1:1 核心线程模型
在1:1 核心线程模型中,应用程序创建的每一个线程都由一个核心线程直接管理
OS内核将每一个核心线程都调用到系统CPU上,因此,所有线程都工作在"系统竞争范围".
这种线程的创建与调度由内核完成,因为这种线程的系统开销比较大(但一般比进程开销小)
(3)N:M 混合线程模型
N:M混合线程模型提供了两级控制,将用户线程映射为系统的可调度以实现并行,这个可调度称为轻量级进程(LWP:light weight process),LWP 再一一映射到核心线程.