什么是进程?
- 我们编写的代码称为程序,而将代码运行起来就成为了进程。
- 简单来说:当我们启动一个程序时,这个正在运行的程序实例就是一个进程。
核心要点
进程是申请一块内存空间,并将程序代码和数据加载到内存中去执行的过程。它是操作系统进行资源分配的最小单元。
程序与进程的区别
- 程序是数据和指令的集合,是一个静态的概念,就是一堆可以长期保存的代码。
- 进程是程序的一次动态执行过程,拥有生命周期,会随着程序执行结束而销毁,不会永久驻留系统。
进程之间的交互
- 进程之间通常通过 TCP/IP 端口或操作系统提供的进程间通信(IPC)机制实现交互。
什么是线程?
- 线程是操作系统能够进行运算调度的最小单位。
- 它被包含在进程之中,是进程中的实际运作单元。
- 一条线程指的是进程中一个单一顺序的控制流。一个进程中可以并发多个线程,每条线程并行执行不同的任务。
核心要点
线程是进程内部的一条执行流水线,主要负责执行程序指令,而不负责申请资源(资源由进程管理)。它是程序执行的最小单元。
线程之间的交互
- 同一进程内的多个线程共享该进程的内存空间,它们通过读写共享内存来进行交互与通信。
进程与线程的关系
例子:
打开一个聊天软件,这就是启动了一个进程;然后在这个软件里进行各种操作,比如打开好友列表、发送消息、修改设置,这些每一个操作都可以看作是一个线程。
因此,“进程”包含“线程”,“线程”是“进程”的子集。
进程是线程的容器
工厂流水线例子:


总结对比
- 进程:指系统中正在运行的一个应用程序实例;是资源分配的最小单位。
- 线程:是系统分配处理器时间(CPU时间片)的基本单元,是程序执行的最小单位。
- 内存占用:进程需要分配独立且较大的内存空间,而线程主要需要栈空间,共享进程的内存。
- 数量关系:一个程序至少有一个进程,一个进程至少有一个线程。
- 线程管理:一个线程可以创建和撤销同进程内的另一个线程,多个线程可以并发执行。
并行、并发与串行
- 并发:多个任务在单核CPU上通过快速切换(多道技术)轮流执行,看起来像是同时进行,这是一种“伪并行”。它是现代操作系统调度的核心思想之一。

- 并行:多个任务真正同时在多个CPU核心上执行。并行必须依赖多核或多CPU硬件才能实现。

- 串行:任务严格按照顺序一个接一个地执行,只有前一个任务彻底完成后,下一个才能开始。

任务运行的三种状态
进程(或线程)在运行过程中会不断改变其状态。通常有三种基本状态:就绪态、运行态和阻塞态。
就绪态 (Ready)
- 当进程已获得除CPU以外的所有必要资源,只要再获得CPU时间片便可立即执行,此时的状态称为就绪态。
- 系统中处于就绪态的进程可能有多个,它们会被放入就绪队列中等待调度。
运行态 (Running)
- 当进程已获得CPU使用权,其程序指令正在被处理器执行,此状态称为运行态。
- 在单核操作系统中,任一时刻只有一个进程处于运行态;多核系统中则可以有多个。
阻塞态 (Blocked/Sleep)
- 正在运行的进程,由于等待某个事件(如I/O操作完成、获取锁、等待消息)而无法继续执行,操作系统会剥夺其CPU时间,此时进程进入阻塞态。
进程三种状态间的转换
进程在其生命周期内会频繁在这三种状态间切换,下图展示了状态转换关系:

就绪态 → 运行态
处于就绪队列的进程被进程调度程序分配了CPU时间片,从而转为运行态。
运行态 → 就绪态
正在运行的进程用完其分配的时间片,CPU被操作系统收回,进程从运行态转回就绪态,等待下次调度。
运行态 → 阻塞态
运行中的进程因发起I/O请求、等待互斥锁等操作而主动或被动放弃CPU,进入阻塞态。
阻塞态 → 就绪态
进程所等待的事件已完成(如I/O数据就绪),于是从阻塞态被唤醒,重新放入就绪队列,等待CPU调度。
任务提交的两种方式
同步
- 在编程中,同步指发送方提交一个任务后,必须等待该任务执行完毕并返回结果后,才能继续执行后续操作。
- 可以理解为两个或多个操作是步调一致的,一个操作必须等待另一个操作完成。
异步
- 异步指发送方提交任务后,无需等待该任务完成,可以立即继续执行后续操作。任务完成后,通常通过回调、事件或通知等方式告知发送方结果。
- 异步操作之间相互独立,互不等待。
例子
同步:
好比打电话,你说一句,必须等对方回应后,才能说下一句。双方通信是顺序、交替进行的。
异步:
好比发短信(或微信),你发送一条消息后,无需等待对方回复,就可以去做其他事或给别人发消息。对方回复的消息会在稍后到达。
进程池
什么是进程池?
- 进程池是一种由管理进程和预先创建好的多个资源进程组成的技术架构。
为什么需要进程池?
考虑这样一个场景:有时系统需要处理成千上万的任务,有时却只有零星几个。难道我们需要为每个任务都创建一个新进程吗?
首先,频繁地创建和销毁进程本身会消耗大量系统资源和时间。其次,即便开启了海量进程,操作系统的调度负担会剧增,过多的进程切换反而会导致整体效率下降,无法有效利用CPU。这涉及到操作系统调度和网络/系统优化的深层次问题。
因此,不能无限制地根据任务数量来动态创建/销毁进程。
进程池的工作原理
- 预先创建一个“池子”,里面初始化固定数量的进程(资源进程)。
- 当有新任务到达时,管理进程从池中分配一个空闲进程来处理该任务。
- 任务处理完毕后,该进程并不销毁,而是被放回池中,等待下一个任务。
- 如果所有进程都在忙,新任务就需要在队列中等待,直到有进程空闲出来。
- 这样,池中并发执行的进程数量始终是可控的,既避免了进程频繁开关的开销,又实现了稳定的并发处理能力。
资源进程
- 进程池中预先创建好的、处于空闲或工作状态的进程实体,负责执行具体任务。
管理进程
- 负责进程池的生命周期管理:创建资源进程、将任务分发给空闲资源进程、以及监督和回收资源进程。
资源进程与管理进程的交互
管理进程如何有效地分配任务和管理资源进程的生命周期?这需要通过进程间通信(IPC)机制来实现,例如管道、消息队列、共享内存等,这些都是实现高并发程序时需要掌握的关键技术。
|