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ⅸ系统提供的域套接字提供了网络套接字类似的功能 |