Skip to main content

linux进程线程相关命令

进程类型

进程类型说明
前台进程具有终端,可以和用户交互的进程
后台进程没有占用终端,基本上不和用户交互,优先级比前台进程低(启动后台进程需要将执行的命令以&符号结束)
守护进程特殊的后台进程,很多守护进程在系统引导的时候启动,一直运行到系统关闭。(进程名以d结尾的一般都是守护进程,如 crond httpd sshd mysqld

常用进程命令

命令说明
top查看Linux系统的所有进程
pstree查看 父子进程 关系
man ps查看进程状态标记

特殊进程

  1. id 为 0 的进程为 idle 进程,是系统创建的第一个进程。
  2. id 为 1 的进程为 init 进程,是 0 号进程的子进程,完成系统的初始化。
  3. init 进程为所有用户进程的祖先进程。

进程的标记

img

ps 命令

查看进程树

ps -ef --forest

根据 cpu 使用频率排序

ps -aux --sort=-pcpu

根据内存使用频率排序

ps -aux --sort=-pmem

进程死锁的必要条件

  • 互斥条件
  • 请求保持条件
  • 不可剥夺条件
  • 环路等待条件

预防死锁破坏其中任一条件即可

解决死锁--- 银行家算法

◆ 客户申请的货款是有限的,每次申请需声明最大资金量 ◆ 银行家在能够满足货款时,都应该给用户贷款 ◆ 客户在使用货款后,能够及时归还贷款

linux 目录结构

img

线程同步

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

img

fork 系统调用创建进程

◆fork 系统调用是用于创建进程的 ◆fork 创建的进程初始化状态与父进程一样 ◆fork 系统调用无参数 ◆fork 会返回两次,分别返回子进程 id 和 0 ◆ 返回子进程 id 的是父进程,返回 0 的是子进程

进程同步

方法说明备注
共享内存◆共享存储允许不相关的进程访问同一片物理内存
◆共享内存是两个进程之间共享和传递数据最快的方式
◆共享内存未提供同步机制,需要借助其他机制管理访问
unix域套接字◆套接字( socket)原是网络通信中使用的术语
◆Uniⅸ系统提供的域套接字提供了网络套接字类似的功能