本文目录:
线程的基本概念
线程的引入
线程的理解和定义
线程的实现
进程和线程
线程和进程的比较
1 线程的基本概念
1.1 线程的引入
在传统的操作系统中,进程是系统进行资源分配、处理器调度的基本单位。进程在任一时刻只有一个执行控制流。
传统进程给并发程序设计带了的问题:
进程切换开销大,在对进程进行切换时,由于要保留当前进程的CPU环境和设置新选中进程的CPU环境,为此需花费不少处理机时间。
进程通信代价大,每次通信均要涉及通信进程之间或通信进程与操作系统之间的信息传递。
进程之间的并发性粒度较粗,并发度不高,过多的进程切换和通信延迟使得细粒度的并发得不偿失。
解决问题的基本思路— 引入“线程”
把进程的两项功能------“独立分配资源”与“被调度分派执行”分离开来:
进程作为系统资源分配和保护的独立单位,不需要频繁地切换;
线程作为系统调度和分派的基本单位,能轻装运行,会被频繁地调度和切换。
1.2 线程的理解和定义
什么是线程(thread) :是一个CPU调度单位,是进程中的一个执行路径,有时称“轻量级进程” 。
它由线程ID,程序计数器、寄存器集合和堆栈组成。
它与同属于一个进程的其它线程共享其代码段、数据段和其它操作系统的资源(如打开文件和信号)。
同一个进程中的所有线程共享进程获得的主存空间和资源。
进程在任一时刻只有一个执行控制流,通常将这种结构的进程称单线程(结构)进程。
多线程(结构)进程是在同一进程中设计出多条控制流(每一个控制流称为一个线程),多条控制流之间可以并行执行;多控制流之间可通过内存区直接通信,切换开销小。
1.3 线程的实现
线程的实现分三类:
用户级线程ULT ( User Level Thread, 如Java,Informix)
内核级线程KLT(Kernel Level Thread, (如Windows 2000/XP)
混合式线程:支持用户级线程ULT和内核级线程KLT的(如Solaris) 。
在ULT中,有关线程管理的所有工作都由应用程序完成。
在KLT中,则由系统直接支持和管理,应用程序中没有进行线程管理的代码,只有一个到内核级线程的编程接口。
1.3.1 线程的实现--用户级线程:
在纯ULT设施中,线程管理工作由应用程序做,内核不知道线程的存在。应用程序均需通过线程库进行程序设计。线程库是一个ULT管理的程序包,实质上是线程的运行支撑环境
ULT线程创建过程:进程开始只有一个线程,它可以创建新线程,通过过程调用把控制权传送给“创建”过程,由线程库为新线程创建一个TCB,并置为就绪态。然后,按一定的调度算法把控制权传递给进程中处于就绪态的一个线程。
当控制权传送到线程库时,当前线程的现场信息应被保存,而当线程库调度一个线程执行时,要恢复它的现场信息(量小,切换开销小)。
用户级线程优点 :
线程切换不需要内核特权方式:因为所有线程管理数据结构均在单个进程的用户空间中,管理线程切换的线程库也在用户地址空间中运行,因而进程不需要切换到内核方式来做线程管理。
ULT能运行在任何OS上,内核在支持ULT方面不需要做任何改变。线程库是可被所有应用共享的应用级实用程序,许多当代操作系统和语言均提供ULT线程库。
用户级线程的缺点 :
若线程执行系统调用时,不仅该线程被阻塞,且进程内的所有线程会被阻塞。
纯ULT中,多线程应用不能利用多重处理器的优点。内核在一段时间里,分配一个进程仅占用一个CPU,进程中仅有一个线程能执行。
1.3.2 线程的实现-内核级线程
在纯内核级线程设施中,线程执行中可通过内核创建线程原语来创建其他线程。内核要为整个进程及进程中的单个线程维护现场信息,应在内核中建立和维护PCB及TCB。
内核级线程优点:
多处理器上,内核能同时调度同一进程中多个线程并行执行。
进程中的一个线程被阻塞了,内核能调度同一进程的其它线程或其他进程中的线程占有处理器运行。
内核线程数据结构和堆栈很小,KLT切换快,内核自身也可用多线程技术实现,能提高系统的执行速度和效率。
内核级线程的主要缺点 :
应用程序线程在用户态运行,而线程调度和管理在内核实现,在同一进程中,控制权从一个线程传送到另一个线程时需要用户态-内核态-用户态的模式切换,系统开销较大。
1.3.3 线程的实现-混合式线程
在混合式系统中,内核支持KLT多线程的建立、调度和管理,同时也提供线程库,允许应用程序建立、调度和管理ULT。应用程序的多个ULT映射成一些KLT。
在混合式系统中,一个应用中的多个线程能同时在多处理器上并行运行,且阻塞一个线程时并不需要封锁整个进程。
2 进程和线程
2.1 线程和进程的比较
调度:在引入线程的操作系统中,进程仅作为拥有资源的基本单位,而线程是系统调度、分派的基本单位。
并发性:在引入线程的操作系统中,不仅进程之间可以并发执行,线程之间也可以并发。
拥有资源:在设有线程的操作系统中,进程是拥有资源的一个独立单位,线程仅拥有少量能保证其正常运行所必须的资源。
系统开销:由于进程相对较重,因此,操作系统进程调度的开销大大高于线程调度的开销。
未完待续,敬请期待下个系列文章...
【故事】P2P、BT、ED2k、FTP、磁力链接下载到底是什么鬼?
【故事】为了避免产品经理和程序猿干架,我用大白话讲清楚了浏览器缓存原理
【故事】跟零计算机基础的房东女儿讲了一下午的中间人劫持京东事件后,她感激涕零,决定给我免除房租(上)
点个在看呗