进程和线程(二)

进程和线程(二)

首先,线程的提出和实现是为了解决进程内部执行线索多样化的问题,也就是为了进一步提高并发度。对于进程而言,它是资源分配的基本单位,而线程是独立调度的基本单位。

1、线程的分类

线程分为两类,其一是内核级线程(kernel-level thread, kld),其二是用户级线程(user-level thread ult)。

对于KLT,线程管理的所有工作都由OS来做;OS提供了一个应用程序设计的接口API,供开发者使用。

KLT的特点:1、进程中的一个线程被阻塞了,内核能调度同一进程的其他线程占有处理器运行2、多处理器环境中,内核能同时调度同一进程中多个线程并发执行3、内核自身也可以用多线程技术实现,能提高操作系统的执行速度和效率4、应用程序线程在用户态运行,线程调度和管理在内核实现,在同一进程中,控制权从一个线程传送到另一个线程时需要模式切换,开销较大

对于ULT,线程管理数据结构均在进程的用户空间中,线程切换不需要内核模式,节省模式开销和内核的宝贵资源

ULT的的特点:1、允许进程按应用的特定需求选择调度算法,甚至根据应用需求裁剪调度算法2、能运行在任何OS上,内核在支持ULT方面不需要做任何工作。3、不能利用多处理器的有点,OS调度进程,仅有一个ULT能执行4、一个ULT的阻塞,将引起整个进程的阻塞

2、jacketing技术

为了解决一个ULT的阻塞,将引起整个进程的阻塞的问题,出现了jacketing技术

jacketing技术将阻塞式的系统调用改造成非阻塞式的,当线程陷入系统调用时,检查jacketing程序,由jackting程序来检查资源使用情况,以决定是否执行进程切换或传递控制权给另一个线程。

比如说,当线程需要I/O资源是,它不直接去调用系统I/O例程,而是让线程调用一用户级的I/O的Jacketing例程,这个jacket例程中的代码用来检查并确定I/O设备是否忙。如果忙,该线程进入阻塞状态并将控制传送给另一个线程。当这个线程后来又重新获得控制时,jacketing例程会再次检查I/O设备。

上面我们说过,线程是为了解决进程内部执行线索多样化的问题,也就是为了提供并发度。

这里我们可以说:


ULT适用于解决逻辑并行性问题
KLT适用于解决物理并行性问题

3、多线程实现的混合式策略

为综合KLT和ULT的优点,相互弥补其缺点,就有了多线程实现的混合式策略。

简单来说,线程的创建完全在用户空间中做的,单个应用的多个ULT可以映射成一些KLT,通过调整KLT的数目,来达到较好的并行效果。

总结一下混合式策略的特点:1、组合ULT/KLT设施2、线程创建完全在用户空间中完成,线程的调度和同步也在应用程序中进行。3、一个应用中的多个用户级线程被映射道一些(小于等于用户级线程数目)内核级线程4、程序员可以针对特定应用和机器调节内核级线程的数目,以达到整体最佳结果5、该方法结合ULT、KLT的优点同时减少他们的缺点



猜你喜欢

转载自blog.csdn.net/qq_38180223/article/details/80966544