线程与协程

article/2025/11/6 8:55:58

线程与协程

  • 概念
    • 进程
      • 【进程间通信(IPC)】
    • 线程
    • 协程
  • 区别
  • 场景
    • 计算密集型
    • IO密集型
    • 两种操作如何优化
    • 哪些语言对多协程的支持

概念

进程

二进制可执行文件在计算机内存里的一个运行实例。比如.exe文件是个类,进程就是new出来的那个实例,计算机资源分配的基本单位。

进程,直观点说,保存在硬盘上的程序运行以后,会在内存空间里形成一个独立的内存体,这个内存体有自己独立的地址空间,有自己的堆,上级挂靠单位是操作系统。操作系统会以进程为单位,分配系统资源(CPU时间片、内存等资源),进程是资源分配的最小单位。

【进程间通信(IPC)】

管道(Pipe)、命名管道(FIFO)、消息队列(Message Queue) 、
信号量(Semaphore) 、共享内存(Shared Memory);套接字(Socket)。

在这里插入图片描述

线程

程序执行的最小单元,是由寄存器集合和堆栈组成,线程是进程中的一个实体,可共享同一进程中所拥有的全部资源。
线程,有时被称为轻量级进程(Lightweight Process,LWP),是操作系统调度(CPU调度)执行的最小单位。

  • 调度
    线程作为调度和分配的基本单位,进程作为拥有资源的基本单位;

  • 并发性
    不仅进程之间可以并发执行,同一个进程的多个线程之间也可并发执行;

  • 拥有资源
    进程是拥有资源的一个独立单位,线程不拥有系统资源,但可以访问隶属于进程的资源。
    进程所维护的是程序所包含的资源(静态资源), 如:地址空间,打开的文件句柄集,文件系统状态,
    信号处理handler等;线程所维护的运行相关的资源(动态资源),如:运行栈,调度相关的控制信息,
    待处理的信号集等;

  • 系统开销
    在创建或撤消进程时,由于系统都要为之分配和回收资源,导致系统的开销明显大于
    创建或撤消线程时的开销。但是进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对
    其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,
    但线程之间没有单独的地址空间,一个进程死掉就等于所有的线程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。

协程

协程(coroutine)是一种程序组件,是一种比线程更加轻量级的存在。正如一个进程可以有多个线程,一个线程可以有多个协程。

「协程 Coroutines」源自 Simula 和 Modula-2 语言,这个术语早在 1958 年就被 Melvin Edward
Conway 发明并用于构建汇编程序, 说明协程是一种编程思想,并不局限于特定的语言。
协程不是被操作系统内核所管理,而完全是由程序所控制(也就是在用户态执行)有自己的寄存器上下文和栈。协程切换时,
将寄存器和栈保存到其他地方,等切回来的时候,恢复保存到寄存器上下文和栈。

  1. 程序可以控制协程的暂停,如Python关键字yield,Go关键字go,都可实现协程暂停,而线程的阻塞是有操作系统控制。
  2. 在任务调度上,协程是弱于线程的。但是在资源消耗上,协程则是极低的。一个线程的内存在 MB 级别,而协程只需要 KB 级别。而且线程的调度需要内核态与用户的频繁切入切出,资源消耗也不小。

区别

对操作系统来说,线程是最小的执行单元,进程是最小的资源管理单元。

在这里插入图片描述
在这里插入图片描述

  • 并发:CPU在若干程序间多路复用,本质是cpu通过时间片进行切换。
  • 并行:若干线程同一时刻发生。

在这里插入图片描述

  1. 程序可以控制协程的暂停,如Python关键字yield,Go关键字go,都可实现协程暂停,而线程的阻塞是有操作系统控制。
  2. 在任务调度上,协程是弱于线程的。但是在资源消耗上,协程则是极低的。一个线程的内存在 MB 级别,而协程只需要 KB 级别。而且线程的调度需要内核态与用户的频繁切入切出,资源消耗也不小。
    协程优点:
    节省内存
    节省分配线程的开销
    节省线程切换带来的开销

在这里插入图片描述

