搞懂进程、线程、协程

一、进程

1.什么是进程

进程是计算机资源分配的最基本单位,是程序的一个运行实例。创建进程就是在内存中申请一块独立的内存空间,将需要运行的代码放进行执行。所以,一个进程就是一块独立的内存空间。

  • 程序就是一堆躺在硬盘上的代码,是“死的”。
  • 进程则表示程序正在执行的过程,是“活的”。
  • 代码被运行中就是进程,进程一定是在内存中运行着的。

2.进程的三个基本状态

现在假设有一台计算机只能同时运行1个程序,现在打开了程序A,则表示A进程在运行态。
再打开程序B,A进程则被切换到后台,A进程的状态称为阻塞态,B进程是运行态;
将程序B切换到程序A,在切换的过程中,A进程会迅速从阻塞态切换到准备就绪的就绪态;程序切换成功以后,A进程会变成运行态,B进程则变为阻塞态。

在这里插入图片描述

3.父进程与子进程

打开一个进程A,在这个进程中再创建多个新进程B,可以称为A进程是其他刚刚创建进程B的父进程,新进程B是进程A的子进程。

两个进程之间的数据是互相隔离的,不能直接访问。
进程间通信需要借助工具进行,比如:队列、堆栈、管道(subprocess)。

二、线程

1.什么是线程

打开一个新的程序,会在系统中开启一个新的进程,但进程并不负责具体的运行,具体的运行由线程执行。

在这里插入图片描述
进程是资源单位,线程是执行单位。

线程是进程内的具体执行单位,没有父线程或子线程的说法。

在这里插入图片描述
线程是操作系统进行运算调度的最小单位,允许程序并发运行多个任务,位于进程内部,是进程内的实际运作单位。每个线程代表进程中的一个单一顺序的控制流,意味着它可以独立执行代码、维护自己的程序计数器、寄存器集合和堆栈。简而言之,线程让程序能够同时处理多个操作,提高了程序执行的效率和响应速度

2.线程的特点

  • 轻量级:相对于进程,创建和切换线程的开销较小,因此可以更灵活地管理并发任务。

  • 资源共享:同一进程内的线程可以访问该进程的共享内存和资源,如全局变量、文件句柄等,这简化了数据交换,但也可能引发同步问题。

  • 独立执行路径:尽管线程共享进程资源,但每个线程都有自己的执行序列和程序计数器,可以独立执行不同的代码段。

  • 并发与并行:线程使得程序能够在单个处理器上通过时间片轮转实现并发执行(看起来同时进行),而在多处理器系统上则真正实现了并行计算,即同时在不同处理器上执行。

  • 调度与管理:线程可以由操作系统内核直接管理(内核线程),也可以由用户库在用户空间管理(用户线程),或者采用混合模式,如Windows 7的线程模型。

三、协程

1.什么是协程

注意,计算机内部没有协程这个东西的存在,协程是由程序员设计好的一种完美运行多个程序的算法或技术

在这里插入图片描述
平常电脑在运行QQ、表格、视频、文字等多个软件的时候为什么不会卡死,就基于协程的原理。

假设一台电脑当下只能同时运行1个进程,但在运行多个程序并不会产生卡顿的原因在于,我们不断在各种程序之间切换的过程中。运行态、阻塞态、就绪态在高速进行切换,我们看到的同时运行多个程序,实际上一直都只有单个程序正在运行中。

2.协程的概念和特点

程序组件:
协程是一种在单个线程内实现并发执行的程序组件,它们可以被视为具有协作性质的子程序。

  • 轻量级:
    相较于操作系统级别的线程,协程更轻量级,因为它们通常不需要操作系统级别的上下文切换,这使得创建和销毁协程的成本更低。

  • 用户态调度:
    协程的调度通常由用户代码控制,而不是由操作系统内核管理,这意味着协程之间的切换不会涉及昂贵的系统调用。

  • 栈管理:
    每个协程有自己的独立栈,相比于线程,协程的栈大小通常较小,节省资源。

  • 合作式调度:
    协程的执行流由其自身决定何时暂停和恢复,这种机制称为合作式多任务,意味着协程必须主动交出控制权才能切换到另一个协程。

  • 非抢占式:
    由于协程的执行不是被强制中断的,所以在没有设计好协作机制时,如果一个协程不主动暂停,其他协程无法强制执行。

  • 高效率并发:
    协程在处理大量并发任务时,由于避免了频繁的上下文切换,所以通常比线程更加高效。

  • 应用场景:
    协程常用于异步编程、网络I/O操作、数据流处理、游戏编程等领域,特别适合于那些需要频繁交替运行的逻辑片段。

  • 语言支持:
    许多现代编程语言,如Python、Go、Kotlin、C#等,都提供了原生支持或库来实现协程。好消息是java21正式提供了协程的支持,内部叫虚拟线程。关于java的虚拟线程,我后面会研究下专门写一篇文章来介绍用法。

总之,协程提供了一种高效且灵活的方式来组织和执行并发代码,尤其在处理I/O密集型任务时,可以显著提高程序的性能和可读性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值