什么是线程:
在一个程序里的一个执行路线就叫做线程。更准确的定义是:线程是“一个进程内部的控制序列”。
一切进程至少都有一个执行线程。
程序:
完成特定功能的一系列有序指令的集合。
可执行文件
代码段+数据段
进程:
程序的一次执行过程。
代码段+数据段+堆栈段+PCB
进程与线程:
进程是资源竞争的基本单位。
线程是程序执行的最小单位。
线程是共享进程数据,但也拥有一部分数据。
fork和创建新线程的区别:
当一个线程执行一个fork调用的时候,会创建出进程的一个新拷贝,新进程将拥有它自己的变量和它自己的PID。这个新进程的运行时间是独立的,他在执行时几乎完全独立于创建它的进程。
在进程里创建一个新线程的时候,新的执行线程会拥有自己的堆栈(因此也就有自己的局部变量),但要与它的创建者共享 局部变量、文件描述符、信号处理器和当前的工作目录状态。
线程的优点:
创建新一个线程的代价要比创建一个新进程小得多。
与进程之间的切换相比,线程之间的切换需要操作系统做的工作要少得多。
线程占用的资源要比进程少得多。
能充分利用多处理器的可并行数量。
在等待慢速I/O操作结束的同时,程序可执行其他的计算任务。
计算密集型应用,为了能在多处理系统上运行,将计算分解到多个线程中实现。
I/O密集型应用,为了提高性能,将I/O操作重置。线程可以同时等待不同的I/O操作。
线程的缺点:
性能损失:
一个很少被外部事件阻塞的计算密集型线程往往无法与共它进程共享一个处理器。如果计算密集型线程的数量比可用的处理器多,那么可能会有较大的性能损失。这里的性能损失指的是增加了额外的同步和调度开销,而可用的资源不变。
健壮性降低:
编写多线程需要更全面更深入的考虑,在一个多线程程序里,因时间分配上细微偏差或者因共享了不该共享的变量而造成不良影响的可能性是很大的,换句话说线程之间是缺乏保护的。
缺乏访问控制:
进程是访问控制的基本粒度,在一个线程中调用某些OS函数会对整个进程的影响。
编程难度提高:
编写与调试一个多线程程序比单线程程序难得多。
线程调度竞争范围:
操作系统提供了各种模型,用来调度应用程序创建的线程。这些模型之间的主要不同是:在竞争系统资源(特别是CPU时间)时,线程调度竞争范围不一样。
进程竞争范围:
各个线程在同一个进程竞争“被调度的CPU时间”(但不直接和其他进程中的线程竞争)。
系统进程范围:
线程直接和“系统范围”内的其他线程竞争。