线程的概念
那么什么是线程呢?
百度百科是这样介绍的:
线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元。一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。另外,线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。由于线程之间的相互制约,致使线程在运行中呈现出间断性。线程也有就绪、阻塞和运行三种基本状态。就绪状态是指线程具备运行的所有条件,逻辑上可以运行,在等待处理机;运行状态是指线程占有处理机正在运行;阻塞状态是指线程在等待一个事件(如某个信号量),逻辑上不可执行。每一个程序都至少有一个线程,若程序只有一个线程,那就是程序本身。
我们可以总结出来以下几个要点:
- 在一个程序里的一个执行路线叫做一个线程(thread)。更准确的说,线程“是一个进程内部的控制序列”
- 一切进程至少有一个执行线程
值得注意的是我们不要讲进程与线程的概念混淆,线程和进程具体有一下几点不同:
- 进程是资源竞争的基本单位
- 线程是程序执行的最小单位
- 线程共享进程数据但也拥有自己的一部分必不可少的资源:
1.线程ID 2.一组寄存器 3.栈 4.errno 5.信号屏蔽字 6.调度优先级
换句话说线程具有独立的上下文和私有的栈结构。
前面我们说多个线程可以共享进程的数据,具体有哪些呢?
- Text Segment 和 Data Segment都是共享的,如果定义一个函数在各线程中都可以调用。如果定义一个全局变量,在各线程中都可以访问到。
- 文件描述符
- 信号的处理方式
- 当前工作目录
- 用户id和组id
至此,我们可以总结出线程的优缺点:
优点:
- 创建一个新线程的代价要比创建一个新进程小的多
- 与进程之间的切换相比,线程之间的切换操作系统的负担小的多
- 线程占用的而资源少的多
- 充分利用多处理器的可并行数量
- 在等待慢速I/O操作时,程序可以执行其他的计算任务
- 计算密集型应用,为了能在多处理器系统上运行,将计算分解到多个线程中实现
- I/O密集型应用,为了提高性能,将I/O操作重叠。线程可以同时等待不同的I/O操作。
缺点:
- 性能损失:如果计算密集型线程数量比可用处理器数量多,那么可能会有较大的性能损失。这里的性能损失指的是增加了额外的同步和调度开销,而可用的资源不变。
- 健壮性降低:线程是缺乏保护的。
- 缺乏访问控制:进程是访问控制的基本粒度,在一个线程中调用某些OS函数会对整个进程造成影响。
- 编程难度高
以上是关于线程的基本介绍,关于线程控制的问题可以参考我的博客: