线程
在传统的操作系统中,每个进程有一个地址空间和一个控制线程。事实上,这几乎就是进程的定义,不过,经常存在同一个地址空间中准并行运行多个控制线程的情形,这些线程就像分离的进程。
线程的使用
为什么人们需要在一个进程中再有一类进程?
主要原因是:在许多的应用中同时发生着多种活动,某些活动会随着时间的推移会被阻塞,通过将这些应用程序分解成可以准并行运行的多个顺序线程,程序设计模型会变得更简单。
- 并行实体拥有共享同一个地址空间和所有可用数据的能力
- 由于线程比进程更轻量级,所以他们比进程更容易(即更快)创建,也更容易撤销。
- 可以加快应用程序的执行速度。(如果多个线程不是CPU密集的,那么多个线程允许这些活动彼此重叠进行,从而会加快应用程序执行的速度)
经典的线程模型
进程模型基于两种独立的概念:资源分组处理和执行。有时,将这两种概念分开会更好,这就引入了”线程“这一概念。
理解进程的一个角度是,用某种方法把相关资源集中在一起。进程有存放程序正文和数据以及其他资源的地址空间。这些资源中包括打开的文件、子进程、即将发生的定时器、信号处理程序 、账号信息等。把它们放到进程中可以更容易管理。
另一个概念是,进程拥有一个执行的线程,通常简写为线程。在线程中有一个程序计数器,用来记录接着要执行哪一条指令。线程拥有寄存器,用来保存现场当前的工作变量。线程还拥有一个堆栈,用来记录执行历史,其中每一帧保存了一个已经调用的但是还没有从中返回的过程。尽管线程必须在某个进程中执行,但是线程和它的进程是不同的概念,并且可以分别处理。进程用于把资源集中到一起,而线程则是在CPU上被调度执行的实体。
线程给进程模型增加了一项内容,即在同一个进程环境中,允许彼此之间有较大独立性的多个线程执行。
需要注意的是:进程共享计算机的物理内存、磁盘、打印机和其他资源。而多个线程共享进程的地址空间和其他资源。由于线程具有进程的某些性质,所以有时候被称为轻量级进程。而多线程指的是同一个进程中允许多个线程的情况。
每个进程中的内容:(线程共享的内容)
- 地址空间
- 全局变量
- 打开文件
- 子进程
- 即将发生的定时器
- 信号和信号处理程序
- 账户信息
每个线程中的内容(线程的私有内容)
- 程序计数器
- 寄存器
- 堆栈
- 状态
线程概念试图实现的是,共享一组资源的多个线程的执行能力,以便这些线程可以为完成某一个任务而共同工作。