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

一、什么是进程?

定义

进程(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. 跳转到目标线程的程序计数器位置继续执行
相关推荐
业精于勤_荒于稀2 小时前
服务器配置
java·服务器·jvm
我的xiaodoujiao2 小时前
API 接口自动化测试详细图文教程学习系列2--相关Python基础知识
python·学习·测试工具·pytest
Barkamin2 小时前
堆排序简单实现
java·数据结构·算法·排序算法
@木尘2 小时前
前端面试【 八股文篇】
前端·面试·职场和发展
小江的记录本2 小时前
【TCP】TCP三次握手与四次挥手(系统性知识体系+对比表格)
java·服务器·网络·网络协议·tcp/ip·http·tcp
小吴编程之路2 小时前
TCP 通信中的四种核心异常情况
服务器·网络·tcp/ip
闻哥2 小时前
MySQL索引核心原理:B+树生成、页分裂与页合并全解析
java·jvm·b树·mysql·adb·面试·springboot
蜡台2 小时前
Android Gradle 项目下载编译失败解决---持续更新
android·java·kotlin·gradle
独自破碎E2 小时前
【面试真题拆解】Redis的8种内存淘汰策略
redis·面试·职场和发展