进程(process)、线程(thread)、协程 (Coroutine) 的区别

说到协程(Coroutine),我们必须提到两个名称相似的东西。
在操作系统(os)级别,有进程(process)和线程(thread)两个(仅从我们常见的讲)实际的“东西”(不说概念是因为这两个家伙的确不仅仅是概念,而是实际存在的,os的代码管理的资源)。这两个东西都是用来模拟“并行”的,写操作系统的程序员通过用一定的策略给不同的进程和线程分配CPU计算资源,来让用户“以为”几个不同的事情在“同时”进行“。在单CPU上,是os代码强制把一个进程或者线程挂起,换成另外一个来计算,所以,实际上是串行的,只是“概念上的并行”。在现在的多核的cpu上,线程可能是“真正并行的”。

Coroutine,翻译成”协程“,初始碰到的人马上就会跟上面两个概念联系起来。直接先说区别,Coroutine是编译器级的,Process和Thread是操作系统级的。Coroutine的实现,通常是对某个语言做相应的提议,然后通过后成编译器标准,然后编译器厂商来实现该机制。Process和Thread看起来也在语言层次,但是内生原理却是操作系统先有这个东西,然后通过一定的API暴露给用户使用,两者在这里有不同。Process和Thread是os通过调度算法,保存当前的上下文,然后从上次暂停的地方再次开始计算,重新开始的地方不可预期,每次CPU计算的指令数量和代码跑过的CPU时间是相关的,跑到os分配的cpu时间到达后就会被os强制挂起。Coroutine是编译器的魔术,通过插入相关的代码使得代码段能够实现分段式的执行,重新开始的地方是yield关键字指定的,一次一定会跑到一个yield对应的地方。

1.进程

进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。每个进程都有自己的独立内存空间,不同进程通过进程间通信来通信。由于进程比较重量,占据独立的内存,所以上下文进程间的切换开销(栈、寄存器、虚拟内存、文件句柄等)比较大,但相对比较稳定安全。

在这里插入图片描述

2.线程

线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源。线程间通信主要通过共享内存,上下文切换很快,资源开销较少,但相比进程不够稳定容易丢失数据。

3.协程

协程是一种用户态的轻量级线程,协程的调度完全由用户控制。协程拥有自己的寄存器上下文和栈。 协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈,直接操作栈则基本没有内核切换的开销,可以不加锁的访问全局变量,所以上下文的切换非常块。

协程与线程进行比较

1.一个线程可以多个协程,一个进程也可以单独拥有多个协程。

2.线程进程都是同步机制,而协程则是异步。

3.协程能保留上一次调用时的状态,每次过程重入时,就相当于进入上一次调用的状态。

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

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

相关文章

redis面试题

面试题汇总 Redis的使用场景什么是缓存穿透,有什么解决方案?能否介绍一下布隆过滤器布隆过滤器? 什么是缓存击穿 ? 怎么解决 ?什么是缓存雪崩 ? 怎么解决 ?redis做为缓存,mysql的数据如何与redis进行同步呢?&#…

【C++】C++11的新特性

文章目录 1. C11简介2. 统一的列表初始化2.1 {}统一初始化2.2 std::initializer_list 3. 声明的新方式和范围for循环3.1 decltype3.2 auto&nullptr&范围for循环 4. STL的变化4.1 新容器4.2 新接口 1. C11简介 ​ 在2003年C标准委员会曾经提交了一份技术勘误表(简称TC1…

MySQL中这些关键字的用法,佬们get到了嘛

前言: 最近粉丝问了一个问题,是关于Limit分页的用法,他没有理解清楚,因此本篇文章主要讲解MySQL的关键字的知识。该专栏比较适合刚入坑Java的小白以及准备秋招的大佬阅读。 如果文章有什么需要改进的地方欢迎大佬提出&#xff0c…

【Unity】HyBridCLR初探

完成目标: 创建热更新程序集加载热更新程序集,并执行其中热更新代码,打印 Hello, HybridCLR修改热更新代码,打印 Hello, World准备环境​ 安装Unity HybridCLR也支持2019.4.x,但新手请先按照下面要求跑通流程后,再根据安装HybridCLR文档尝试2019.4.x。 安装 2020.3.26+…

基本介绍实施工程师,以及实施工程师在软件开发的作用

一.软件实施介绍 1.什么是软件实施? 软件实施是指将软件开发完成后,按照计划进行部署和安装,使软件能够在目标环境中正常运行的过程。下面是软件实施的一般步骤: 1. 规划和准备:确定实施的范围、目标和计划&#xff0…

Oracle中的连接方式

Oracle中的连接方式 对于数据库中表与表之间的连接(内连接、外连接)都可以看成集合之间的运算操作。 内连接 select * from a_table a inner join b_table b on a.id b.id; 相当于求两个集合中满足条件的结果,即交集。 外连接 左/外连接&a…

清华青年AI自强作业hw5:基于CNN实现CIFAR10分类任务

清华青年AI自强作业hw5:基于CNN实现CIFAR10分类任务 简述作业实现遇到的问题相关链接 一起学AI系列博客:目录索引 简述 hw5作业为利用深度卷积神经网络实现CIFAR_10数据集十分类问题,帮助理解CNN的前向传播结构。 CIFAR-10是一个常用的彩色图…

能够辅助用户分类管理个人任务的备忘录哪款比较好?

当我回忆起自己曾经忙碌的日子,我意识到在处理多种事务时,一个高效的分类管理系统是多么的重要。在那段时间里,我不仅要应对工作上的各种任务,还要处理个人事务和日常琐事。随着任务的增加,我发现自己越来越难以有效地…

基于深度学习的高精度红外行人车辆检测识别系统(PyTorch+Pyside6+YOLOv5模型)

摘要:基于深度学习的高精度红外行人车辆检测识别系统可用于日常生活中或野外来检测与定位红外行人车辆目标,利用深度学习算法可实现图片、视频、摄像头等方式的红外行人车辆目标检测识别,另外支持结果可视化与图片或视频检测结果的导出。本系…

Tomcat部署及优化

一、Tomcat概述1.1 Tomcat介绍1.2 servlet介绍1.3 JSP介绍 二、Tomcat核心组件2.1 Tomcat三大容器2.2 Tomcat功能组件结构2.2.1 Container结构分析 2.3 Tomcat处理请求过程 三、Tomcat服务部署3.1 关闭防火墙,将安装 Tomcat 所需软件包传到/opt目录下3.2 安装JDK3.3…

【Web3】认识以太坊钱包

目录 区块链钱包概念 密码 私钥 Private Key 公钥Public Key Keystore 助记词 Mnemonic 如何解锁账户 区块链钱包概念 钱包用来存钱的,在区块链中,我们的数字资产都会对应到一个账户地址上, 只有拥 有账户的钥匙(私钥&…

【Java可执行命令】(五)打包部署工具 jar:深入解析应用程序打包、分发和部署工具jar ~

Java可执行命令详解之jar 1️⃣ 概念2️⃣ 优势和缺点3️⃣ 使用3.1 语法格式:创建jar文件3.1.1 参数:-cf3.1.2 参数:-tf3.1.3 参数:-i3.1.4 参数:-v3.1.5 参数:-e 3.2 运行jar文件 4️⃣ 应用场景5️⃣ 注…