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

一、什么是进程?

定义

进程(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 分钟前
vue+SpringBoot(前后端交互)
java·vue.js·spring boot
diablobaal14 分钟前
云计算学习100天-第102天-Azure入门4
学习·云计算·azure
宁瑶琴15 分钟前
COBOL语言的云计算
开发语言·后端·golang
AI_零食28 分钟前
Flutter 框架跨平台鸿蒙开发 - 自定义式按钮设计应用
学习·flutter·ui·华为·harmonyos·鸿蒙
小陈phd34 分钟前
多模态大模型学习笔记(三十)—— 基于YOLO26 Pose实现车牌检测
笔记·学习
杰克尼38 分钟前
springCloud_day07(MQ高级)
java·spring·spring cloud
普通网友38 分钟前
阿里云国际版服务器,真的是学生党的性价比之选吗?
后端·python·阿里云·flask·云计算
野指针YZZ1 小时前
XV6操作系统:trap机制学习笔记
笔记·学习
Arvin6271 小时前
Nginx 添加账号密码访问验证
运维·服务器·nginx
IT_陈寒1 小时前
Vue的这个响应式问题,坑了我整整两小时
前端·人工智能·后端