Mark blog

知行合一 划水归档

Linux 中的进程和计划任务(一)

Linux 中进程的查看

进程的相关概念

内核的功用:进程管理、文件系统、网络功能、内存管理、驱动程序、安全功能等

Process: 运行中的程序的一个副本,是被载入内存的一个指令集合

​ 进程ID(Process ID,PID)号码被用来标记各个进程UID、GID、和SELinux语境决定对文件系统的存取和访问权限,通常从执行进程的用户来继承存在生命周期

task struct:Linux内核存储进程信息的数据结构格式

task list:多个任务的的task struct组成的链表

进程创建:

​ init:第一个进程

​ 进程:都由其父进程创建,父子关系,CoW fork(), clone()

进程的基本状态和转换

创建状态:

​ 进程在创建时需要申请一个空白PCB(process control block进程控 制块),向其中填写控制和管理进程的信息,完成资源分配.如果创建工作无法完 成,比如资源无法满足,就无法被调度运行,把此时进程所处状态称为创建状态

就绪状态:

​ 进程已准备好,已分配到所需资源,只要分配到CPU就能够立即运行

执行状态:

​ 进程处于就绪状态被调度后,进程进入执行状态

阻塞状态:

​ 正在执行的进程由于某些事件(I/O请求,申请缓存区失败)而暂时 无法运行,进程受到阻塞.在满足请求时进入就绪状态等待系统调用

终止状态:

​ 进程结束,或出现错误,或被系统终止,进入终止状态.无法再执行

进程之间转换六种情况

运行——>就绪:

​ 1,主要是进程占用CPU的时间过长,而系统分配给该进程占 用CPU的时间是有限的:

​ 2,在采用抢先式优先级调度算法的系统中,当有更高 优先级的进程要运行时,该进程就被迫让出CPU,该进程便由执行状态转变为 就绪状态

就绪——>运行:运行的进程的时间片用完,调度就转到就绪队列中选择合适 的进程分配CPU

运行——>阻塞:正在执行的进程因发生某等待事件而无法执行,则进程由执 行状态变为阻塞状态,如发生了I/O请求

阻塞——>就绪:进程所等待的事件已经发生,就进入就绪队列

以下两种状态是不可能发生的:

​ 阻塞——>运行:即使给阻塞进程分配CPU,也无法执行,操作系统在进行调 度时不会从阻塞队列进行挑选,而是从就绪队列中选取

​ 就绪——>阻塞:就绪态根本就没有执行,谈不上进入阻塞态

进程优先级

进程优先级:

​ 系统优先级:数字越小,优先级越高

​ 0-139(CentOS4,5)

​ 各有140个运行队列和过期队列

​ 0-98,99(CentOS6)

​ 实时优先级: 99-0 值最大优先级最高

​ nice值:-20到19,对应系统优先级100-139或99

Big O:时间复杂度,用时和规模的关系

​ O(1), O(logn), O(n)线性, O(n^2)抛物线, O(2^n)

进程相关概念

进程内存:

​ Page Frame: 页框,用存储页面数据,存储Page 4k

​ LRU:Least Recently Used 近期最少使用算法,释放内存物理地址空间和线性地址空间

​ MMU:Memory Management Unit负责转换线性和物理地址

​ TLB:Translation Lookaside Buffer 翻译后备缓冲器,用于保存虚拟地址和物理地址映射关系的缓存

IPC: Inter Process Communication

​ 同一主机:

​ signal:信号

​ shm: shared memory

​ semaphore:信号量,一种计数器

​ 不同主机:

​ socket: IP和端口号

​ RPC: remote procedure call

​ MQ:消息队列,Kafka,ActiveMQ

进程状态

Linux内核:抢占式多任务

进程类型:

​ 守护进程: daemon,在系统引导过程中启动的进程,和终端无关进程

​ 前台进程:跟终端相关,通过终端启动的进程

​ 注意:两者可相互转化

进程状态:

​ 运行态:running

​ 就绪态:ready

​ 睡眠态:

​ 可中断:interruptable

​ 不可中断:uninterruptable

​ 停止态:stopped,暂停于内存,但不会被调度,除非手动启动

​ 僵死态:zombie,结束进程,父进程结束前,子进程不关闭


系统管理工具

进程的分类:

​ CPU-Bound:CPU密集型,非交互

​ IO-Bound:IO密集型,交互

Linux系统状态的查看及管理工具:pstree, ps, pidof, pgrep, top, htop, glance, pmap, vmstat, dstat, kill, pkill, job, bg, fg, nohup

pstree命令:

​ pstree - display a tree of processes

ps: process state

​ ps - report a snapshot of the current processes

​ Linux系统各进程的相关信息均保存在/proc/PID目录下的各文件中

查看系统进程 ps

ps [OPTION]…

支持三种选项:

​ UNIX选项 如-A -e

​ BSD选项 如a

​ GNU选项 如–help

• 选项:默认显示当前终端中的进程

• a 选项包括所有终端中的进程

• x 选项包括不链接终端的进程

• u 选项显示进程所有者的信息

• f 选项显示进程树,相当于 –forest

• k|–sort 属性 对属性排序,属性前加- 表示倒序

• o 属性… 选项显示定制的信息 pid、cmd、%cpu、%mem

• L 显示支持的属性列表

ps常见选项

-C cmdlist 指定命令,多个命令用,分隔

-L 显示线程

