进程,线程基础知识

张开发
2026/4/15 23:31:15 15 分钟阅读

分享文章

进程,线程基础知识
进程Process是操作系统资源分配和独立执行的基本单位是程序的动态执行过程。进程的本质与特征1.定义静态视角进程是加载到内存中的程序及其数据的集合动态视角进程是程序的一次执行过程具有生命周期内核视角进程是由task_structPCB描述的内核管理实体2.核心特征5大特性动态性有创建、执行、消亡的完整生命周期并发性多个进程可同时存在于内存并交替执行独立性拥有独立地址空间和资源互不干扰异步性进程按不可预知的速度推进结构性由程序段、数据段、PCB三部分组成一、进程的组成结构用于存放进程程序二进制文件中的机器指令的代码段用于存放程序二进制文件中定义的全局变量和静态变量的数据段和 BSS 段。用于在程序运行过程中动态申请内存的堆。用于存放动态链接库以及内存映射区域的文件映射与匿名映射区。用于存放函数调用过程中的局部变量和函数参数的栈。二、进程的生命周期与状态1.典型状态转换2.进程状态变迁解释NULL - 创建状态一个新进程被创建时的第一个状态创建状态 - 就绪状态当进程被创建完成并初始化后一切就绪准备运行时变为就绪状态这个过程是很快的就绪态 - 运行状态处于就绪状态的进程被操作系统的进程调度器选中后就分配给 CPU 正式运行该进程运行状态 - 结束状态当进程已经运行完成或出错时会被操作系统作结束状态处理运行状态 - 就绪状态处于运行状态的进程在运行过程中由于分配给它的运行时间片用完操作系统会把该进程变为就绪态接着从就绪态选中另外一个进程运行运行状态 - 阻塞状态当进程请求某个事件且必须等待时例如请求 I/O 事件阻塞状态 - 就绪状态当进程要等待的事件完成时它从阻塞状态变到就绪状态三、进程与程序的本质区别维度进程程序本质动态执行过程静态指令集合存在形式内存中的活动实体磁盘上的文件生命周期短暂创建→消亡持久长期存在资源占用占用CPU、内存等系统资源不占用系统资源独立性独立地址空间不可直接访问其他进程无独立地址空间线程Thread是进程内的独立执行单元是操作系统调度的基本单位。线程的本质与特征1.定义技术本质进程内的轻量级执行流共享进程地址空间和资源功能定位实现并发执行的最小单位比进程更高效的资源共享内核视角由线程控制块TCB描述的调度实体2.核心价值资源效率共享进程内存空间避免进程间通信开销并发粒度细粒度并行提高CPU利用率尤其是多核心系统响应速度单个线程阻塞不影响其他线程执行一、线程与进程的关系模型进程资源容器 ┌─────────────────────────────────────────┐ │ 地址空间代码/数据/堆 │ │ 文件描述符表、信号处理等共享资源 │ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │ │ 线程1 │ │ 线程2 │ │ 线程3 │ │ │ │ TCB栈 │ │ TCB栈 │ │ TCB栈 │ │ │ └──────────┘ └──────────┘ └──────────┘ │ └─────────────────────────────────────────┘关键区别维度进程线程资源分配拥有独立地址空间共享进程地址空间调度单位资源分配基本单位调度执行基本单位上下文切换开销大需切换地址空间开销小仅切换寄存器和栈通信方式需IPC机制管道/消息队列等可直接访问共享内存故障隔离一个进程崩溃不影响其他进程线程崩溃可能导致整个进程终止二、线程的核心组成线程控制块TCB存储线程ID、状态、优先级等元数据线程栈私有栈空间存储局部变量和函数调用上下文寄存器集合线程切换时需保存/恢复的CPU状态线程局部存储TLS线程私有全局变量存储区三、线程同步与通信机制1.同步原语互斥锁Mutex保护临界资源实现互斥访问条件变量Condition Variable实现线程间等待/通知机制读写锁Reader-Writer Lock区分读/写操作的同步信号量Semaphore控制并发访问数量2.线程安全问题竞态条件Race Condition多线程同时访问共享资源导致数据不一致死锁Deadlock多个线程互相等待对方释放资源活锁Livelock线程不断改变状态但无法推进饥饿Starvation低优先级线程长期得不到调度fork复制进程一、fork的核心功能与调用原型定义fork()是UNIX/Linux系统创建新进程的核心系统调用通过复制当前进程父进程生成新进程子进程。调用原型#include unistd.h pid_t fork(void);返回值父进程返回子进程PID子进程返回0失败返回-1核心特性调用一次返回两次父子进程各返回一次二、进程复制的完整流程关键步骤解析PCB创建内核为子进程分配新的task_struct复制父进程PCB大部分字段地址空间复制不直接复制物理内存而是共享父进程页表写时复制机制子进程获得独立的虚拟地址空间但初始映射到与父进程相同的物理页资源继承继承文件描述符表、信号处理方式、当前工作目录等独立的进程ID、父进程ID、资源使用统计等三、写时复制Copy-On-Write, COW机制核心思想推迟物理内存复制直到任一进程修改数据时才复制受影响的页。实现细节初始状态父子进程共享所有物理页页表项标记为只读和COW标志写操作触发父进程写内存 → 触发页错误(Page Fault) → 内核检查COW标志 → 分配新物理页 → 复制原页内容 → 更新页表映射为可写性能影响避免无意义的内存复制如fork()后立即exec()典型场景下内存复制量减少80%以上Linux 2.6后支持页表项级别的COW精细化内存管理四、父子进程的关键差异属性父进程子进程PID原进程ID新分配IDPPID不变父进程PID返回值子进程PID0进程时间不变重置为0信号 pending不变清空文件锁不继承不继承内存锁定不继承不继承状态一致性保证子进程复制父进程在fork()时刻的完整执行上下文包括寄存器状态、程序计数器PC、栈指针等父子进程从fork()返回后开始独立执行五、典型使用模式与陷阱基本使用范式pid_t pid fork(); if (pid -1) { /* 错误处理 */ } else if (pid 0) { // 子进程逻辑 printf(子进程 PID%d\n, getpid()); exit(0); } else { // 父进程逻辑 printf(子进程 PID%d\n, pid); waitpid(pid, NULL, 0); // 等待子进程结束 }常见陷阱竞态条件父子进程执行顺序不确定需同步机制僵尸进程父进程未调用wait()导致子进程资源无法回收文件描述符共享父子进程共享打开文件的偏移量需注意同步信号处理子进程继承信号处理函数但不继承pending信号经典组合forkexecif (fork() 0) { execl(/bin/ls, ls, -l, NULL); // 替换子进程地址空间 perror(exec failed); // 仅在exec失败时执行 exit(1); }exec()系列函数替换进程地址空间实现程序加载fork()exec()是shell执行命令的基础机制

更多文章