5.1 Linux 应用开发 进程(一)
一、进程相关的基础概念
- 程序:存放在磁盘上的指令和数据的有序集合(可执行文件),放在 ROM 里,是静态的。
- 进程:是程序的一次完整执行过程,是动态的,包括创建、调度、执行和消亡。运行在 RAM 里,是执行一个程序所分配的资源总称,资源分配的基本单位。
- 进程控制块 (PCB):在 Linux 中描述进程的结构体是 task_struct,包括进程标示符 (PID)、优先级、状态、进程用户、文件描述符表。
- 进程类型:交互进程:在 shell 下启动,可在前台也可在后台执行批处理进程:和终端无关,被提交到作业队列中顺序执行守护进程:和终端无关,一直在后台运行,Ctrl+C 无法控制
- 进程状态:运行态:进程正在运行或准备运行等待态:进程在等待一个事件的发生或某种系统资源(分为可中断等待、不可中断等待)停止态:进程被中止,收到信号可继续运行死亡态:已终止的进程,其退出信息也被读取了,只是一个返回状态僵尸态:一个进程结束了,但其退出信息未被读取,PCB 没有释放它
二、进程常用命令
ps:查看当前运行的进程快照。ps -e显示所有进程;ps -elf显示更加详细信息top:查看进程动态信息。top -p PID:查看某个进程jobs:查看后台运行的进程Ctrl+Z:将进程转入后台并停止bg:将挂起的进程在后台运行fg:将后台进程放在前台运行
三、进程通信方式
- 管道通信:无名管道、有名管道
- 信号通信:信号的发送、接受、处理
- IPC 通信:共享内存、消息队列、信号量
- Socket 通信:一个网络中的多进程通信
类型 |
方式 |
特点 |
适用场景 |
管道 |
无名管道 |
单向、父子进程、数据流 |
简单数据传递 |
有名管道 |
单向、无亲缘关系、文件系统 |
不相关进程 |
|
信号 |
signal/kill |
异步通知、携带信息少 |
事件通知 |
IPC |
共享内存 |
最快、需同步机制 |
大数据交换 |
消息队列 |
有格式、可优先级 |
结构化数据 |
|
信号灯 |
计数器、同步 |
进程同步 |
|
Socket |
Unix Domain / Network |
跨机器通信 |
网络/本地通信 |
四、进程间通信特点
在用户空间无法独立实现进程通信,因为进程地址空间相互隔离,必须通过内核提供的 IPC 机制通信。共享内存是例外,创建共享内存需要内核,但读写可在用户空间直接进行。
┌─────────────┐ ┌─────────────┐
│ 进程 A │ │ 进程 B │
│ 虚拟地址空间 │ │ 虚拟地址空间 │
│ 0-4GB │ │ 0-4GB │
└──────┬──────┘ └──────┬──────┘
│ │
│ 相互隔离! │
│ 无法直接访问 │
└─────────┬─────────┘
↓
┌──────────────┐
│ Linux 内核 │ ← 必须通过内核中转
│ 提供通信机制 │
└──────────────┘
机制 |
是否每次经过内核 |
说明 |
管道 |
✅ 是 |
数据在内核缓冲区中转 |
消息队列 |
✅ 是 |
数据在内核中存储 |
信号量 |
✅ 是 |
内核同步机制 |
信号 |
✅ 是 |
内核通知机制 |
Socket |
✅ 是 |
网络通信 |
共享内存(特例) |
❌ 创建后不经过 |
创建需内核,读写在用户空间 |
五、Linux 进程状态转换
- R 运行态:正在执行或就绪,可通过唤醒进入;缺资源进入 S,等 IO 进入 D,暂停进 T,退出进 Z
- S 可中断等待:等待资源/事件,可被信号唤醒,资源就绪后回到 R
- D :等待硬件 IO,不可被打断,完成后回到 R
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
C++/嵌入式开发 秋招面经 文章被收录于专栏
一名985硕,在25年秋招中斩获多个C++/嵌入式开发Offer。本专栏将分享我的面经,涵盖C/C++、操作系统、计算机网络、ARM体系与架构、Linux应用/驱动开发、Qt、通信协议及开发工具链等核心内容。
查看7道真题和解析