线程,进程,协程

定义

进程:进程是资源调度的最基本单位。每个进程都有自己的地址空间、内存、数据栈等,是操作系统中的资源分配单位。进程之间是相互独立的,各自拥有独立的内存空间,它们之间的通信通常需要借助进程间通信(IPC)的机制。
线程:线程是系统调度的最基本单位。一个进程可以包含多个线程。线程共享进程的地址空间和资源,但拥有独立的执行栈。线程之间可以共享数据,并且更轻量级,创建和销毁线程的开销相对较小。
协程:协程作为一种轻量级的并发单元,允许程序在执行过程中挂起和恢复,从而有效提高程序的并发性能,特别是在I/O密集型任务和高级别结构化异步编程中展现出显著优势。与线程不同,协程通常在用户态进行管理,避免了操作系统内核的介入,使得创建、切换和管理的开销大大降低。

特点

进程:

独立性:进程彼此隔离,拥有各自的地址空间、内存、文件描述符等资源。这种独立性确保了每个进程都能在不受其他进程干扰的环境下运行。

资源分配和调度:进程是操作系统进行资源分配和调度的基本单位。它们可以申请并拥有系统资源,如CPU时间和内存空间。

动态性:进程不仅描述了程序在数据集上的执行过程,还包括了数据的处理、状态的改变等动态行为。

线程:

轻量级:相比进程,线程的创建、销毁和切换的开销要小得多,这使得线程在执行过程中更加高效。
独立调度:尽管线程可以被操作系统独立调度,但其调度通常受其所属进程的控制。
共享资源:同一进程内的线程可以共享该进程的资源,如内存空间、文件句柄和全局变量等,这进一步提高了资源的利用率。
并发执行:在多核处理器上,线程能够真正实现并行执行,从而提高整体的执行效率。
上下文切换快:由于线程共享了进程的大部分资源,因此线程间的上下文切换速度要比进程间快得多。

协程

协程的特征包括轻量级、非抢占式、用户态管理、协作式多任务以及特别适用于I/O密集型任务。其组成要素有协程控制块(CCB),类似于线程控制块,用于存储协程的元数据;程序计数器,记录协程的执行状态;寄存器集合,包括局部变量和函数参数等;以及调用栈,用于存储函数调用的上下文。

状态

线程状态

新建状态:线程刚被创建,但还未开始执行。在此阶段,线程可能正在初始化其所需的资源。
就绪状态:线程已准备好运行,并已获得除CPU外的所有必要资源。它将被放入就绪队列中,等待调度器的调度。
运行状态:线程正在CPU上执行。在多线程环境中,一个线程可能会在运行状态和其他状态之间多次切换。
阻塞状态:线程因等待某些资源(如输入/输出操作、文件读写或网络通信等)而暂停执行。在此状态下,线程不会消耗CPU资源,直到它等待的事件发生。
等待状态:线程通过调用诸如wait()、LockSupport.park()等方法,主动放弃CPU资源,进入等待状态。在此状态下,线程将一直等待,直至其他线程调用notify()、notifyAll()或LockSupport.unpark(Thread)等方法唤醒它。
超时等待状态:类似于等待状态,但线程在经过指定的超时时间后会自动唤醒。这种状态通常通过调用wait(long timeout)、sleep(long millis)或LockSupport.parkNanos()、LockSupport.parkUntil()等方法实现。

终止状态:线程执行已经完全结束,可能是因为它自然到达了逻辑的终点,或是由于其他线程调用stop()方法(尽管此方法不推荐使用,因其存在安全隐患)而强制终止。
多线程模型

进程

进程在其生命周期中会经历不同的状态,如新建、就绪、运行、等待(阻塞)和终止。新建状态表示进程刚被创建;就绪状态表示进程已准备好执行;运行状态则是进程正在执行;等待状态通常是因为进程在等待某些事件(如I/
在Linux系统中,我们可以使用top和ps等工具来查看进程的状态。这些工具的输出中,S列显示了进程的不同状态,包括R、D、Z、S、I、T和X。具体来说,R状态表示进程正在CPU的就绪队列中运行或等待运行;D状态是Disk Sleep,意味着进程正在与硬件交互且该过程不可被打断;Z状态为Zombie,代表进程已经结束但资源尚未被父进程回收。而S状态则是Interruptible Sleep,表示进程因等待事件而被系统挂起。此外,I状态为Idle,指内核线程处于空闲状态,可能实际上并无任何负载;T状态为Stopped,表示进程被暂停或处于跟踪状态;X状态为Dead,意味着进程已经终止,不会在top和ps命令的输出中显示。

协程状态

协程的状态变化包括初始化、就绪和执行等阶段。在初始化阶段,协程被创建并设置好必要的初始化操作。一旦就绪,协程便等待调度器的执行机会,可能被放置在就绪队列中。当执行机会到来时,协程便开始执行,并在适当的时候可以挂起自己,让出CPU给其他协程使用。
运行(Running):协程正在执行中。在单线程的协程调度器中,同一时刻只有一个协程处于运行状态;若在多线程环境中,协程可能被映射至线程上以实现真正的并行运行。

挂起(Suspended):协程在执行过程中因某种原因主动或被动地暂停。这通常发生在协程等待某些事件(例如I/O操作、锁的获取等)时。挂起是协程的关键特性,它允许协程在非执行状态下释放CPU资源。

恢复(Resumed):挂起的协程在等待的事件完成后被重新调度以继续执行。此时,协程从挂起状态转回就绪或运行状态。

完成(Completed):协程已顺利完成其执行逻辑,不再被调度执行。此状态标志着协程生命周期的结束。

取消(Cancelled):协程在执行过程中因外部请求而被终止,可能由于错误处理、超时或其他逻辑需求。

错误(Error):协程在执行时遇到错误,导致无法继续执行。此状态可能需要特定的处理逻辑,如错误恢复或资源清理。

阻塞(Blocked):协程等待某个资源或事件,但它自身无法主动挂起。这与挂起状态不同,因为阻塞状态下协程通常不能被调度器挂起。

区别

维度 进程 (Process) 线程 (Thread) 协程 (Coroutine)
地址空间 独立 共享 共享
切换者 操作系统 操作系统 用户程序
切换成本 高(µs~ms) 中(1~3 µs) 极低(< 0.2 µs)
通信方式 IPC 共享内存 共享变量
阻塞影响 只影响自己 影响进程内所有 影响同线程所有协程
创建开销 高(MB 级) 中(KB 级) 极低(KB 以内)
并行性 多核并行 多核并行 单线程内并发
posted @ 2025-07-14 14:52  茴香儿  阅读(46)  评论(0)    收藏  举报