当前位置: 首页 > news >正文

操作系统:线程实现方式

在操作系统层面,线程的实现方式主要有两种:用户级线程(User-Level Threads, ULT)和内核级线程(Kernel-Level Threads, KLT)。这两种实现方式各有优缺点,并且在不同的操作系统中可能会采用不同的实现策略。

用户级线程(ULT)

用户级线程是在用户空间实现的线程,操作系统内核并不直接参与其调度和管理。这种线程的创建、同步、调度和管理都是由用户空间的线程库(如POSIX线程库pthread)来完成的。

优点

  • 性能:用户级线程的创建、切换和同步操作不需要系统调用或者内核介入,因此开销较小。
  • 调度策略灵活:开发者可以根据应用的需求,自定义线程的调度策略。

缺点

  • 系统调用阻塞:一个用户级线程执行系统调用而阻塞时,会导致整个进程中的所有线程都被阻塞。
  • 用户级线程执行系统调用而阻塞导致整个进程中的所有线程都被阻塞,这个现象的根本原因在于操作系统内核对用户级线程的不可见性。
  • 在用户级线程(ULT)模型中,线程的管理(包括创建、调度和同步)完全在用户空间内进行,操作系统内核并不知晓用户空间内部的线程存在。对于内核来说,它只管理和调度进程,而不是进程内的线程。因此,当一个用户级线程执行系统调用(如读取磁盘文件、等待网络数据等)并因此阻塞时,内核只能看到发起系统调用的进程需要被阻塞,而无法识别这个阻塞是由进程内的某个线程引起的。
  • 由于内核将整个进程(包括进程内的所有线程)视为一个单一的执行单元,当任何一个用户级线程进行阻塞式系统调用并因此被阻塞时,整个进程都会被挂起,直到该系统调用完成。这就导致了即使进程中有其他用户级线程是可运行的,这些线程也会因为进程被阻塞而无法执行。

这种行为限制了用户级线程模型在某些场景下的应用,特别是在需要频繁进行阻塞式系统调用的应用中,用户级线程可能不是最佳选择。相比之下,内核级线程(KLT)模型中,线程的管理和调度是由操作系统内核直接进行的,内核能够看到每个线程的状态,并且可以独立调度每个线程。因此,一个内核级线程的阻塞不会影响到同一进程中的其他线程。这使得内核级线程模型在需要频繁进行系统调用的应用场景中更为适用。

  • 多处理器利用:用户级线程不能很好地利用多核处理器,因为线程调度是在用户空间完成的,内核看不到这些线程,因此无法将线程分配到不同的处理器上执行。

内核级线程(KLT)

内核级线程是由操作系统内核直接支持和管理的线程。线程的创建、调度和管理都是在内核空间进行的。现代操作系统(如Linux、Windows)大多支持内核级线程。

优点

  • 多处理器利用:内核级线程可以被操作系统调度到不同的处理器上执行,更好地利用多核处理器的性能。
  • 系统调用阻塞:一个线程的系统调用阻塞不会影响到同一进程中的其他线程。

缺点

  • 性能开销:线程的创建、切换和同步操作需要通过系统调用,涉及到用户空间和内核空间之间的切换,因此开销相对较大。

混合实现(Hybrid Implementations)

为了结合用户级线程和内核级线线程的优点,一些操作系统采用了混合实现的方式。在这种模型中,多个用户级线程被绑定到一个或多个内核级线程上。这种方式既可以利用用户级线程的轻量级和灵活性,又可以避免其在系统调用阻塞和多处理器利用方面的缺点。

总结

线程的实现方式影响着线程的性能和应用的设计。用户级线程提供了高效的线程操作,但在系统调用阻塞和多处理器利用方面有限制。内核级线程虽然在性能上有一定的开销,但能更好地支持多核处理器和避免单个线程阻塞导致整个进程阻塞的问题。混合实现试图结合两者的优点,提供更灵活的线程管理策略。开发者在设计应用时,需要根据应用的特点和需求,选择合适的线程实现方式。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 最大时间
  • Open3D 四元数、欧拉角及旋转向量转旋转矩阵的方式
  • application/x-www-form-urlencoded与multipart/form-data与application/json的区别
  • 多态与接口(Golang)
  • 金融业开源技术 术语
  • 报错module ‘markdown‘ has no attribute ‘version‘解决方法
  • 网络包处理库Scapy: 计算checksum,csum
  • 米壳AI:分享一个轻松保存外网高清原视频的方法!
  • 微信企业微信忽然爆满 怎么清理才干净?一招彻底清理干净垃圾文件
  • 顶点照明渲染路径
  • Spring Boot 注解探秘:@Validated 开启数据验证之旅(上)
  • 数据链路层与ARP协议
  • 数学建模笔记—— 灰色关联分析[GRA]
  • tekton pipeline workspaces
  • 3个办法轻松操作:flac转mp3在线快速完成
  • 时间复杂度分析经典问题——最大子序列和
  • #Java异常处理
  • [译]如何构建服务器端web组件,为何要构建?
  • 【402天】跃迁之路——程序员高效学习方法论探索系列(实验阶段159-2018.03.14)...
  • 【跃迁之路】【477天】刻意练习系列236(2018.05.28)
  • Docker入门(二) - Dockerfile
  • If…else
  • Java 最常见的 200+ 面试题:面试必备
  • Java教程_软件开发基础
  • MD5加密原理解析及OC版原理实现
  • Vue.js-Day01
  • 分享几个不错的工具
  • 关于使用markdown的方法(引自CSDN教程)
  • 模仿 Go Sort 排序接口实现的自定义排序
  • 深度学习在携程攻略社区的应用
  • 微信如何实现自动跳转到用其他浏览器打开指定页面下载APP
  • 我的面试准备过程--容器(更新中)
  • 写代码的正确姿势
  • 用mpvue开发微信小程序
  • Linux权限管理(week1_day5)--技术流ken
  • MPAndroidChart 教程:Y轴 YAxis
  • 关于Kubernetes Dashboard漏洞CVE-2018-18264的修复公告
  • #define 用法
  • (04)Hive的相关概念——order by 、sort by、distribute by 、cluster by
  • (4.10~4.16)
  • (day 12)JavaScript学习笔记(数组3)
  • (LeetCode 49)Anagrams
  • (二)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (附源码)spring boot球鞋文化交流论坛 毕业设计 141436
  • (附源码)springboot 房产中介系统 毕业设计 312341
  • (没学懂,待填坑)【动态规划】数位动态规划
  • (转)利用ant在Mac 下自动化打包签名Android程序
  • .NET : 在VS2008中计算代码度量值
  • .NET Framework 3.5中序列化成JSON数据及JSON数据的反序列化,以及jQuery的调用JSON
  • .NET 应用启用与禁用自动生成绑定重定向 (bindingRedirect),解决不同版本 dll 的依赖问题
  • .NET 中选择合适的文件打开模式(CreateNew, Create, Open, OpenOrCreate, Truncate, Append)
  • /3GB和/USERVA开关
  • :如何用SQL脚本保存存储过程返回的结果集
  • @Async注解的坑,小心
  • [ABC275A] Find Takahashi 题解