进程基础、进程创建fork、进程状态
一、进程基础概念
- 进程定义
进程是程序的运行实例,是操作系统分配CPU、内存资源的实体;静态存放在磁盘的是程序,加载到内存动态运行的才是进程。
公式:进程 = 内核PCB结构体(Linux为task_struct)+ 程序代码与数据。 - PCB进程控制块task_struct
内核用结构体完整记录进程所有属性,系统内全部进程以双向链表统一管理。
内部核心信息:PID/PPID、运行状态、优先级、程序计数器、CPU寄存器上下文、内存映射指针、IO文件信息、资源记账数据。 - 进程查看方式
- 文件接口:
/proc伪文件系统,存储实时进程信息; - 命令:
ps aux、ps axj、top; - 代码系统调用:
getpid()获取自身PID、getppid()获取父进程PID。
二、进程创建:fork系统调用
- 核心功能
fork是Linux底层创建子进程的系统调用,完整复制父进程生成全新独立子进程。 - 复制机制:写时拷贝COW
刚创建完成时父子进程共享同一份物理内存;只有任意进程修改数据时,系统才单独分配物理内存副本,大幅降低内存开销。 - 特殊返回规则(调用1次,返回两次)
- 返回值>0:当前为父进程,返回数字是子进程PID;
- 返回值=0:当前为子进程;
- 返回值=-1:进程创建失败(内存不足、系统进程数达上限)。
- 父子进程特性
共享内容:代码段、文件描述符、环境变量、虚拟地址布局;
相互独立:PID编号、CPU上下文、堆/全局数据(修改后物理内存分离);
运行规则:父子并发执行,CPU调度顺序不确定。 - 经典组合
fork + exec
fork仅复制原有程序,exec可以替换子进程程序镜像;终端执行命令、多进程服务端都依赖这套机制。
三、Linux七大进程状态
- R运行态:正在CPU运行,或在就绪队列等待调度;
- S可中断睡眠:等待某事件,能被信号唤醒;
- D不可中断睡眠:等待磁盘IO,无法被信号打断;
- T停止态:收到SIGSTOP暂停,SIGCONT恢复运行;
- t追踪停止:调试器ptrace调试时暂停;
- X死亡态:进程资源完全释放,内核销毁PCB,用户无法观测;
- Z僵尸态:子进程退出,但父进程未读取退出信息,PCB保留在内核。
四、僵尸进程、孤儿进程
1. 僵尸进程(Z)
- 产生条件:子进程先结束,父进程持续运行但不调用
wait/waitpid回收; - 危害:PCB长期占用内核内存,大量僵尸进程会引发内存泄漏;
- 解决方案:父进程使用wait/waitpid回收子进程退出状态。
2. 孤儿进程
- 产生条件:父进程提前退出,子进程失去父进程;
- 处理规则:自动被系统1号进程(systemd/init)收养,1号进程会自动回收孤儿,无内存泄漏风险。