貔貅云原生

貔貅云原生

进程、线程、协程

91
0
0
2023-12-04
进程、线程、协程

并发与并行

在学习进程、线程、协程之前需要先了解一下并发与并行

  • 并发是指在同一时间间隔内处理多个任务。这些任务可能不是同时执行的,而是交替进行,通过快速的上下文切换来实现,从而给人造成了同时执行的错觉。在并发处理中,系统在同一时间点可以处理多个任务,但它们的实际执行时间可能有重叠。并发通常用于解决多任务处理、提高资源利用率等问题,适用于多核CPU、网络通信、I/O等情况。

  • 并行是指同时执行多个任务,每个任务在不同的处理器、核心或计算单元上独立运行,彼此互不干扰。在并行处理中,任务在同一时间点真正同时执行,可以利用多个处理单元的计算能力。并行通常用于处理计算密集型任务,充分利用多核处理器等硬件,提高整体计算速度。

总结来说:

并发是在相同时间段内处理多个任务,通过快速切换实现任务交替执行。
并行是同时在多个处理单元上执行多个任务,每个任务独立运行。

这两个概念在计算机领域中非常重要,它们帮助我们理解多任务处理、多核处理器、分布式系统等情况下的任务调度和执行方式。

概念

在Linux系统中,进程、线程和协程是并发编程中的三个重要概念,它们在不同层次上处理并发任务。

  • 进程(Process)

    进程是操作系统分配资源的基本单位,每个进程都有独立的地址空间、内存、文件描述符等。
    进程之间相互隔离,互不影响。每个进程都拥有自己的执行环境。
    每个进程至少有一个线程,称为主线程(main thread)。主线程在进程创建时就存在,可以创建更多的线程。

  • 线程(Thread)

    线程是在进程内部执行的执行单元,共享进程的地址空间和资源,但每个线程有自己的栈空间。
    多个线程可以在同一个进程内并发执行不同的任务。
    线程之间共享进程的数据,可以通过共享内存来进行通信。
    在有些操作系统中,如Linux,线程被实现为轻量级进程,因此线程之间的切换比进程之间的切换开销更小。

  • 协程(Coroutine)

    协程是一种用户级的轻量级线程,与操作系统线程不同,协程的调度完全由程序控制。
    协程是在一个线程内部执行的,通过协程库(如Python的asyncio)来实现切换。
    协程通常用于处理高并发的I/O密集型任务,例如网络请求,因为它们能够有效地避免线程切换的开销。
    协程之间通过异步方式进行切换,可以在一个线程内同时处理多个任务。
    总的来说,进程包含线程,线程包含协程。进程提供资源隔离,线程提供并发执行的上下文共享,协程提供更加灵活的任务切换机制。选择哪种并发编程方式取决于应用的性质和需求。

进程

有一个知识点是 CPU 无法做并发处理,CPU 是在快速处理一个进程数据,到了执行时间后会把进程数据保存在 CPU 的寄存器中,再执行下一个进程数据,然后保存在指令寄存器中,再次处理上一个进程没处理完但保存在寄存中的数据。这个就叫上下文切换

进程是操作系统中的一个基本概念,是一个正在执行中的程序实例。它是资源分配的基本单位,代表了程序在计算机上的一次执行过程。每个进程都有自己的内存空间、代码、数据、打开的文件、系统资源等。所以一个进程代表一个独立的程序

线程

在一个进程内多个线程之间的有共享内存也有私有内存,这些线程会共享相同的虚拟内存和全局变量等资源。这些资源在上下文切换时是不需要修改的。另外,线程也有自己的私有数据,比如栈和寄存器等,这些在上下文切换时也是需要保存的。
当单个 CPU 使用上下文切换执行到进程时,其实也不是并发执行进程内部线程,只不过由于线程之间需要存入寄存器的数据比进程少,处理非常快以为是同时进行,实际上还是单个线程执行。

当你有2个 1核心2线程 的CPU时,那么你的线程并行最多可以做到 4 个并行,因为这样需要开启超线程,往往是每个核心 1 个线程工作这个涉及寄存器地址、执行单元等。一般情况如果 2 个核心并行,那么 2 个核心的线程只有一个工作另一个等待。所以一般情况时 2个线程并行执行并发任务。

协程

协程(Coroutine)是一种轻量级的线程(或称为协作式线程)实现,不同于操作系统管理的线程和进程。协程是一种用户级别的线程,由程序员在代码中显式地管理,而不是由操作系统进行管理。它提供了一种协作式的多任务处理方式,允许多个协程在同一个线程内按照一定的调度顺序交替执行。

当涉及到10个协程时,这意味着你有10个可以在程序中进行协作式并发的执行单元。这些协程可以在同一个线程内执行,并由你编写的代码控制何时切换它们的执行。协程通常用于解决异步编程问题