从零起步学习计算机操作系统:进程篇(基础知识夯实)

一、什么是进程?

定义

进程(Process) 是程序的一次执行过程,是操作系统进行资源分配和调度的基本单位。

形象理解

复制代码
📁 Java程序(代码文件) = 静态的"菜谱"
🔄 进程 = 正在按菜谱做饭的"厨房"

进程的核心特征

特征 说明 Java场景举例
独立性 进程有独立的地址空间 每个JVM进程内存隔离,互不影响
并发性 多个进程可"同时"执行 Tomcat + MySQL + Redis 多进程协作
动态性 进程有创建、执行、销毁的生命周期 java -jar 启动 → 运行 → kill 停止
异步性 进程按各自独立的速度推进 GC线程、业务线程、IO线程异步执行

二、进程的五种状态

图来自5.1 进程、线程基础知识 | 小林coding | Java面试学习

状态详解 + Java场景

状态 触发条件 Java后端典型场景
创建态 进程被创建 Runtime.exec() 启动子进程
就绪态 已加载到内存,等待CPU JVM启动完成,等待处理请求
运行态 获得CPU时间片执行 Tomcat线程处理HTTP请求
阻塞态 等待I/O、锁、信号量等 socket.read()、synchronized等待锁、Thread.sleep()
终止态 执行完成或被强制终止 System.exit()、kill -9

三、进程控制块(PCB)

什么是PCB?

Process Control Block 是操作系统内核为每个进程维护的数据结构,记录进程的所有信息,是进程存在的唯一标志。

PCB核心字段(简化版)

复制代码
struct PCB {
    // 进程标识
    pid_t pid;                    // 进程ID
    
    // 处理机状态(用于上下文切换)
    registers {                   // CPU寄存器快照
        pc;      // 程序计数器(下一条指令地址)
        sp;      // 栈指针
        general_registers[16];   // 通用寄存器
    };
    
    // 进程调度信息
    enum State state;            // 当前状态
    int priority;                // 优先级
    long elapsed_time;           // 已执行时间
    
    // 内存管理信息
    page_table *pg_tbl;          // 页表基址
    memory_segment code, data, heap, stack;
    
    // I/O和资源信息
    file_descriptor *open_files; // 打开的文件
    signal_handler *handlers;    // 信号处理函数
    
    // 进程关系
    pid_t parent_pid;            // 父进程ID
    list_t children;             // 子进程列表
};

Java视角理解PCB

复制代码
 当你执行 `jmap -heap <pid>` 时:
   
   JVM进程的PCB中记录了:
   ├── 堆内存起始地址和大小 ← memory_segment.heap
   ├── 栈指针位置          ← registers.sp  
   ├── 当前执行的字节码位置 ← registers.pc
   ├── 打开的Socket连接    ← open_files
   └── 线程调度优先级      ← priority

 这就是为什么操作系统能"暂停"一个Java进程,
   稍后从断点继续执行------所有状态都保存在PCB中!

四、上下文切换(Context Switch)

什么是上下文切换?

当CPU从一个进程/线程切换到另一个时,需要:

  1. 保存当前执行上下文(寄存器、PC、栈指针等)到原进程的PCB
  2. 加载新进程的上下文到CPU寄存器
  3. 跳转到新进程的程序计数器位置继续执行

切换过程图解

一、什么是线程?

定义

线程(Thread) 是进程内的执行单元,是操作系统进行调度的基本单位。一个进程可以包含多个线程,它们共享进程的资源。

形象理解

复制代码
🏢 进程 = 一家公司(拥有办公室、资金、设备等资源)
👥 线程 = 公司员工(共享公司资源,各自执行不同任务)

📦 JVM进程
├── 🧵 main线程          # 启动入口
├── 🧵 GC线程           # 垃圾回收
├── 🧵 Finalizer线程    # 对象清理  
├── 🧵 Tomcat工作线程池  # 处理HTTP请求(50-200个)
├── 🧵 业务异步线程      # @Async任务
└── 🧵 ...

线程的核心特征

特征 说明 Java场景
轻量性 线程比进程创建/切换开销小 可创建数百~数千线程处理并发请求
共享性 同进程线程共享内存、文件描述符等 多线程共享Heap对象,需注意线程安全
并发性 多个线程可并发/并行执行 Tomcat多线程同时处理多个HTTP请求
独立性 每个线程有独立栈、寄存器、程序计数器 方法调用栈互不干扰,局部变量线程私有

二、线程 vs 进程:核心对比

资源对比表

对比维度 进程(Process) 线程(Thread)
基本单位 资源分配的基本单位 调度执行的基本单位
内存空间 独立地址空间(代码/数据/堆/栈) 共享进程内存,独占栈+寄存器+PC
创建开销 大(需分配独立内存、加载资源) 小(只需分配栈和寄存器上下文)
切换开销 大(需切换页表、刷新TLB/缓存) 小(同进程线程共享页表,只需切换栈/寄存器)
通信方式 IPC:管道/消息队列/共享内存/Socket 直接读写共享变量(需同步机制)
隔离性 强(一个进程崩溃不影响其他) 弱(一个线程崩溃可能导致整个进程挂掉)
适用场景 多服务隔离、安全边界 高并发任务、协作计算

三、线程的上下文切换 🔄

什么是线程上下文切换?

当CPU从一个线程切换到另一个线程时,需要:

  1. 保存当前线程的执行上下文(寄存器、PC、栈指针等)
  2. 加载目标线程的上下文
  3. 跳转到目标线程的程序计数器位置继续执行
相关推荐
怕浪猫8 小时前
GEO 优化到底是什么?AI时代内容创作者必须懂的新技能
算法·面试·github
ai小陈9 小时前
GPU服务器租用存储验收:检查点写入与磁盘吞吐实战
运维·服务器·人工智能·ai·ssh·gpu算力
明月_清风10 小时前
Muse 登顶 App Store 第一,SDK 直接开源:AI Agent 开始进入下一个阶段
人工智能·后端
leikooo10 小时前
用餐厅和盘子理解栈和堆
java·数据结构·链表·rust
Ivanqhz11 小时前
激活函数在 Transformer 中的作用及各种变体简述
java·linux·数据库·人工智能·深度学习
沙漠之主11 小时前
C++编程教学设计资料:从入门到实战的完整课程方案
java·前端·c++
FPGA小徐11 小时前
PA1 基础设施(2)深度解析:NEMU 中 ITRACE、MTRACE、FTRACE、IRINGBUF、ETRACE、DIFFTEST 全解析
java·服务器·网络
青柠之夏cc12 小时前
AI与教育:个性化学习助手让“因材施教“成为现实,但代价是隐私?
人工智能·学习
YOLO数据集集合12 小时前
EvoAgent:面向PR研发治理的自进化Multi-Agent Harness系统
java·开发语言·目标检测·agent·自进化
hsfxuebao12 小时前
Loop Engineering 保姆级教程 + 项目实战
人工智能·后端