Linux进程管理和进程间通信机制

进程管理和进程间通信机制

一、进程思维导图

一、进程基础

  • 概念:程序的动态执行过程,系统资源分配/调度基本单位
  • 与程序区别:程序静态(磁盘指令集)、进程动态(执行过程)
  • 核心命令: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释放共享内存资源
相关推荐
tianyuanwo2 小时前
深入浅出SWIG:从C/C++到Python的无缝桥梁
c语言·c++·python·swig
小美单片机4 小时前
External model DLL ”ADC083XDLL“ not found_proteus仿真报错解决方法
c语言·单片机·51单片机·proteus·课程设计·课设
程芯带你刷C语言简单算法题4 小时前
Day48~对于高度为 n 的台阶,从下往上走,每一步的阶数为 1,2,3 中的一个。问要走到顶部一共有多少种走法
c语言·开发语言·学习·算法·c
进击的小头5 小时前
为什么C语言也需要设计模式
c语言·开发语言·设计模式
啟明起鸣5 小时前
【Linux 项目管理工具】GDB 调试是现成 C/C++ 项目的 “造影剂”,用来分析项目的架构原理
linux·c语言·c++
跃渊Yuey6 小时前
【Linux】Linux进程信号产生和保存
linux·c语言·c++·vscode
c++逐梦人6 小时前
命令⾏参数和环境变量
linux·操作系统·进程
leaves falling6 小时前
c语言自定义类型深度解析:联合(Union)与枚举(Enum)
c语言·开发语言·算法