进程
进程定义
- 进程是计算机中正在运行的程序实例的抽象,是操作系统进行资源分配和管理的基本单位。
- 每个进程都有自己独立的地址空间,包括代码段、数据段、堆栈段等,不同进程之间的内存资源是相互隔离的,不会相互干扰。
- 进程之间通过进程间通信(IPC)机制,如管道、套接字、共享内存等进行数据交换和通信
进程中断
中断是作用于CPU的,进程被’中断’本质是CPU暂停当前指令流去处理更高优先级事件
产生信号的原因主要有三类:
- 第一,硬件中断。比如时钟中断触发调度、网卡/磁盘IO完成通知CPU,这是异步的硬件事件驱动。
- 第二,异常和陷阱。进程执行非法指令(如缺页、除零)会同步触发异常;主动发起系统调用时,通过trap指令陷入内核
- 第三,调度抢占。当时间片用完,或有更高优先级任务就绪,调度器会抢占当前进程的CPU使用权。
- 第四,信号机制。其他进程或内核发送信号(如SIGKILL、SIGALRM),会在进程返回用户态时打断执行流。
线程
线程定义
-
线程是进程中的执行流程,一个进程可以包含多个线程,它们共享进程的资源,如内存空间和文件句柄
-
线程是操作系统调度的基本单位,可以独立执行,但仍受进程的管理。一个进程中的多个线程可以并发执行,共享进程的上下文和资源
-
线程之间共享相同的地址空间,可以直接访问进程的全局变量和堆内存
-
每一个程序都至少有一个线程,若程序只有一个线程,那就是程序本身
线程优势
- 第一,创建和切换开销小。 进程切换需要切换页表、刷新TLB,而线程共享进程地址空间,只需保存寄存器状态
- 第二,通信简单高效。 线程共享进程的代码段、数据段、堆,但拥有独立的栈(保存局部变量和调用链)。这意味着线程间可以直接读写共享变量通信,而进程间必须使用管道、消息队列或共享内存
- 第三,并发性能高。 多线程能同时利用多核CPU,且一个线程阻塞时(如IO),同进程的其他线程还能继续执行,提高程序吞吐量。多线程适合IO密集型和计算密集型混合场景。比如Web服务器,一个线程accept连接,多个worker线程处理请求,某个线程阻塞在数据库IO时,其他线程还能响应新请求
线程与进程区别
- 线程共享内存空间;进程的内存是独立的;
- 同一个进程的线程之间可以直接交流;两个进程想通信,必须通过一个中间代理来实现;
- 创建新进程很简单;创建新进程需要对其父进程进行一个克隆;
- 一个线程可以控制和操作同一进程里的其他线程;但是进程只能操作子进程;
- 改变主线程(如优先权),可能会影响其他线程;改变父进程,不影响子进程。
- 调度:线程作为分配和调度的基本单位,进程作为拥有资源的基本单位
- 并发性:不进进程之间可以并发执行,同一进程内的线程也可以并发执行
- 拥有资源:进程是拥有资源的一个独立单位,线程不拥有系统资源,但是可以访问隶属于进程的系统资源
- 系统开销:在创建和撤销进程的时候,系统都要分配和回收资源,导致系统的明显大于创建和撤销线程时的开销。但进程有独立的地址空间,进程崩溃后,在保护模式的下不会对其他进程造成影响,而线程只是进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有独立的地址空间,一个线程死后就等于整个进程死掉,所以多进程程序要比多线程程序健壮,但是在进程切换的时候消耗的资源较大,效率差。
协程
协程定义
- 协程(Coroutine)是用户态的轻量级线程,协程不像线程那样由操作系统内核进行调度,而是由程序员自行控制或者由编程语言提供的特定库来进行调度切换。
- 主动让出(Yield)而非被动抢占。线程是内核决定什么时候切换,协程是自己决定什么时候暂停、什么时候恢复。
- 线程切换需要从用户态陷入内核态(系统调用),保存/恢复寄存器、栈、程序计数器;协程切换完全在用户态完成,只涉及栈指针和寄存器的保存,相当于函数调用的开销。
- 协程与线程、进程最大的区别在于调度方式。进程和线程由操作系统调度,协程由用户程序自行调度,切换更加高效。
协程优势
- 轻量级资源占用:协程在用户态创建和管理,内存占用通常为 KB 级,因此可以在单个进程中运行大量并发任务
- 切换开销低:协程切换只需保存和恢复少量上下文,不涉及内核态调度,因此性能开销远低于线程切换
- 高并发能力强:由于创建和调度成本低,协程可以支持十万级甚至更高规模的并发任务
- 适合 I/O 密集型场景:协程在等待 I/O 时可以主动让出执行权,使 CPU 能继续处理其他任务,从而提高整体吞吐量
- 编程模型更简洁:通过 async/await 等机制可以用接近同步代码的方式编写异步逻辑,减少回调嵌套和复杂控制流
- 减少线程同步复杂度:协程通常通过消息传递或调度机制协作运行,从而降低锁竞争、死锁和竞态条件的发生概率