进程、线程、协程

老是描述不清楚进程、线程、协程的概念。属于脑子里面有。但是说也说不出来。今天记录一下


进程


概念

在计算机中,进程(Process)是指正在运行的一个程序的实例。它是操作系统进行资源分配和调度基本单位
每个进程都有独立的内存空间执行上下文,包括代码、数据、堆栈等。进程可以包含一个或多个线程,每个线程都共享进程的资源
进程具有以下几个主要特点:


  • 独立性 每个进程相互独立,拥有自己的内存空间和资源。
  • 并发性 多个进程可以同时运行,由操作系统进行调度和分配时间片。
  • 隔离性 进程之间相互隔离,一个进程的错误不会直接影响其他进程的正常运行。
  • 可抢占性 操作系统可以根据优先级和时间片等策略暂停或切换进程,以保证公平性和高效性。
  • 通信与同步 进程之间可以通过进程间通信(IPC)机制进行数据交换和共享资源。
  • 生命周期 进程从创建到终止经历不同的状态,如就绪、运行、阻塞、退出等。

进程是操作系统的核心概念,它使得计算机可以同时运行多个程序,并为它们提供必要的资源和环境。通过进程管理,操作系统可以实现任务调度内存管理安全隔离等重要功能。

说一下场景

假设有一个任务,需要将一批图片进行压缩处理,并保存到指定目录。我们可以用单进程和多进程两种方式来完成这个任务。


单进程方式

在单进程方式下,只使用一个进程来依次处理每张图片

  1. 加载第一张图片。
  2. 对该图片进行压缩处理。
  3. 保存处理后的图片到指定目录。
  4. 依次处理下一张图片,重复以上步骤,直至所有图片处理完毕。

多进程方式

在多进程方式下,我们可以创建多个进程同时处理不同的图片

  1. 创建多个进程,每个进程负责处理一张图片。
  2. 进程之间并行地加载、处理和保存图片。
  3. 等待所有进程执行完毕,任务结束。
对比两种方式,多进程方式具有以下优点:
  • 提高处理速度:由于多个进程可以同时处理多张图片,因此任务的整体处理速度更快。
  • 充分利用资源:多进程可以充分利用多核处理器的计算能力,提高系统的资源利用率。
  • 提高响应性:如果遇到某张图片处理时间较长,仅该进程会受影响,其他进程仍可继续处理其他图片,提高系统的响应性。
多进程方式也要考虑一些因素:
  • 进程间通信:如果进程之间需要通信或共享数据,就需要使用进程间通信机制,例如管道共享内存
    -资源消耗:创建和管理多个进程会占用较多的系统资源,包括内存和CPU资源。

线程


概念

在计算机中,线程Thread是程序执行的最小单位,是进程中的一个执行单元。线程是操作系统能够进行运算调度的最小单位,它由线程ID 程序计数器 寄存器集合 堆栈组成。

与进程相比 线程更轻量级执行实体,多个线程共享同一进程的资源


  • 线程是进程的一部分 进程是分配资源的基本单位,而线程是在进程内执行的流程。一个进程可以包含多个线程,这些线程共享进程的内存空间和其他资源。
  • 线程共享进程资源 不同线程之间共享进程的代码段、静态变量、全局变量和打开的文件等资源。这意味着多个线程可以同时访问和修改同一份数据,但也需要注意同步和互斥机制来避免并发访问带来的问题。
  • 线程之间切换开销较小 相比于进程间的上下文切换,线程之间的切换开销更小。因为线程共享进程的地址空间和其他资源,所以线程切换只需要切换寄存器和程序计数器等少量的上下文信息。
  • 多线程提高并发性能 通过多线程的并发执行,可以提高系统的并发性能和响应能力。多个线程可以在不同的CPU核心上并行执行,充分利用多核处理器的计算能力。
  • 线程调度由操作系统控制 线程的创建、销毁和调度由操作系统负责。操作系统使用调度算法来决定哪些线程应该优先执行,以及何时进行线程的切换。
  • 线程是进程内的执行单元 它们共享进程的资源并具有较小的切换开销。多线程的并发执行提高了系统的性能和响应能力。线程和进程共同构成了多任务处理和并发编程的基础。

