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

协程

进程、线程、协程

进程

进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。

进程的生命周期基本由操作系统内核进行支配,即进程的创建、切换、销毁等操作都将使会陷入内核,进行系统调用。该操作消耗较大。当进行进程的销毁时,包含但不仅于内存地址空间、内核态堆栈和硬件上下文(CPU寄存器)的切换甚至在内存资源较少的情况下会将已存入内存的数据写入磁盘交换区,代价较大。因此,我们可以发现当系统运行的进程越多,系统越是卡顿。

线程

线程的切换的消耗随略小于进程,较少进行内存和磁盘的交换,但是仍然会有堆栈的映射和切换。

当前各种语言、系统所采用的线程模式基本为内核级线程

协程

协程始终运行在一个线程之内,完全没有上下文切换,因为它的上下文是维护在用户态开辟的一块内存里,而它的任务调度是在代码里显式处理的。
由于协程运行在一个线程(该线程是内核级的)中,因此对变量的判断、更改是线程安全的,不会发生操作的不一致性。

总结:进程、线程和协程的设计,都是为了并发任务能够更好的利用CPU资源,他们最大的区别即在于对CPU的使用上(任务调度):如前文所述,进程和线程的任务调度由内核控制,是抢占式的;而协程的任务调度在用户态完成,需要在代码里显式的把CPU交给其他协程,是协作式的。

由于我们可以在用户态调度协程任务,所以,我们可以把一组互相依赖的任务设计成协程。这样,当一个协程任务完成之后,可以手动进行任务调度,把自己挂起(yield),切换到另外一个协程执行。这样,由于我们可以控制程序主动让出资源,很多情况下将不需要对资源加锁。

思考:协程和用户级线程的区别?

相关文章:

  • C#中for循环的交换排序案例
  • Apache Server 负载能力测试
  • C#的delegate简单练习
  • 前端学习系列
  • 【前端】2017年12月11日 前端的内功心法语言篇--01
  • day14-css的存在形式以及优先级
  • [LeetCode] Ransom Note 赎金条
  • textField textView输入限制
  • Python中的generator对象
  • 数据结构C++ 队列——队列的应用
  • PS注意
  • 提升工作效率的方法
  • 基于Redis实现分布式锁,避免重复执行定时任务
  • 一篇文章告诉你React里为什么不能用index作为key
  • 阿武老师百搭傲娇句式
  • 【跃迁之路】【641天】程序员高效学习方法论探索系列(实验阶段398-2018.11.14)...
  • Docker 笔记(1):介绍、镜像、容器及其基本操作
  • Druid 在有赞的实践
  • ECMAScript入门(七)--Module语法
  • Gradle 5.0 正式版发布
  • JavaScript中的对象个人分享
  • Java程序员幽默爆笑锦集
  • Java反射-动态类加载和重新加载
  • Java-详解HashMap
  • js中forEach回调同异步问题
  • Storybook 5.0正式发布:有史以来变化最大的版本\n
  • 名企6年Java程序员的工作总结,写给在迷茫中的你!
  • 前嗅ForeSpider采集配置界面介绍
  • 如何用Ubuntu和Xen来设置Kubernetes?
  • 入手阿里云新服务器的部署NODE
  • ​马来语翻译中文去哪比较好?
  • ​软考-高级-系统架构设计师教程(清华第2版)【第9章 软件可靠性基础知识(P320~344)-思维导图】​
  • # Swust 12th acm 邀请赛# [ A ] A+B problem [题解]
  • # Swust 12th acm 邀请赛# [ K ] 三角形判定 [题解]
  • (4) openssl rsa/pkey(查看私钥、从私钥中提取公钥、查看公钥)
  • (4)事件处理——(2)在页面加载的时候执行任务(Performing tasks on page load)...
  • (6)添加vue-cookie
  • (C语言)fread与fwrite详解
  • (LNMP) How To Install Linux, nginx, MySQL, PHP
  • (附源码)springboot家庭装修管理系统 毕业设计 613205
  • (欧拉)openEuler系统添加网卡文件配置流程、(欧拉)openEuler系统手动配置ipv6地址流程、(欧拉)openEuler系统网络管理说明
  • (四)模仿学习-完成后台管理页面查询
  • (转)Google的Objective-C编码规范
  • .Net MVC + EF搭建学生管理系统
  • .net web项目 调用webService
  • .NET(C#) Internals: as a developer, .net framework in my eyes
  • .NET/C# 中设置当发生某个特定异常时进入断点(不借助 Visual Studio 的纯代码实现)
  • .net经典笔试题
  • .net实现头像缩放截取功能 -----转载自accp教程网
  • .Net转前端开发-启航篇,如何定制博客园主题
  • @Autowired自动装配
  • @Bean, @Component, @Configuration简析
  • @RequestBody的使用
  • [ C++ ] STL_list 使用及其模拟实现
  • [1]-基于图搜索的路径规划基础