线程
线程(轻型进程lightweight process, LWP )是进程中的一个运行实体,是CPU的调度单位,包括:
◦ 线程ID
◦ 程序计数器
◦ 寄存器组
◦ 栈空间
◦ TCB(Thread Control Block)
它与属于同一进程的其他线程共享:代码段、数据段和其他操作系统资源,如打开文件和信号。
传统的或重型进程(heavyweight process)等价于只有一个线程的任务。
线程考虑的动机
- 应用的需要
- 开销的考虑
进程的相关操作- 创建进程
- 撤销进程
- 进程通信
- 进程切换
->时间/空间开销大大限制了并发度的提高。
线程的开销小 - 创建(撤销)一个新线程花费的时间少
- 连个线程切换花费时间少
- 线程间相互通信无需调用内核(同一进程内的线程共享内存和文件)
- 性能的考虑
- 多个线程,可以同时计算、I/O
- 多个处理器
线程的属性
- 每个线程都有一个唯一的标识符和一张线程描述表(TCB)
- 不同的线程可以执行相同的程序(同一个服务程序被不同用户调用时,操作系统为它创建不同的线程
- 同一进程中,线程共享分配给进程的主存地址空间和其他资源
- 线程是处理器的独立调度单位,多个线程可并发执行
- 一个线程被创建后便开始了它的生命周期,直至终止。线程在生命周期中会经历等待态、就绪态、运行态等各种状态变化
- 可以创建、撤销另一个线程(程序开始是以一个单线程进程方式运行的)
线程与进程的比较
- 调度
- 在传统OS中,拥有资源、独立调度和分派的基本单位都是进程,在引入线程的系统中,线程是调度和分派的基本单位,而进程是拥有资源的基本单位。把传统进程的两个属性分开,使线程基本不拥有资源,这样线程便能轻装前进,从而可显著地提高系统的并发程度。
- 在同一个进程内线程切换不会产生进程切换,由一个进程内的线程切换到另一个进程内的线程时,将会引起进程切换。
- 并发性
- 引入线程的操作系统中,不仅进程间可以并发执行,而且在一个进程中的多个线程之间亦可并发执行,使得操作系统具有更好的并发性。
- 在未引入线程的单CPU操作系统中,若仅设置一个文件服务进程,当该进程由于某种原因而被阻塞时,便没有其它的文件服务进程来提供服务。
- 引入线程的操作系统中,则可以在一个文件服务进程中设置多个服务线程。当第一个线程等待时,文件服务进程中的第二个线程可以继续运行,提供文件服务;当第二个线程阻塞时,则可由第三个继续执行,提供服务。这样的方法可以显著地提高文件服务的质量和系统的吞吐量。
- 拥有资源
- 无论是传统OS,还是引入线程的OS,进程都是拥有资源的独立单位,线程一般不拥有系统资源,但它可以访问隶属进程的资源。即一个进程的代码段、数据段及所拥有的系统资源,如已打开的文件、I/O设备等,可以供该进程中的所有线程所共享。
- 系统开销
- 创建/撤消进程时,系统都要为之创建/回收进程控制块,分配或回收资源(如内存空间和I/O设备等),系统付出开销较大。
- 进程切换时,涉及到当前进程CPU环境的保存及新被调度进程的CPU环境的设置,而线程的切换则仅需保存和设置少量寄存器内容,不涉及存储器管理方面的操作。
每个进程中的内容 | 每个线程中的内容 |
---|---|
地址空间 | 程序计数器 |
全局变量 | 寄存器 |
打开文件 | 堆栈 |
子进程 | 状态 |
即将发生的定时器 | |
信号与信号处理程序 | |
账户信息 |
- 独立性
- 同一进程中不同线程之间的独立性比不同进程之间的独立性低得多。每个进程都有独立的地址空间和其它资源,除共享全局变量外,不允许其它进程访问;但同一进程中的不同线程往往是为了提高并发性以及进行相互合作而创建的,他们共享进程的内存地址空间和资源。
- 支持多处理机系统
- 在多处理机系统中,对于传统的进程,即单线程进程,不管有多少处理机,该进程只能运行在一个处理机上,但对于多线程进程,就可以将一个进程中的多个线程分配到多个处理机上,使它们并行执行,加速进程完成。
多线程的优点
- 响应度高
- 增加了对用户的响应程度(多线程web浏览器,一线程装入图像,另一线程与用户交互),即使部分阻塞或执行较长操作,程序仍能继续执行
- 资源共享
- 线程默认共享它们所属进程的内存和资源
- 允许一个应用程序在同一地址空间内有多个不同的活动线程
- 经济
- 线程创建和上下文切换比进程创建与上下文切换更经济(Solaris进程创建比线程创建慢30倍,而进程切换比线程切换慢5倍)
- 可伸缩性–能充分使用多处理器体系结构
- 单线程进程只能运行在一个CPU上
- 在多CPU机器上使用多线程增加了并发功能