多进程与多线程(七)

来源:互联网 发布:软件技术部管理制度 编辑:程序博客网 时间:2024/05/22 06:10

2          线程

线程,何为线程?

其实,线程[1]没有明确的定义。我们只能通过描述和特性解释的方式来说说线程。

首先,线程比进程“小”。这个“小”包含几个层面的含义:一,“辈分”低,线程隶属于进程,被进程创建。二,“体积”小,线程不是独立体,不象进程一样拥有动态堆、静态数据、程序代码等部分,线程只是在进程空间内,可以拥有自己独立的寄存器和堆栈而已[2]。三,“开销”小,操作系统对于进程的创建比进程的创建要更为费时费力。

其次,线程比进程“快”。快,有两层含义:一是利用并行,执行快。二是切换快,进程因有自己独立的虚地址空间,进程间切换时,操作系统必须交换不同进程的地址空间,使得退出执行态的进程地址被保存,进入执行态的进程地址空间被操作系统可见。而多线程因共享相同的地址空间,故节省了耗时的进程地址空间切换。

线程同进程一样,有各种状态,如新建、可运行、阻塞/挂起、终止等,以标识线程在生命期中的不同状态,以反映其在操作系统下被调度的情形。

线程间通常也需要通信,但却就没有共享内存、信号等手段可用了,可是,线程间通信却比进程间通信方便许多,这是因为线程间共享着进程的地址空间。线程共享进程地址空间,意味着隶属进程的变量(变量的实质是进程的部分空间,变量名是部分进程空间的被命了名的地址)可能被线程共享,也可能被线程独享,由此,引发了掌握线程的两个主要问题:一是线程安全;另一个是TLS,thread local storage,线程本地存储。



[1] 与进程一样,线程在操作系统中也有个类似PCB的东西,称为线程属性对象(thread attributes object,用以描述线程属性对象),这个线程属性对象被操作系统掌握,用以控制、调度线程。

[2] 实际上,线程概念的产生,是思维细化的结果,这种思维方式就是解耦——把进程所占资源与进程中的运行代码相分离——这种分离的结果,就产生了线程,即,线程使得在一个进程地址空间中可以运行多个指令流,这样,多个指令流就可以利用多核或多处理机(SMP)得以并行执行,从而提高并发度。