深入理解进程和线程的区别

155 阅读5分钟

 一,基本概念

        进程是操作系统资源分配的基本单位,拥有独立的内存空间、文件描述符、环境变量等。每个进程运行在独立的地址空间,互相隔离,稳定性高但开销大

说明:创建进程时,操作系统需要为其分配独立的内存空间、建立页表、初始化数据段等。

        线程是CPU调度的基本单位,属于同一进程的多个线程共享进程的资源(如内存、文件句柄)。线程切换开销小,但缺乏隔离性,一个线程崩溃可能导致整个进程终止。

说明:线程共享进程的绝大部分资源(内存、文件等) ,只需要分配一个独立的栈空间和设置线程控制块

二,进程

        在计算机的任务管理器中,分别为后台进程和应用程序进程,应用程序进程也是我们所说的APP。

​编辑

1,应用程序的构成

        应用程序本质上由指令和数据构成, 例如,一个.exe文件在Windows系统中以PE格式存储二进制指令”。当程序未被运行时,它们以二进制代码的形式存储在磁盘上。一旦启动运行,指令会被加载到CPU执行,而数据则被载入内存(如RAM)供CPU读写访问。

        如下,在window的安装后的微信应用程序:

2,启动.EXE入口

​编辑

3,二进制代码

​编辑

三,线程

        线程是CPU调度的最小单位,线程必须依赖于进程而存在,线程是进程中的一个实体,是CPU调度和分派的基本单位,它是比进程更小的、能独立运行的基本单位。

       线程仅持有少量独立资源(如程序计数器、寄存器、栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源。一个进程可以拥有多个线程,一个线程必须有一个父进程。

        比如在IDEA中,我们启动nl-app的线程。

public class App {
    public static void main(String[] args) {
        while (true) {
            try {
                System.out.println(System.currentTimeMillis() + "Hello World!");
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }
    }
}

        效果如下,在IDEA应用出现一个nl-app线程

​编辑

四,进程和线程区别

  1. 进程之间相互独立,各自的运行;线程则隶属于进程,是进程的执行子集,一个进程可包含多个线程。
  2. 进程拥有共享的资源,如内存空间等,供其内部的线程共享
  3. 线程通信相对简单,因为它们共享进程内的内存,一个例子是多个线程可以访问同一个共享变量
  4. 线程更轻量,线程上下文切换成本一般上要比进程上下文切换低

五,CPU核心数和线程数的关系

        CPU是线程调度的最小单位,一个CPU的核心只能运行一个线程。但是查看任务管理器的时候,正在运行的进程数和线程远远大于系统的CPU核心数,为什么系统时不出现卡顿呢?

​编辑

 这个时候,我们就需要了解下并发和并行。

六,并行和并发

1,并发

        指的是单CPU核心下能执行多线程,并非是同时执行多个任务。如单核CPU通过多线程技术,在单核系统中运行多个线程时,CPU会通过快速切换执行上下文来交替处理不同线程的任务,达到同时执行的效果,由于切换速度极快(通常在毫秒级别)

重要提示:这种交替执行在用户感知上就像是同时进行的,这本质上是一种时间片轮转的调度机制,而非真正的同步执行

2,并行

        指应用程序能够同时处理多个任务。在多核CPU架构中,每个核心都能独立运行线程,从而实现真正的并行任务处理。

例如:一边走路一边打电话,这些操作是同步进行的

3,并发和并行的区别

        并发是交替执行,并行是同时执行

4,适用场景

4.1,I/O密集型场景

I/O密集型任务主要时间消耗在等待I/O操作(如磁盘、网络)完成,CPU利用率低。

类型原因
并发优势通过任务切换,在等待I/O时执行其他任务,提高CPU利用率。例如Web服务器处理大量请求时,单线程事件循环(如Node.js)或协程(如Go的goroutine)可高效管理I/O等待
并行限制增加线程/进程数可能因I/O设备瓶颈(如磁盘带宽)导致收益递减,甚至因线程切换开销降低性能

4.2,计算密集型场景

计算密集型任务需要持续占用CPU进行计算,如数值模拟、图像处理。

类型原因
并行优势将任务拆分到多核/多机并行计算,直接缩短总耗时。例如使用MPI进行分布式计算或CUDA加速矩阵运算。
并发限制单核上并发无法提升性能,任务切换反而增加开销。需避免伪并发(如Python的GIL限制多线程并行计算)

七,总结

进程和线程都是计算机不可或缺的存在,是存在互补的,有以下关键点:

特性进程线程
基本单位资源分配和拥有的独立单位程序执行和调度的基本单位
开销创建/销毁/切换开销大创建/销毁/切换开销小
内存/资源地址空间独立,资源隔离共享进程的地址空间和大部分资源
通信必须使用复杂、缓慢的IPC机制可直接、快速读写共享内存,但需同步
并发性进程间并发,上下文切换成本高线程间并发,切换成本低,能更好利用多核
健壮性一个进程崩溃不影响其他进程一个线程崩溃可能导致整个进程崩溃