当前位置: 首页 > 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
  • 阿武老师百搭傲娇句式
  • 深入了解以太坊
  • “大数据应用场景”之隔壁老王(连载四)
  • Dubbo 整合 Pinpoint 做分布式服务请求跟踪
  • Java 多线程编程之:notify 和 wait 用法
  • Laravel Mix运行时关于es2015报错解决方案
  • Linux编程学习笔记 | Linux IO学习[1] - 文件IO
  • MYSQL 的 IF 函数
  • nodejs:开发并发布一个nodejs包
  • TiDB 源码阅读系列文章(十)Chunk 和执行框架简介
  • 给初学者:JavaScript 中数组操作注意点
  • 诡异!React stopPropagation失灵
  • 将 Measurements 和 Units 应用到物理学
  • 前端路由实现-history
  • 说说动画卡顿的解决方案
  • 微信小程序设置上一页数据
  • 新手搭建网站的主要流程
  • 你对linux中grep命令知道多少?
  • RDS-Mysql 物理备份恢复到本地数据库上
  • #android不同版本废弃api,新api。
  • (1)(1.11) SiK Radio v2(一)
  • (14)目标检测_SSD训练代码基于pytorch搭建代码
  • (Java数据结构)ArrayList
  • (Redis使用系列) Springboot 使用redis实现接口Api限流 十
  • (编程语言界的丐帮 C#).NET MD5 HASH 哈希 加密 与JAVA 互通
  • (二)c52学习之旅-简单了解单片机
  • (算法二)滑动窗口
  • (五)关系数据库标准语言SQL
  • (转)Mysql的优化设置
  • .locked1、locked勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .NET I/O 学习笔记:对文件和目录进行解压缩操作
  • .NET 使用 JustAssembly 比较两个不同版本程序集的 API 变化
  • .Net+SQL Server企业应用性能优化笔记4——精确查找瓶颈
  • .NET单元测试
  • .net的socket示例
  • .net网站发布-允许更新此预编译站点
  • .NET下的多线程编程—1-线程机制概述
  • /var/log/cvslog 太大
  • @ComponentScan比较
  • @Transactional注解下,循环取序列的值,但得到的值都相同的问题
  • [ Linux 长征路第二篇] 基本指令head,tail,date,cal,find,grep,zip,tar,bc,unname