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

0 阅读5分钟

 一、什么是进程?

定义

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

形象理解

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

进程的核心特征

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

二、进程的五种状态 

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

​编辑

状态详解 + Java场景

状态触发条件Java后端典型场景
创建态进程被创建Runtime.exec() 启动子进程
就绪态已加载到内存,等待CPUJVM启动完成,等待处理请求
运行态获得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. 跳转到目标线程的程序计数器位置继续执行