线程的实现方式
1.内核线程KST
依赖于内核,利用系统调用由OS内核在内核空间完成创建、撤销、切换等进程工作(时间片分配给线程 ,所以多线程的进程获得更多CPU时间)
KST的优缺点
-
多处理器系统下可实现多线程并行;
-
一个线程发起系统调用而阻塞,不会影响其他线程的运行;
-
线程切换开销远小于进程切换
-
内核本身也采用多线程技术可提高系统执行速度和效率
-
BAD——用户态运行线程,调度和管理线程则是内核态,模式的切换开销大。2.用户线程ULT
无需利用系统调用,不依赖于OS核心,进程利用线程库函数创建、同步、调度和管理控制用户线程。
调度由应用软件内部执行,通常采用非抢先式和更简单的规则,也无需用户态/核心态切换,速度比KST快。
UTL优缺点: -
用户线程的维护由应用进程完成;内核不了解用户线程的存在;线程切换不用内核特权;
-
用户线程调度算法可针对应用优化;
-
多线程的实现与平台无关
-
一旦系统调用引起进程阻塞,则整个进程的所有线程都不能执行;
-
以进程为单位分配CPU,所以在多处理器系统中没有优势;
3.组合方式
把用户级线程和内核支持线程两种方式进行组合,在组合方式线程系统中,内核支持多个内核支持线程的建立、调度和管理。同时也允许用户应用程序建立、调度和管理用户线程。
线程的实现
1.内核线程的实现
内核支持的线程直接利用系统调用,线程控制很简单
(1)给创建的新进程分配一个任务数据区PTDA,存放其线程的TCB
(2)信息保存在内核空间中
(3)操作TCB控制线程调度和切换,花费较小
2.用户级线程的实现
用户级线程需借助某种形式的中间系统取得内核服务,用户程序复杂
(1)运行时系统:管理和控制线程的函数/过程集合
所有函数驻留在用户空间上;
线程切换由切换过程实现,线程的CPU状态保存在自己的堆栈中,切换不需要转入内核态执行;
根本上操作系统资源还是要由内核做。用户线程的所有要求给了运行时系统,由它通过相应的系统调用获得系统资源。
(2)内核控制线程,轻型进程LWP
线程的创建和终止