表-线程的实现 |
线程的实现方式 | 内核支持线程 | 实现 | 内核支持线程直接获取内核的服务。内核支持线程在内核空间中实现,内核支持线程的创建、撤销和切换依靠内核。内核支持线程的TCB设置在内核空间,内核根据TCB感知线程的存在。系统在创建进程时,为它分配一个任务数据区PTDA (Per Task Data Area),其中包括若干TCB空间,保存在内核空间。当进程创建一个线程时,便为其分配一个TCB,将有关信息填入该TCB,并为之分配必要的资源,新创建的线程便有条件立即执行;当PTDA中的所有TCB空间已用完,而又要创建新线程时,只要所创建的线程数目未超过系统允许值,系统可为其分配新的TCB空间。在撤销一个线程时,将回收该线程的所有资源和TCB;或不立即回收该线程的资源和TCB,当以后再创建线程时,可直接利用已被撤销但仍保持有资源和TCB的线程作为新线程。 内核本身也可采用多线程技术。 |
调度 | 1) 调度以线程为单位进行,时间片分配给线程; 2) 同一进程中的一个线程被阻塞,该进程的其他线程仍可运行; 3) 线程的调度算法与进程的调度算法类似。 |
运行空间 | 线程的调度和管理是在内核实现的。属于同一用户进程的线程之间的切换,需要从用户态转到内核态进行,这是因为用户进程的线程在用户态运行,线程的切换在内核态实现。 |
用户级线程 | 实现 | 用户级线程运行在一个中间系统上面,通过该中间系统间接取得内核的服务。用户级线程在用户空间中实现,用户级线程的创建、撤销和切换无需内核。用户级线程的TCB设置在用户空间,内核不知道用户级线程的存在。用户级线程的实现与OS平台无关,因为对线程进行管理的代码是在用户程序内的,属于用户程序的一部分,所有的应用程序都可以共享,因而用户级线程可以在不支持线程机制的OS平台上实现。 中间系统的实现方式有两种,即运行时系统和内核控制线程。运行时系统是公用的,可供所有进程中的用户级线程使用,是用户级线程与内核之间的静态接口(函数);内核控制线程是私用的,仅供隶属进程中的用户级线程使用,是用户级线程与内核之间的动态接口(线程)。 |
运行时系统 | 运行时系统,实质是用于管理和控制线程的函数(过程)的集合。正因为有这些函数,才能使用户级线程与内核无关。运行时系统中所有的函数都驻留在用户空间,并作为用户级线程与内核之间的接口。线程切换由运行时系统中的线程切换过程来执行。 |
内核控制线程 | 内核控制线程又称轻型进程。每个进程可拥有多个内核控制线程,这些内核控制线程共享进程拥有的资源。内核控制线程通过系统调用获得内核提供的服务。用户级线程运行时,只要将自身连接到一个内核控制线程上,便具有了内核支持线程的所有属性,该实现方式就是组合方式。正因为内核控制线程,才能使用户级线程与内核无关。 用户进程的内核控制线程可以做成一个缓冲池,称为线程池,每一个内核控制线程都需连接到一个内核级线程上。用户进程中的任一用户级线程可以以一对一、多对一、多对多的方式连接到线程池中的任一内核控制线程上。 |
调度 | 1) 调度以进程为单位进行,时间片分配给进程; 2) 同一进程中的一个线程被阻塞,该进程的所有线程均被阻塞; 3) 线程的调度算法可以是进程专用的,即不同的进程可选择不同的调度算法对自己的线程进行管理和调度,而与OS的低级调度算法无关。 |
运行空间 | 线程的调度和管理在用户空间。属于同一用户进程的线程之间的切换,无需从用户态转到内核态进行,这是因为用户级线程的切换无需内核的支持。 |