线程的实现原理
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
线程的实现原理
线程的实现原理
0、概述
操作系统引⼊线程之后,进程就变成了分配资源的基本单位,线程是独⽴调度的基本单位。
引⼊线程的意义:
未引⼊线程之前,进程是分配资源和独⽴调度的基本单位,因⽽在创建、撤销、切换中,系统必须为之付出较⼤的时空开销。正因如此,在系统中所设置的进程,其数⽬不宜过多,进程切换的频率也不宜过⾼,这也就限制这并发程度的进⼀步提⾼。
那么如何能使多个程序更好的并发执⾏同时⼜尽量减少系统的开销?不少学者发现:能不能将进程的上述两个属性分开,由操作系统分开处理。即对于作为调度的基本单位,不同时作为拥有资源的单位,以做到"轻装上阵";⽽对于拥有资源的基本单位,⼜不对其进⾏频繁的切换。
正是在这种思想的指导下,形成了线程的概念。
实现线程的⽅式主要有三种:
使⽤内核线程实现(1:1)
使⽤⽤户线程实现(1:N)
使⽤⽤户线程+轻量级进程混合实现(N:M)
1、内核线程的实现
内核线程(KTL)就是直接由操作系统内核直接⽀持的线程这种吸纳从由内核来完成线程的切换,内核通过线程调度器完成对线程的调度,并负责将线程的任务映射到各个CPU或者核⼼上。
程序⼀般不会直接使⽤内核线程,⽽是使⽤内核线程的⼀种⾼级接⼝——轻量级进程(LWP),轻量级进程就是我们通常意义上的线程,每个轻量级进程都有⼀个内核线程⽀持,轻量级进程是⽤户线程和内核线程之间的桥梁。因此只有先⽀持内核线程,才能有轻量级进程。这种轻量级进程与内核线程1:1映射。
优越性:
由于内核线程的⽀持,每个轻量级进程都成为⼀个独⽴的调度单元,即使其中某⼀个轻量级进程阻塞,也不会影响整个进程的进度。
局限性:
这种⽅式基于内核线程实现,需要进⾏系统调⽤,操作系统在管态⽬态频繁切换,造成的开销较⼤;
每个轻量级进程都需要有⼀个内核线程⽀持,因此轻量级进程消耗⼀定的内核资源,因此⼀个系统⽀持的轻量级进程数量有限。
2、⽤户线程实现
⼴义上认为只要⼀个线程不是内核线程,都可以认为是⽤户线程(UT),因此从这个⾓度看来轻量级进程也属于⽤户线程,但是轻量级进程的实现始终依赖于内核线程,许多操作需要进⾏系统调⽤,因此会限制到效率。
侠义上的⽤户线程指的是完全建⽴在⽤户空间上的线程库中,系统内核不能感受到⽤户线程的存在以及如何实现的。⽤户线程的建⽴、同步、销毁以及调度完全是在⽤户态完成的,⽆需内核的⽀持。如果程序的实现策略得当,这种线程不需要切换到内核态,因此可以以⾮常低廉的代价⽀持⼤规模的线程。
优越性:
⽆需系统内核的⽀持,所有的线程需要⽤户程序⾃⾏处理;
局限性:
没有系统内核的⽀持,线程的创建、切换和调度都由⽤户⾃⾏考虑。诸如阻塞如何处理、多处理器系统中如何将线程映射到其它处理器上的问题,解决起来相当繁琐;
3、混合实现
在混合实现下,既存在⽤户线程,也存在轻量级进程。⽤户线程还是完全建⽴在⽤户空间中,因此⽤户线程的创建、切换等操作开销⽐较⼩,可以⽀撑⼤规模的⽤户线程并发。轻量级进程作为⽤户线程和内核线程之间的桥梁,可以使⽤内核提供的线程调度功能及处理器映射,并且⽤户线程的系统调⽤要通过轻量级进程来完成,这样⼤⼤降低了整个进程阻塞的风险。在这种混合模式下,⽤户线程与轻量级进程的数量⽐是不恒定的,是N:M的关系。
4、Java线程的实现
Java进程如何实现不受Java虚拟机规范的约束,与具体的虚拟机相关。在HotSpot中,每⼀个Java线程都是直接映射到⼀个操作系统原⽣线程实现,⽽且中间没有额外的间接结构。所以HotSpot虚拟机不会⾃⼰去⼲涉线程的调度,全部交给操作系统去处理,何时冻结或者唤醒线程,该给线程分配多少处理器执⾏时间、该⼋线程交给哪个处理器的哪个核⼼去执⾏等,都是由操纵系统决定的。