协程线程进程
原理协程有自己的寄存器上下文和栈。协程切换时,将寄存器和栈保存到其他地方,等切回来的时候,恢复之前保存到寄存器上下文和栈。分配CPU资源。多个线程共享堆和方法区资源,每个线程有自己的程序计数器、虚拟机栈和本地方法栈分配系统资源,标识任务。进程占有的资源有:①地址空间②全局变量③文件描述符④各种硬件资源。
优点1、无需协程上下文切换的开销2、无需原子操作锁定及同步的开销(不会被线程调度机制打断的操作)通过判断返回状态3、高并发+高扩展+低成本。注意:python中实现协程通过generater的yield实现1、有独立的运行栈和程序计数器,线程之间切换开销小。2、共享进程的系统资源1、有独立的上下文。2、进程之间的系统资源相互独立。3、一个进程崩溃不会影响其他的进程。
缺点1、无法利用多核资源:协程的本质是单线程,需要线程配合才可以在多CPU上运行。2、进行阻塞操作(如IO操作)会阻塞掉整个程序1、一个线程的崩溃,会影响本进程的所有线程。2、有锁机制,可能会死锁。进程切换开销大,不利于资源的有效利用

场景

计算密集型

系统涉及大部分计算,逻辑判断,循环,导致CPU占用率高。

IO密集型

网络传输,读取硬盘,其他组件频繁交互。更实用多协程多线程的场景。

两种操作如何优化

算法优化,缓存,范围查询改为精准定位
减少IO,一次性加载

哪些语言对多协程的支持

  • Lua语言

Lua从5.0版本开始使用协程,通过扩展库coroutine来实现。

  • Python语言

正如刚才所写的代码示例,python可以通过 yield/send 的方式实现协程。在python 3.5以后,async/await 成为了更好的替代方案。

  • Go语言

Go语言对协程的实现非常强大而简洁,可以轻松创建成百上千个协程并发执行。

  • Java语言

如上文所说,Java语言并没有对协程的原生支持,但是某些开源框架模拟出了协程的功能,有兴趣的小伙伴可以看一看Kilim框架的源码


http://chatgpt.dhexx.cn/article/uwjtGFKx.shtml

相关文章

总结:协程与线程

一、介绍 本文主要梳理下进程,线程,协程的概念、区别以及使用场景的选择。 二、进程 我们知道,一切的软件都是跑在操作系统上,真正用来干活 (计算) 的是 CPU。早期的操作系统每个程序就是一个进程,知道一个程序运行完…

Java线程协程

目录 线程的实现(OS&&JVM) 1.内核线程实现 2.用户线程实现 3.混合实现 4.Java线程的实现 ——如何实现不受Java虚拟机规范的约束 Java线程调度——系统自动完成(可能被干预) Java线程状态转换 内核线程的局限 协…

CDH6.3.2安装文档

正式安装之前,先说明一下CDH是基于Apache Hadoop及相关项目的发行版。CDH通过WEB界面管理,并提供了hadoop的两个核心功能:可扩展存储和分布式计算,以及企业级的重要功能。CDH是遵循Apache-licensed的开源软件,提供了基…

CDH数仓项目(一) —— CDH安装部署搭建详细流程

0 说明 本文以CDH搭建数据仓库,基于三台阿里云服务器从零开始搭建CDH集群,节点配置信息如下: 节点内存安装服务角色chen10216Gcloudera-scm-serverchen1038Gcloudera-scm-agentchen1048Gcloudera-scm-agent 上传需要用到的安装包&#xff…

CDH5.8安装说明

#CDH5.8安装说明 (Hadoop) 使用过Ambari,不知道是因为没有商业运作支撑还是社区活跃度有限,总体管理能力只能算凑合。很多Hadoop组件版本都不高,Spark也才1.3.X,Sqoop还是1.4.6.2.3,相对版本都比较低,而且…

大数据CDH安装详细教程

1.环境准备 1.1 服务器配置(理想配置) 1.2 修改主机名和hosts文件(所有节点) [roothadoop001 ~]# vim /etc/hosts vim /etc/hostname1.3 关闭防火墙 systemctl stop firewalld systemctl disable firewalld1.4 SSH免密登录(主节点) ssh-keygen -t rsa #分发到所有节点 ssh…

CDH6安装

官方文档 https://www.cloudera.com/documentation/enterprise/6/6.0/topics/installation.html 安装之前 JDK兼容性在不同的Cloudera Manager和CDH版本中也有所不同。某些版本的CDH 5与JDK 7和JDK 8兼容。在这种情况下,请确保所有服务都部署在同一主要版本上。例…

Cloudera(CDH) 简介和在线安装

