进程管理和进程间通信机制
一、进程思维导图
一、进程基础
- 概念:程序的动态执行过程,系统资源分配/调度基本单位
- 与程序区别:程序静态(磁盘指令集)、进程动态(执行过程)
- 核心命令:ps/top(查看)、kill+PID(终止)
二、进程标识(PID)
- 本质:唯一非负整数(0~32767),类型pid_t
- 特殊PID:0(交换进程)、1(init进程)、2(页守护进程)
- 获取函数:getpid()(当前进程)、getppid()(父进程)
三、进程控制块(PCB)
- 定义:内核task_struct结构体,系统感知进程的唯一标志
- 存储位置:内核空间
- 核心内容:进程描述信息、控制信息、资源信息
四、进程内存映像
- 地址空间:1G内核空间(共享)+3G用户空间(私有)
- 组成部分:代码段(只读共享)、数据段、BSS段、堆、栈
- 额外存储:命令行参数、环境变量
五、进程状态与转换
- 核心状态:就绪、运行、阻塞、停止
- 转换规则:运行→就绪(时间片完)、运行→阻塞(等事件)、阻塞→就绪(事件发生)
六、进程分类
- 交互进程:Shell启动,支持前后台运行
- 批处理进程:执行脚本,与终端无关
- 监控进程(守护进程):系统启动运行,后台常驻
七、进程创建
- 核心函数:fork(复制父进程,父子PID不同)、vfork(共享数据,子进程优先执行)、system(执行Shell命令,阻塞)
- fork特点:父进程返回子PID,子进程返回0,失败返回-1
八、特殊进程
- 孤儿进程:父进程先结束,被init进程(PID=1)收养
- 僵尸进程:子进程先结束,父进程未调用wait,PCB残留
九、进程等待与退出
- 等待函数:wait(阻塞等任意子进程)、waitpid(指定子进程,支持非阻塞)
- 退出方式:正常(main返回、exit、_exit)、异常(abort)
二、管道思维导图
一、管道基础
- 本质:内核中固定大小缓冲区(2.6内核64KB),流式服务
- 分类:无名管道、有名管道(FIFO)
- 生命周期:随进程(进程退出管道释放)
二、无名管道
- 核心特点:半双工(单向通信)、仅支持亲缘进程、无文件名、内存中存在
- 创建函数:pipe(int fd[2]),fd[0](读端)、fd[1](写端)
- 读写规则:
- 管道空+写端未关:read阻塞
- 管道满+读端未关:write阻塞
- 数据读出后移除,不可重复读取
三、有名管道(FIFO)
- 核心特点:文件系统可见(文件名标识)、不占磁盘空间、支持任意进程通信
- 创建方式:mkfifo命令、mkfifo函数(需指定权限)
- 操作流程:open(打开,支持阻塞/非阻塞O_NONBLOCK)→ read/write(读写)→ close(关闭)
- 关键规则:先进先出,不支持lseek操作
三、信号思维导图
一、信号基础
- 本质:异步事件通知机制,硬件中断的软件模拟
- 分类:不可靠信号(131,不排队)、可靠信号(3264,排队)
- 核心头文件:<signal.h>,共64种信号
二、常见信号
- 终止类:SIGINT(Ctrl+C)、SIGKILL(9号,强制终止,不可捕捉)、SIGTERM(默认kill信号)
- 控制类:SIGSTOP(暂停,不可捕捉)、SIGCONT(继续)
- 通知类:SIGCHLD(子进程结束通知父进程)、SIGALRM(定时通知)
三、信号函数
- 发送函数:kill(向指定进程/进程组发信号)、raise(向自身发信号)、sigqueue(实时信号,带参数)
- 定时函数:alarm(秒级定时,发SIGALRM)、ualarm(微秒级定时)
- 终止函数:abort(发SIGABRT,异常终止)
四、信号处理
- 处理方式:忽略(SIG_IGN,除SIGKILL/SIGSTOP)、默认动作、自定义处理
- 处理函数:signal(非实时信号)、sigaction(实时信号,支持带参数)
五、信号集操作
- 核心函数:sigemptyset(初始化空集)、sigfillset(添加所有信号)、sigaddset/sigdelset(增删信号)
- 作用:屏蔽指定信号,避免执行处理函数时被打断
四、信号量思维导图
一、信号量基础
- 本质:整数计数器,用于共享资源的互斥与同步
- 核心特性:访问为原子操作,不可分割
- 分类:内核信号量、用户态信号量(POSIX/SYSTEM V)
二、核心操作(PV操作)
- P操作:S减1,S<0则进程阻塞
- V操作:S加1,S≤0则唤醒阻塞进程
- 互斥信号量:初值为1,实现资源独占访问
三、核心函数
- 创建/获取:semget(key由ftok生成,nsems为信号量个数)
- 执行操作:semop(通过sembuf结构体指定PV操作)
- 控制管理:semctl(SETVAL初始化、IPC_RMID删除)
四、查看与删除
- 查看命令:ipcs -s
- 删除命令:ipcrm -s semid(按信号量ID删除)
五、使用步骤
- 创建/获取信号量集
- 初始化信号量(SETVAL)
- 执行PV操作(semop)
- 删除信号量集(IPC_RMID)
五、消息队列思维导图
一、消息队列基础
- 本质:内核中的消息链表,由msgid唯一标识
- 核心特点:支持随机查询(按消息类型)、多进程读写、读出后删除
- 生命周期:内核重启或显式删除才消失
二、数据结构
- 消息结构体:msgbuf(mtype:消息类型>0;mtext:消息内容)
- 内核维护结构:msqid_ds(存储队列状态、权限、消息计数等)
三、核心限制
- 单条消息最大长度:MSGMAX
- 队列总字节数:MSGMNB
- 消息条目数:MSGMNI
四、核心函数
- 创建/获取:msgget(key标识,支持IPC_CREAT创建)
- 发送消息:msgsnd(添加消息到队列尾部,支持阻塞/非阻塞)
- 读取消息:msgrcv(按类型读取,支持截断、非阻塞)
- 控制删除:msgctl(IPC_RMID删除队列)
五、查看与删除
- 查看命令:ipcs -q
- 删除命令:ipcrm -q msgid
六、共享内存思维导图
一、共享内存基础
- 本质:允许多个进程访问同一逻辑内存,内核级资源
- 核心特点:通信效率最高(无数据拷贝),需手动实现同步
- 系统限制:Linux最大支持128个共享内存
二、查看与删除
- 查看命令:ipcs -m
- 删除命令:ipcrm -m shmid(按共享内存ID删除)
三、核心函数
- 创建/获取:shmget(key由ftok生成,size按页对齐(4KB/页))
- 映射地址:shmat(将共享内存映射到进程地址空间,返回指针)
- 断开映射:shmdt(解除进程与共享内存的关联)
- 控制管理:shmctl(IPC_RMID删除共享内存)
四、使用流程
- 调用shmget创建/获取共享内存
- 调用shmat映射到进程地址空间
- 进程间通过内存指针直接读写数据
- 调用shmdt断开映射
- 调用shmctl释放共享内存资源