1、什么是线程?
资源管理的基本单元:进程;系统调度的基本单元:线程。线程被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。
一个进程在某一个时刻只能做一件事情,有了多个控制线程以后,在程序的设计成在某一个时刻能够做不止一件事,每个线程处理独自的任务。
需要注意的是:即使程序运行在单核处理器上,也能够得到多线程编程模型的好处。处理器的数量并不影响程序结构,所以不管处理器个数多少,程序都可以通过线程得以简化。
linux操作系统使用符合POSIX线程作为系统标准线程,该POSIX线程标准定义了一整套操作线程的API。
2、线程的优缺点?
优点:
创建一个新线程的代价要比创建一个新进程小的多
线程之间的切换相较于进程之间的切换需要操作系统做的工作很少
线程占用的资源要比进程少很多
能充分利用多处理器的可并行数量
等待慢速 IO操作结束以后,程序可以执行其他的计算任务
计算(CPU)密集型应用,为了能在多处理器系统上运行,将计算分解到多个线程中实现
IO密集型应用,为了提高性能,将IO操作重叠,线程可以等待不同的IO操作。
缺点:
性能损失( 一个计算密集型线程是很少被外部事件阻塞的,无法和其他线程共享同一个处理器,当计算密集型的线程的数量比可用的处理器多,那么就有可能有很大的性能损失,这里的性能损失是指增加了额外的同步和调度开销,二可用资源不变。)
健壮性降低(线程之间是缺乏保护性的。在一个多线程程序里,因为时间上分配的细微差距或者是共享了一些不应该共享的变量而造成不良影响的可能影响是很大的。)
缺乏访问控制( 因为进程是访问控制的基本粒度,在一个线程中调用某些OS函数会对整个进程造成影响 。)
编程难度提高(编写和 调试一个多线程程序比单线程困难的多)
3、进程与线程的区别
进程的定义:进程是为了描述程序在并发执行时对系统资源的共享,所需的一个描述程序执行时动态特征的概念。进程是具有独立功能的程序关于某个数据集合上的一次运行活动,是系统进行资源分配、调度和保护的独立单位。
线程的定义:线程也成为轻量级进程,是进程中的一个运行实体,作为CPU的调度单位。一个进程由多个线程组成,线程与同属一个进程的其他的线程共享进程所拥有的全部资源。
同一进程内的所有线程除了共享全局变量外还共享:
- 进程指令;
- 大多数数据;
- 打开的文件(即描述符);
- 信号处理函数和信号处置;
- 当前工作目录;
- 用户ID和组ID。
每个线程拥有各自的:
- 线程ID;
- 寄存器集合,包括程序计数器和栈指针;
- 栈(用于存放局部变量和返回地址);
- errno;
- 信号掩码;
- 优先级。
结构上的不同可以让我们更加了解进程和线程的相异之处:
(1)进程是资源分配的基本单位;线程与资源分配无关,它属于某一个进程,并与进程内的其他线程共享进程的资源。
(2)当进程发生调度时,不同的进程拥有不同的虚拟地址空间,而同一进程内的不同线程共享同一地址空间。
(3)线程只由先关堆栈(系统栈或用户栈)寄存器和线程控制块组成。寄存器用来存储线程内的局部变量,但不能存储其他线程的相关变量。
(4)进程切换时涉及有关资源指针的保存和地址空间的变化;线程切换时,由于处于同一进程内,所以不涉及资源信息的保存和地址空间的变化,从而减少了操作系统的时间开销。