线程和协程

news/2024/11/28 14:13:30/文章来源:https://www.cnblogs.com/adamans/p/18574192

线程(Thread):想象线程就像是公司的员工。每个员工都有自己的任务和责任,但他们共享公司的资源(例如办公室、打印机等)。员工(线程)的上下班(开始和结束线程)以及工作调度(线程切换)由公司管理层(操作系统)控制,想想就挺残忍的。
如果公司要新增一个员工或者安排员工之间的工作,这需要管理层的直接参与,也会涉及到较多的人力和物力资源(也就是说,线程的创建和上下文切换成本相对较高)。

协程(Coroutine):现在想象协程就像是在家工作的自由职业者。他们使用自己的电脑和办公设备(拥有自己的堆栈和局部变量),并且自己决定什么时候工作、什么时候休息(编程者控制)。
他们可以随时暂停工作去喝杯咖啡或是散步(yield或等待),然后再回来继续工作。所有这些活动的安排都不需要外部管理层的参与(用户级的调度),并且几乎不需要额外的资源(低成本的任务切换)。

协作式调度:当前线程完全占用CPU时间,除非自己让出时间片,直到运行结束,系统才执行下一个线程。可能出现一个线程一直占有CPU,而其他线程等待。
抢占式调度:操作系统决定下一个占用CPU时间的是哪一个线程,定期的中断当前正在执行的线程,任何一个线程都不能独占。不会因为一个线程而影响整个进程的执行。


协程(Coroutines)的完整定义是“协作式调度的用户态线程”
协作式调度
A用6分钟, 我先用你一会用
B用4分钟
A是6分+B4分=10分

抢占式调度:AB都用打印机
A用2分钟
B用2分钟
A用2分钟
B用2分钟
A用2分钟
A是6分+B4分=10分

假设调度使用相同的时间,但是协程只需要2次调度切换而抢占式调用需要5次调度切换。
A在携程调度下6分钟完成就可以干别的了,但是普通均分调度下要等4分钟+工作6分钟=整体耗时10分钟来完成。


操作系统切换线程上下文的步骤如下所示:
1)保留用户态现场(上下文、寄存器、用户栈等)
2)复制用户态参数,用户栈切到内核栈,进入内核态
3)代码安全检查(内核不信任用户态代码)
4)执行内核态代码
5)复制内核态代码执行结果,回到用户态
6)恢复用户态现场(上下文、寄存器、用户栈等)
操作系统对线程有感知,经常管理,这就是需要耗费性能开销,
但是协程管不着,开销就没那么大,协程在开销上是轻量级的线程,不用处处系统感知管理。


协程不是操作系统的底层特性,系统感知不到它的存在。
它运行在线程里面,通过分时复用线程的方式运行,不会增加线程的数量。
协程也有上下文切换,但是不会切换到内核态去,比线程切换的开销要小很多。
在IO密集型的任务中有着大量的阻塞等待过程,协程采用协作式调度,在IO阻塞的时候让出CPU,当IO就绪后再主动占用CPU,牺牲任务执行的公平性换取吞吐量。

协程和线程的共同点:
都是并发操作,多线程同一时间点只能有一个线程在执行,协程同一时间点只能有一个任务在执行;

协程和线程的不同点:
多线程,是在I/O阻塞时通过切换线程来达到并发的效果,在什么情况下做线程切换是由操作系统来决定的,会造成竞争条件。
协程是用函数切换,开销极小,不通过操作系统调度,没有进程、线程的切换开销。