线程和进程的区别和场景


  • 资源占用 进程相对于线程来说,具有独立的资源分配。每个进程都有自己的地址空间、堆栈和文件描述符等资源,这些资源在多进程的情况下不会被其他进程共享。而线程共享同一进程的资源,只需较少的额外开销。因此,如果需要独立的资源,如打开文件、数据库连接等,使用进程更为合适
  • 切换开销 由于进程具有独立的地址空间和上下文信息,进程间的切换开销比较大。而线程共享进程的资源,切换时只需切换少量的上下文信息,所以线程之间的切换开销相对较小。如果需要频繁进行切换或实现高并发,使用线程可以提高系统性能
  • 同步和通信 在多线程编程中,线程之间共享内存空间,因此共享数据的访问需要进行同步和互斥操作,以避免竞态条件和数据不一致问题。而在多进程中,进程之间通常通过进程间通信(IPC)来进行数据交换,例如管道、消息队列等。如果需要共享大量数据且访问频繁,使用线程更为方便。如果需要隔离和安全性较高,使用进程更合适。
  • 故障隔离 由于线程共享进程的资源,一个线程的错误可能会影响到整个进程,甚至导致进程崩溃。而进程之间相互独立,一个进程的错误不会波及其他进程。如果需要故障隔离,以避免一个任务的错误影响到其他任务,使用进程会更安全。
使用线程的场景包括需要共享数据 频繁切换 对性能要求较高的并发编程 使用进程的场景 包括需要独立资源、故障隔离、安全性较高的环境。在实际应用中,需要根据具体需求和系统环境来选择合适的多任务模型。有时也可以结合使用线程和进程,根据具体情况来平衡资源利用和系统性能。

协程

概念

  • 协程(Coroutine)一种轻量级的线程 也被称为用户态线程或纤程。与传统的线程相比,协程具有更低的切换开销和更高的执行效率,可以实现更灵活的控制流。

  • 协程可以看作是一种特殊的子例程,它可以在执行过程中挂起和恢复,以便在需要时暂停和继续执行。与线程不同,协程由程序员手动控制调度和切换,而不是由操作系统进行上下文切换。


  • 协程是非抢占式的 协程不会被强制中断,只有在显式的挂起点yield主动释放执行权后,才会切换到其他协程。这意味着协程可以自由地决定何时让出执行权。

  • 协程之间切换开销低 与线程切换相比,协程的切换开销非常低。协程的切换只涉及保存和恢复协程的栈帧,不需要切换内核态和用户态之间的上下文,因此效率更高。

  • 共享状态 协程通常运行在同一个线程中,它们共享线程的资源和内存空间。这样可以避免多线程中的锁和同步开销,简化了并发编程的复杂性。

  • 异步编程 协程天然适合用于异步编程,通过协程可以更方便地实现异步任务的挂起、等待和回调。协程可以用于处理大量的I/O操作,提高程序的并发性和响应能力。

协程在许多场景下都有应用,例如网络编程、并发任务调度、爬虫程序等。它们可以简化代码结构、提高执行效率,并且相对于传统的线程模型更加灵活和可控。在Python中,使用asyncio库可以很方便地实现协程编程,其他编程语言如Go、JavaScript等也提供了类似的协程支持。

协程和线程、进程的区别以及应用场景

执行单元 线程和进程都是操作系统调度的执行单元,而协程则是由程序员控制的执行单元。

  • 线程是操作系统内核可调度的最小单位 多个线程共享同一个进程的资源。线程之间切换需要操作系统介入,切换开销较大。
  • 进程是独立的执行环境 拥有独立的内存空间和资源。进程之间切换同样需要操作系统介入,切换开销更大。进程间通信需要使用操作系统提供的机制。
  • 协程由程序员控制 可以在代码的特定位置进行切换,切换开销非常小。协程之间通过代码来交替执行,共享线程的资源和内存空间。

调度方式 线程和进程通过操作系统调度器进行任务的切换,而协程通过代码的显式控制进行任务切换。

  • 线程和进程的调度由操作系统自动完成 程序员无法精确控制线程/进程的切换时机和顺序。
  • 协程的调度完全由程序员控制 可以根据需要在代码的适当位置进行切换,灵活性更高。

切换开销 协程的切换开销通常比线程和进程小很多。

  • 线程和进程的切换涉及到操作系统上下文的保存和恢复,开销较大 切换频繁可能会影响程序的性能。
  • 协程的切换只需要保存和恢复协程的栈帧,开销非常小 因此,协程适合处理大量的细粒度任务,在高并发和异步编程中有很好的性能表现。

应用场景


  • 线程适合用于并发任务多用户的服务器程序、I/O密集型应用
  • 进程适合用于需要隔离资源和安全性较高的场景操作系统级的任务 计算密集型应用
  • 协程适合用于高并发和异步编程网络编程 爬虫 事件驱动编程 等。

注意 在实际应用中,通常会综合使用这些多任务编程方式来充分发挥优势。例如,可以使用多线程/多进程编写一个并发的服务器在内部处理各个请求时使用协程来提高性能和灵活性 选择合适的方式要根据具体的需求和性能要求来决定。
posted @ 2023-07-05 16:51  Death-Satan  阅读(49)  评论(0编辑  收藏  举报