-e: 显示所有进程,相当于-A

-f: 显示完整格式程序信息

-F: 显示更完整格式的进程信息

-H: 以进程层级格式显示进程相关信息

-u userlist 指定有效的用户ID或名称

-U userlist 指定真正的用户ID或名称

-g gid或groupname 指定有效的gid或组名称

-G gid或groupname 指定真正的gid或组名称

-p pid 显示指pid的进程

–ppid pid 显示属于pid的子进程

-M 显示SELinux信息,相当于Z

ps输出属性

VSZ: Virtual memory SiZe,虚拟内存集,线性内存

RSS: ReSident Size, 常驻内存集

STAT:进程状态

​ R:running

​ S: interruptable sleeping

​ D: uninterruptable sleeping

​ T: stopped

​ Z: zombie

​ +: 前台进程

​ l: 多线程进程

​ L:内存分页并带锁

​ N:低优先级进程

​ <: 高优先级进程

​ s: session leader,会话(子进程)发起者

ps 输出及常见示例

ni: nice值

pri: priority 优先级

psr: processor CPU编号

rtprio: 实时优先级

示例:

​ ps axo pid,cmd,psr,ni,pri,rtprio

常用组合:

​ aux

​ -ef

​ -eFH

​ -eo pid,tid,class,rtprio,ni,pri,psr,pcpu,stat,comm

​ axo stat,euid,ruid,tty,tpgid,sess,pgrp,ppid,pid,pcpu,comm

ps示例

查询你拥有的所有进程:

​ ps -x

显示指定用户名(RUID)或用户ID的进程:

​ ps -fU apache

​ ps -fu 48

显示指定用户名(EUID)或用户ID的进程:

​ ps -fu mark

​ ps -fu 1000

查看以root用户权限(实际和有效ID)运行的每个进程:

​ ps -U root -u root

列出某个组拥有的所有进程(实际组ID,RGID或名称):

​ ps -fG nginx

列出有效组名称(或会话)所拥有的所有进程:

​ ps -fg mysql

​ ps -fG 27

通过进程ID来显示所属的进程:

​ ps -fp 1234

以父进程ID来显示其下所有的进程,如显示父进程为1154的所有进程:

​ ps -f –ppid 1234

显示指定PID的多个进程:

​ ps -fp 1204,1239,1263

要按tty显示所属进程:

​ ps -ft pst/0

以进程树显示系统中的进程如何相互链接:

​ ps -e –forest

以进程树显示指定的进程

​ ps -f –forest -C sshd

​ ps -ef –forest | grep -v grep | grep sshd

要显示一个进程的所有线程,将显示LWP(轻量级进程)以及NLWP(轻量级进 程数)列:

​ ps -fL -C nginx

要列出所有格式说明符:

​ ps L

查看进程的PID,PPID,用户名和命令:

​ ps -eo pid,ppid,user,cmd

自定义格式显示文件系统组,ni值开始时间和进程的时间:

​ ps -p 1234 -o pid,ppid,fgroup,ni,lstart,etime

使用其PID查找进程名称:

​ ps -p 1244 -o comm=

要以其名称选择特定进程,显示其所有子进程

​ ps -C sshd,bash

查找指定进程名所有的所属PID,在编写需要从std输出或文件读取PID的脚本时 这个参数很有用:

​ ps -C httpd,sshd -o pid=

检查一个进程的执行时间

​ ps -eo comm,etime,user | grep nginx

查找占用最多内存和CPU的进程:

​ ps -eo pid,ppid,cmd,%mem,%cpu –sort=-%mem | head

​ ps -eo pid,ppid,cmd,%mem,%cpu –sort=-%cpu | head

显示安全信息:

​ ps -eM

​ ps –context

使用以下命令以用户定义的格式显示安全信息.

​ ps -eo euser,ruser,suser,fuser,f,comm,label

使用watch实用程序执行重复的输出以实现对就程进行实时的监视,如下面的命 令显示每秒钟的监视:

​ watch -n 1 ‘ps -eo pid,ppid,cmd,%mem,%cpu –sort=-%mem | head’


进程优先级

进程优先级调整:

​ 静态优先级:100-139

​ 进程默认启动时的nice值为0,优先级为120

​ 只有根用户才能降低nice值(提高优先性)

nice命令:

​ nice [OPTION]/[COMMAND /[ARG]…]

renice命令:

​ renice [-n] priority pid…

查看:

​ ps axo pid,comm,ni

搜索进程

最灵活:

​ ps 选项 | 其它命令

按预定义的模式:pgrep

​ pgrep [options] pattern

​ -u uid: effective user,生效者

​ -U uid: real user,真正发起运行命令者

​ -t terminal: 与指定终端相关的进程

​ -l: 显示进程名

​ -a: 显示完整格式的进程名

​ -P pid: 显示指定进程的子进程

按确切的程序名称:/sbin/pidof

​ pidof bash

系统工具

uptime

显示当前时间,系统已启动的时间、当前上线人数,系统平均负载(1、5、10 分钟的平均负载,一般不会超过1)

系统平均负载:

指在特定时间间隔内运行队列中的平均进程数

通常每个CPU内核的当前活动进程数不大于3,那么系统的性能良好.如果每 个CPU内核的任务数大于5,那么此主机的性能有严重问题

如果linux主机是1个双核CPU,当Load Average 为6的时候说明机器已经被 充分使用