linux进程线程相关命令
进程类型
| 进程类型 | 说明 |
|---|---|
| 前台进程 | 具有终端,可以和用户交互的进程 |
| 后台进程 | 没有占用终端,基本上不和用户交互,优先级比前台进程低(启动后台进程需要将执行的命令以&符号结束) |
| 守护进程 | 特殊的后台进程,很多守护进程在系统引导的时候启动,一直运行到系统关闭。(进程名以d结尾的一般都是守护进程,如 crond httpd sshd mysqld) |
常用进程命令
| 命令 | 说明 |
|---|---|
top | 查看Linux系统的所有进程 |
pstree | 查看 父子进程 关系 |
man ps | 查看进程状态标记 |
特殊进程
- id 为 0 的进程为 idle 进程,是系统创建的第一个进程。
- id 为 1 的进程为 init 进程,是 0 号进程的子进程,完成系统的初始化。
- init 进程为所有用户进程的祖先进程。
进程的标记

ps 命令
查看进程树
ps -ef --forest
根据 cpu 使用频率排序
ps -aux --sort=-pcpu
根据内存使用频率排序
ps -aux --sort=-pmem
进程死锁的必要条件
- 互斥条件
- 请求保持条件
- 不可剥夺条件
- 环路等待条件
预防死锁破坏其中任一条件即可
解决死锁--- 银行家算法
◆ 客户申请的货款是有限的,每次申请需声明最大资金量 ◆ 银行家在能够满足货款时,都应该给用户贷款 ◆ 客户在使用货款后,能够及时归还贷款
linux 目录结构

线程同步
| 方法 | 说明 | 备注 | 例子 |
|---|---|---|---|
| 互斥量 | ◆ 两个线程的指令交叉执行 ◆ 互斥量可以保证先后执行,保证操作的原子性 | ◆ 原子性是指一系列操作不可被中断的特性 ◆ 这一系列操作要么全部执行完成,要么全部没有执行 ◆ 不存在部分执行部分未执行的情况 | c++提供 api pthread_mutex_t |
| 自旋锁 | ◆ 自旋锁也是一种多线程同步的变量 ◆ 使用自旋锁的线程会反复检查锁变量是否可用 ◆ 自旋锁不会让出 CPU,是一种忙等待状态 | ◆ 自旋锁避免了进程或线程上下文切换的开销 ◆ 操作系统内部很多地方使用的是自旋锁 ◆ 自旋锁不适合在单核 CPU 使用 | c++提供 api pthread_spinlock_t |
| 读写锁 | ◆ 读写锁是一种特殊的自旋锁 ◆ 允许多个读者同时访问资源以提高读性能 ◆ 对于写操作则是互斥的 | 适合多读少写场景,可以显著提高性能 | c++提供 apipthread_rwlock_t、 pthread_rwlock_rdlock(读锁)、 pthread_rwlock_wrlock(写锁) |
| 条件变量 | ◆ 条件变量是一种相对复杂的线程同步方法 ◆ 条件变量允许线程睡眠,直到满足某种条件 ◆ 当满足条件时,可以向该线程发信号,通知唤醒 | 相对复杂的线程同步方法,有更灵活的使用场景,配合互斥量使用 | c++提供 apipthread_cond_t、 pthread_cond_wait(等待条件满足)、 pthread_cond_signal(唤醒等待) |

fork 系统调用创建进程
◆fork 系统调用是用于创建进程的 ◆fork 创建的进程初始化状态与父进程一样 ◆fork 系统调用无参数 ◆fork 会返回两次,分别返回子进程 id 和 0 ◆ 返回子进程 id 的是父进程,返回 0 的是子进程
进程同步
| 方法 | 说明 | 备注 |
|---|---|---|
| 共享内存 | ◆共享存储允许不相关的进程访问同一片物理内存 ◆共享内存是两个进程之间共享和传递数据最快的方式 ◆共享内存未提供同步机制,需要借助其他机制管理访问 | |
| unix域套接字 | ◆套接字( socket)原是网络通信中使用的术语 ◆Uniⅸ系统提供的域套接字提供了网络套接字类似的功能 |