2 线程
线程,何为线程?
其实,线程[1]没有明确的定义。我们只能通过描述和特性解释的方式来说说线程。
首先,线程比进程“小”。这个“小”包含几个层面的含义:一,“辈分”低,线程隶属于进程,被进程创建。二,“体积”小,线程不是独立体,不象进程一样拥有动态堆、静态数据、程序代码等部分,线程只是在进程空间内,可以拥有自己独立的寄存器和堆栈而已[2]。三,“开销”小,操作系统对于进程的创建比进程的创建要更为费时费力。
其次,线程比进程“快”。快,有两层含义:一是利用并行,执行快。二是切换快,进程因有自己独立的虚地址空间,进程间切换时,操作系统必须交换不同进程的地址空间,使得退出执行态的进程地址被保存,进入执行态的进程地址空间被操作系统可见。而多线程因共享相同的地址空间,故节省了耗时的进程地址空间切换。
线程同进程一样,有各种状态,如新建、可运行、阻塞/挂起、终止等,以标识线程在生命期中的不同状态,以反映其在操作系统下被调度的情形。
线程间通常也需要通信,但却就没有共享内存、信号等手段可用了,可是,线程间通信却比进程间通信方便许多,这是因为线程间共享着进程的地址空间。线程共享进程地址空间,意味着隶属进程的变量(变量的实质是进程的部分空间,变量名是部分进程空间的被命了名的地址)可能被线程共享,也可能被线程独享,由此,引发了掌握线程的两个主要问题:一是线程安全;另一个是TLS,thread local storage,线程本地存储。