协程对比线程,在2个方面有影响:
在调度方式上(线程调度采用的调用cpu的方法在调度方式上(线程调度采用的调用cpu的方法)开销更小,
在上下文切换用户态上比线程更自由开销更小。

更简单:
协程用户态协作式调度方式比线程抢占式调度更优。
协程上下文切换比线程上下文系统切换更小。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/842867.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

外委项目进度控制全攻略:产品经理如何实现精准把控

在现代企业的项目管理中,尤其是面对外委项目,产品经理扮演着至关重要的角色。作为项目的核心负责人,产品经理需要不仅要把控产品质量,还要合理安排开发进度、协调各方资源,并确保项目能够按期、按质交付。尤其对于外委项目来说,由于涉及到第三方供应商和多个团队的协作,…

新型大语言模型的预训练与后训练范式,苹果的AFM基础语言模型Aq

前言:大型语言模型(LLMs)的发展历程可以说是非常长,从早期的GPT模型一路走到了今天这些复杂的、公开权重的大型语言模型。最初,LLM的训练过程只关注预训练,但后来逐步扩展到了包括预训练和后训练在内的完整流程。后训练通常涵盖监督指导微调和对齐过程,而这些在ChatGPT的…

15个必备项目管理软件与10款最常用的,最终你选哪款?

项目管理软件在现代项目管理中扮演着至关重要的角色,它能帮助团队理清项目脉络、实时追踪进度、确保任务按时完成,提升团队工作效率和协作能力。 在当今竞争激烈的商业环境中,项目的复杂性和多样性不断增加,项目管理软件成为了不可或缺的工具。它可以将庞大的项目分解为具体…

【NLP高频面题 - LLM架构篇】LLM为何使用GQA代替MHA?

【NLP高频面题 - LLM架构篇】LLM为何使用GQA代替MHA? 重要性:★★ 💯 NLP G【NLP高频面题 - LLM架构篇】LLM为何使用GQA代替MHA? 重要性:★★ 💯NLP Github 项目:NLP 项目实践:fasterai/nlp-project-practice 介绍:该仓库围绕着 NLP 任务模型的设计、训练、优化、部…

【NLP高频面题 - LLM架构篇】LLM对Transformer都有哪些优化?

【NLP高频面题 - LLM架构篇】LLM对Transformer都有哪些优化? ⚠︎ 重要性:★★【NLP高频面题 - LLM架构篇】LLM对Transformer都有哪些优化? ⚠︎ 重要性:★★★ 💯NLP Github 项目:NLP 项目实践:fasterai/nlp-project-practice 介绍:该仓库围绕着 NLP 任务模型的设计、…

Win7 .lnk快捷方式被绑定到以wps打开导致所有快捷方式失效

最终通过FileTypesMan解决问题,FileTypesMan可以非常详细的编辑文件类型,找到.lnk,把用户选择项内容按退格键删除:让.lnk属性保持这样:正常的.lnk配置如下:保证类型名称是inkfile,用户选择处为空。 .lnkfile有的电脑没有,也是正常的 重启电脑或者结束explorer进程,重新打…

【应急响应】Linux 计划任务与 DFIR 排查实践(二)

#linux应急响应 at服务 #cron 服务 #隐藏任务 🔖 在上一节【linux应急响应】Linux 计划任务与 DFIR 排查实践(一)中,我们深入探讨了 cron 服务,从基础排查到隐藏任务的分析排查,这一节我们一块看看cron的小兄弟at服务。免责声明 本公众号文章中的程序、方法、信息和工具…

vxe-table 表格中使用 element-ui 组件库的

在公司开发大型项目中,使用主流表格库 vxe-table 和 element-ui 组件库,可以在可编辑单元格中渲染非常简单的使用更多的组件 官网:https://vxetable.cn 安装 npm install vxe-pc-ui@3.3.9 vxe-table@3.11.10 @vxe-ui/plugin-render-element@3.0.0// ... import { VxeUI } fr…

独立开发者应该如何设计产品网站

我看到很多产品开发者习惯于先去“找模板”,再就着模板向里面填充内容,这是不对的。首先自己的思路是否理清了,其次所谓的模板,其内容层次结构是否适合自己的产品?我看到一些产品网站虽然看起来还算漂亮,但是传递的内容十分有限。背景 我在业余时间开发了一款自己的独立产…

七种方式监听前端代码报错

错误类型 1 SyntaxError SyntaxError是构建阶段错误,非运行阶段。解析时候发生语法错误无法捕获 2 TypeError TypeError 指的是:值不是所期待的类型3 ReferenceError ReferenceError 指的是:引用未声明的变量4 RangeErrorRangeError 指的是:当一个值不在其所允许的范围或者…

如何记录网站来访者的IP地址

js如何记录来访者ipEdit2 • 2024年9月23日 下午12:49 • 百科 JS如何记录来访者IP:使用服务器端语言、调用第三方API服务、结合前端和后端技术在JavaScript中,直接获取来访者的IP地址并不容易,因为JavaScript运行在客户端环境中,而IP地址信息通常在服务器端获取。为了实…

responsively-lazy 可实现响应式图片懒加载的js插件

在线演示 下载 responsively-lazy是一款非常实用的可实现响应式图片懒加载的插件。它可以根据容器的大小来智能选择加载适合尺寸的图片,做到图片的响应式效果。并且使用它对于SEO是十分友好的。该图片懒加载插件的特点还有:响应式图片 不做任何不必要的请求 可以在任何支持…