进程、线程和协程分别是什么?

01 进程

1.定义

进程是操作系统中资源分配和调度的基本单位。它是一个正在运行的程序实例,包含程序代码、数据、进程控制块(PCB)以及其他资源。每个进程都有自己的一套独立的地址空间,一般来说,进程间的资源是不共享的。

2. 特征

-- 独立性:进程是独立的执行单元,拥有自己的内存空间和系统资源。

-- 并发性:多个进程可以同时运行,彼此独立。

-- 动态性:进程是程序的一次执行过程,是动态产生和消亡的。

-- 资源拥有:进程拥有自己的资源,如内存、文件句柄等。

3. 进程的组成

-- 程序代码:要执行的指令集。

-- 数据集合:程序执行时需要的数据和工作区。

-- 进程控制块(PCB):包含进程的描述信息和控制信息,如进程ID、状态、寄存器内容等。

4. 调度和切换

进程调度是操作系统根据某种算法选择一个就绪进程并分配CPU时间的过程。进程切换涉及保存当前进程的状态并恢复下一个进程的状态,这个过程开销较大。

 

02 线程

1. 定义

线程是进程中的一个执行单元,是CPU调度和程序执行流的最小单位。线程自身不拥有系统资源,只拥有一点在运行中必不可少的资源(如执行栈),但它可以与同属一个进程的其他线程共享进程所拥有的全部资源。一个进程可以包含多个线程,它们共享进程的资源。

2. 特征

-- 轻量级:线程比进程更轻量,创建和切换开销较小。

-- 共享资源:同一进程内的线程共享内存和文件句柄等资源。

-- 独立调度:线程是独立调度和分派的基本单位。

-- 并发执行:多个线程可以同时执行,提高程序的并发性。

3. 线程的组成

-- 线程ID:唯一标识线程的ID。

-- 程序计数器(PC):指向下一条要执行的指令。

-- 寄存器和堆栈:保存线程的局部变量和调用栈。

4. 调度和切换

线程调度由操作系统内核完成,线程切换比进程切换开销小,因为线程共享进程的资源,不需要切换内存地址空间。

 

03 协程

1. 定义

携程我就知道,至于协程....估计很多小伙伴是第一次听到,协程是一种比线程更轻量级的存在,它允许不同的执行线程在执行过程中挂起和恢复。协程通常由用户线程管理,而不是由操作系统内核管理。协程的调度完全由用户控制,这使得它们在I/O密集型任务中非常有用,因为它们可以在等待I/O操作完成时挂起,从而让出控制权给其他协程。

2. 特征

-- 轻量级:协程的创建和切换开销更小,通常只需要几个寄存器的保存和恢复。

-- 用户态调度:协程的调度由用户程序控制,而不是操作系统内核。

-- 非抢占式:协程的切换是主动的,即协程在合适的时机主动让出控制权。

-- 适用于I/O密集型任务:协程适用于需要大量并发但不需要多核并行的I/O密集型任务。

3. 协程的实现

协程通过保存和恢复执行上下文(如寄存器、堆栈指针等)来实现切换。常见的实现方式有:

-- 生成器(Generator):如Python中的`yield`关键字。

-- 异步函数(Async/Await):如Python中的`asyncio`库。

4. 调度和切换

协程的调度由程序员控制,通常通过调用特定的函数(如`yield`或`await`)来让出控制权。协程切换不涉及内核态和用户态的切换,因此开销极小。

 

04 三者比较

1. 进程、线程和协程的比较

特性 进程 线程 协程
定义 操作系统资源分配和调度的基本单位 进程中的执行单元 用户态的轻量级线程
独立性 独立的内存空间和资源 共享进程的内存和资源 共享进程的内存和资源
调度 由操作系统内核调度 由操作系统内核调度 由用户程序调度
切换开销
适用场景 多任务并发,多核并行 多任务并发,多核并行 I/0密集型任务,高并发
资源占用
创建开销
同步机制 进程间通信(IPC) 锁、信号量等同步机制 不需要多线程的锁桃制

 

2. 总结

-- 进程:适用于需要独立资源和内存空间的多任务并发场景,具有较高的创建和切换开销。

-- 线程:适用于需要共享资源的多任务并发场景,创建和切换开销较低,但需要同步机制来保证数据一致性。

-- 协程:适用于I/O密集型任务和高并发场景,具有极低的创建和切换开销,由用户程序控制调度,不需要复杂的同步机制。

在实际的操作系统中,线程被包含在进程中,而协程则是建立在线程之上的,通常由程序的运行时或库来管理。协程可以看作是更轻量级的线程,它们通常用于提高程序的并发性能,尤其是在涉及到大量I/O操作的场景中。

 

posted @ 2024-11-04 14:54  北京测试菜鸟  阅读(9)  评论(0编辑  收藏  举报