一、进程的概念与特征1.1 进程与程序的区别程序存储在硬盘上的静态数据指令集合如可执行文件本身不占用CPU和内存资源。进程程序被加载到内存后形成的动态实体需要占用内存空间并在CPU上执行指令。进程具有生命周期启动→运行→消亡且同一程序可对应多个进程实例。1.2 进程是资源分配的最小单位Linux为每个进程分配独立的04GB虚拟内存空间**32位系统其中用户空间03GB各进程相互隔离内核空间3~4GB为所有进程共享。进程拥有独立的进程控制块PCB、地址空间、文件描述符表等资源因此进程间默认无法直接通信需借助IPC机制**管道、信号、共享内存等进行数据交换。二、进程的创建2.1fork()系统调用fork()是创建新进程的核心接口通过复制父进程的用户空间数据来生成子进程。函数原型#includeunistd.hpid_tfork(void);行为子进程完整拷贝父进程0~3GB用户空间数据代码段、数据段、堆、栈。内核空间部分拷贝PCB块、文件描述符表等但PID和PPID父进程ID不拷贝子进程获得新的PIDPPID设置为父进程的PID。父子进程共享3~4GB内核空间但用户空间互相独立。返回值在父进程中返回子进程的PID0。在子进程中返回0。失败返回-1。执行模型调用一次fork返回两次。父进程和子进程从fork调用返回处开始并发执行执行顺序由调度器决定无法预先假设。辅助函数getpid()获取当前进程的PID。getppid()获取当前进程的父进程PID。三、进程调度与状态3.1 调度策略Linux内核采用抢占式多任务调度宏观上多个进程可以“同时”执行微观上通过时间片轮询实现并发。调度算法包括时间片轮询公平分配CPU时间先来先服务优先级调度高优先级优先短作业优先缩短平均等待时间3.2 进程状态模型操作系统经典的三态模型运行、就绪、阻塞在Linux中被扩展为更细粒度的状态状态符号名称含义R运行态正在执行用户态或内核态或被调度器选中但尚未获得CPUS可中断睡眠态等待资源如I/O可被信号唤醒D不可中断睡眠态等待资源但不会被信号打断通常用于磁盘I/OT暂停态因收到SIGSTOP等信号而被挂起Z僵尸态进程已退出但资源未被父进程回收X结束态进程彻底结束资源已回收通常不可见3.3 进程状态迁移典型迁移路径就绪R→ 运行R→ 睡眠S/D→ 就绪R→ 运行 → 退出 → 僵尸Z→ 结束X。父进程需通过wait或waitpid回收僵尸态子进程否则子进程会残留占用资源。四、进程管理常用命令Linux提供多组命令用于查看和控制进程命令功能ps -aux/ps -ef显示所有进程的PID、PPID、状态、内存/CPU占用等top动态实时显示进程资源占用情况pstree -sp pid以树形结构显示进程创建关系kill -信号 pid向进程发送信号如kill -9强制结束jobs/fg/bg管理后台任务shell作业控制管道与grepps -aux | grep a.out用于筛选特定进程。五、进程退出与资源回收5.1 进程退出的方式主函数return或调用exit()标准C库函数刷新缓冲区后退出。调用_exit()/_Exit()直接系统调用不刷新缓冲区。被信号如SIGKILL强制终止。原型#includestdlib.hvoidexit(intstatus);// status0表示正常退出非0表示异常void_Exit(intstatus);#includeunistd.hvoid_exit(intstatus);5.2 僵尸进程与孤儿进程僵尸进程Zombie进程已退出但其父进程未调用wait/waitpid回收其资源导致进程表项仍保留。僵尸进程占用少量内存PCB大量堆积可耗尽系统资源。孤儿进程Orphan父进程先于子进程结束。此时子进程被**init进程PID1**收养待其结束后由init回收资源因此孤儿进程不会成为僵尸。5.3 回收接口wait与waitpidwait阻塞等待任一子进程结束#includesys/wait.hpid_twait(int*wstatus);成功返回回收的子进程PID失败返回-1。参数可接收退出状态传入NULL表示不关心状态。waitpid更灵活可指定特定进程或非阻塞pid_twaitpid(pid_tpid,int*status,intoptions);pid 0等待指定PID的子进程。pid -1等待任意子进程同wait。pid 0等待同一进程组内的任意子进程。pid -1等待指定进程组内的任意子进程。options 0阻塞等待。options WNOHANG非阻塞若无子进程结束则立即返回0。注意使用非阻塞模式时需配合轮询循环检查以避免忙等。六、exec函数族在当前进程执行外部程序exec系列函数用于替换当前进程的代码段和数据段执行一个新的可执行文件而不创建新进程PID不变。调用成功后原进程的后续代码不再执行。常用函数intexecl(constchar*path,constchar*arg,.../* (char *) NULL */);intexeclp(constchar*file,constchar*arg,.../* NULL */);intexecv(constchar*path,char*constargv[]);intexecvp(constchar*file,char*constargv[]);lvsv参数传递方式列表或数组。p使用PATH环境变量查找可执行文件。返回 -1 表示执行失败成功则不返回。典型用法在子进程中加载新程序pid_tpidfork();if(pid0){// 子进程execlp(ls,ls,-l,NULL);perror(execlp);// 只有失败才执行exit(1);}七、进程间通信概述由于进程间用户空间隔离直接通信被禁止。Linux提供多种IPC机制管道Pipe/FIFO信号Signal共享内存Shared Memory消息队列Message Queue信号量Semaphore套接字Socket这些通信方式均需借助内核空间作为中介。