实验背景 笔者需要维护线上的hadoop集群环境,考虑在本地搭建一套类似的hadoop集群,便于维护与管理。 Cloudera 简介 经过搜索发现Cloudera产品很适合笔者当前需求,于是开始研究Cloudera(CDH)的安装与使用,参…

CDH6.3.1安装

CDH6.3.1安装遇到很多问题,我想主要是由于条件有限,毕竟自己的电脑内存不如专业集群的内存大(如果是内存和硬盘充足,有些是可以避免的,甚至不会出现报错的情况),这里就介绍一下我用VMware安装的…

CDH安装配置

Cloudera5.14配置 准备工作 软件下载软件安装 JDK安装 所有节点 安装环境变量配置 sudo vim /etc/profile export JAVA_HOME/usr/java/default export PATH$JAVA_HOME/bin:$PATH 使用root用户 echo "JAVA_HOME/usr/java/default" >> /etc/environment …

CDH 6.3.2 安装(一)

目录 一、CDH框架介绍 1、CDH介绍 2、CDH官方网址 3、CDH官方文档 4、CDH集群扩容 5、CDH硬件要求 6、CDH k8s服务开启 二、CDH依赖安装 1、安装通用依赖 2、网络工具安装 3、防火墙服务安装 4、进程树形工具安装 5、其它依赖安装 三、Linux系统配置 1、主机名配…

CDH安装手册(自整理)

文章目录 前言1.组件版本2.集群规划(三台服务器为例)3.配置linux静态IP4.修改hosts文件,并实现免密登录5.创建集群分发脚本6.关闭防火墙和SELINUX(所有节点)7.配置NTP时钟同步8.安装jdk和mysql9.搭建本地yum源并安装10…

安装篇2 - 安装CDH

登陆Cloudera Manager平台 http://192.168.60.100:7180 账号密码:admin/admin 1.1 1.2 1.3 免费 2.1 2.2 2.3 2.4 选择CDH和Flink 2.5 将parcel包内的Hadoop,Hive等组件分发到各个节点进行解压激活 2.6 3.1 自行选择 自定义选择Zookeeper&#xff…

CDH5(CDH 5.16.1)安装

日萌社 人工智能AI:Keras PyTorch MXNet TensorFlow PaddlePaddle 深度学习实战(不定时更新) CDH 6系列(CDH 6.0.0、CDH 6.1.0、CDH 6.2.0等)安装和使用 CDH5(CDH 5.16.1)安装 linux配置 1.…

CDH 6.3.2 安装(二)

目录 一、网络配置 1、静态网卡配置 2、网关配置 3、停止networkManager服务 4、重启网卡服务 二、配置静态网卡 1、修改网络配置 2、修改主机名 三、加载MySQL驱动包 1、准备文件 2、下载地址 3、加载MySQL驱动包 四、安装 cloudera-manager-daemons 五、保存当…

CDH6.3.1安装指南

CDH安装指南!!!! CDH简介 CDH基于Web的用户界面,支持大多数Hadoop组件,包括HDFS、MapReduce、Hive、Pig、 HBase、Zookeeper、Sqoop,简化了大数据平台的安装、使用难度。 Cloudera Manager的功能&#xff…

linux安装cdh

环境准备: linux版本:阿里云ecs,Red Hat 4.8.5,四台机器(一台主节点,三台从节点) cdh版本:cdh-6.1.0-install-soft.tar.gz,离线安装 java版本: jdk1.8.0_18…

ClouderaCDH安装配置说明

实验环境 实验环境:Win7下vmware虚拟机 操作系统:CentOS 6.5 x64 Clouder Manager:5.14.0 CDH:5.14.0 安装说明 官方共给出了3中安装方式:第一种方法必须要求所有机器都能连网,由于最近各种国外的网站被…

CDH 6系列(CDH 6.0.0、CDH 6.1.0、CDH 6.2.0等)安装和使用

日萌社 人工智能AI:Keras PyTorch MXNet TensorFlow PaddlePaddle 深度学习实战(不定时更新) CDH 6系列(CDH 6.0.0、CDH 6.1.0、CDH 6.2.0等)安装和使用 CDH5(CDH 5.16.1)安装 CDH 6系列&am…

CDH6.3.2详细安装

CDH(Cloudera’s Distribution, including Apache Hadoop),是Hadoop众多分支中的一种,由Cloudera维护,基于稳定版本的Apache Hadoop构建,并集成了很多补丁,可直接用于生产环境。 CDH优点: 1、提供基于web…