3.linux进程管理

目录

一.进程管理

1.进程概念

2.进程生命周期和状态

3.进程管理process

3.1 ps-静态查看进程

3.2 top-动态查看进程

3.3. 使用信号控制进程

3.4 nice-优先级

二.作业控制jobs

三.虚拟文件系统proc

四. 线程(可看可不看)

1.状态

2.调度算法

3.通信方式

4.线程和进程的区别

5.线程的实现方式


一.进程管理

1.进程概念

进程是已启动的可执行程序的运行实例,进程有以下组成部分:

  • 已分配内存的地址空间;
  • 安全属性,包括所有权凭据和特权;
  • 程序代码的一个或多个执行线程;
  • 进程状态;

程序:二进制文件,静态/usr/bin/passwd   ./usr/sbin/useradd

进程:是程序运行的过程,动态,有生命周明及运行状态。

进程是已启动的可执行程序的运行实例,进程有以下组成部分:

  • 一个文件;
  • 被配内存的地址空间;
  • 有权限限制;
  • 程序代码的一个或多个副本(也叫执行线程);
  • 编辑像人一样拥有状态;

程序是具有执行代码和执行权限的文本文件。

进程则是运行起来的程序,获得计算机各方面的资源。

2.进程生命周期和状态

进程状态分为:

睡眠(Sleeping) --- S

运行(Running) -- R

可运行的(Runnable)

未响应(Zombie) -- 不死不活(僵尸) -- Z

暂停(Stopped)-- T

fork就是父进程创建一个新的子进程开始一个进程,创建无非是复制拷贝粘贴

进程的生命周期是由系统程序fork出来的子程序,具备一定父进程的资源(权力,内存空间,PID)。直到运行完毕,退出系统

S 睡眠。通常是在等待某个事件的发生,如一个信号或有输入可用

R 运行。严格来说,应是“可运行”,即在运行队列中,处于正在执行或即将运行状态

D 不可中断的睡眠(等待)。通常是在等待输入或输出完成
T (terminate)停止。通常是被shel作业控制所停止,或者进程正处于调试器的控制之下

Z (zombie)僵尸进程,通常是该进程已经死亡,但父进程没有调用wait类函数来释放该进程的资源
N (nice)低优先级任务
s 进程是会话期首进程
+ 进程屋于前台进程组
1 进程是多线程的
< 高优先级任务

3.进程管理process

3.1 ps-静态查看进程

静态查看进程ps

ps aux //静态查看进程,全部

ps aux | head -2 //只看头两行

USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND

ps a

显示现行终端机下的所有程序

ps u

以用户为主的格式来显示程序状况

ps x

不以终端机来区分

进程排序

ps aux -- sort - % 列名 //降序

ps aux -- sort % 列名 //升序

(列名:USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND

eg: ps aux -- sort % CPU //按照CPU升序打印出来当前的进程状况

进程的父子关系

ps -ef

UID PID PPID C STIME TTY TIME CMD

自定义显示字段 (列)

ps axo 要显示的列

eg:ps axo user, pid, ppid, %men,command | head -3

USER:运行进程的用户
PID:进程ID
%CPU:CPU占用率
%MEM:内存占用率
VSZ:占用虚拟内存
RSS::占用实际内存
TTY:进程运行的终端
STAT:进程状态 man ps VSTATE)
START:进程的启动时间
TIME:进程占用CPU的总时间
COMMAND:进程文件,进程名

3.2 top-动态查看进程

上半部分:

top - 11:45:08 up 18:54       4 users,          load average: 0.05,   0.05,    0.05

程序名 - 系统时间 运行时间,   登录用户数,   CPU负载:5分钟,          10,       15

Tasks:       176 total,  1 running,  175 sleeping,  0 stopped,   0 zombie

总进程数:                     运行数1,    睡眠数175,      停止数0,     僵死数0

%Cpu(s):         0.0 us,   0.3 sy,   0.0 ni,       99.7 id,   0.0 wa,    0.0 hi,    0.0 si,    0.0 st

Cpu使用占比:  us用户,  sy系统,  ni优先级,  id空闲,    wa等待,   hi硬件,   si软件,   st虚拟机

KiB Mem: 3865520 total, 1100000 free,  580268 used,      2185252 buff/cache

物理内存K: total总共4G,   free空间1G,    userd使用500M,  cache缓存硬盘内容2G

KiB Swap: 4063228 total,      4063228 free,  0 used,    2917828 avail Mem

交换分区:     总共4G,            4G空闲

下半部分:

PID USER PR NI VIRI RES SHR S %CPU %MEM TIME+ COMMAND

PID:序号

USER:启动用户

PR 和 NI:优先级

VIRIL:虚拟内存

RES:常驻内存

SHR:共享内存

S:状态--S T R Z

%MEM:占比

TIME + COMMAND: 运行时间 + 程序/命令

常用内部命令:

h|?帮助

M 按内存的使用排序

P  按CPU使用排序

N  以PID的大小排序

<   向前

>   向后

z 菜色,Z设置菜色,使用数字调整

常用小技巧:

top

//回车,立即刷新。按z彩色显示,按F通过光标设置

top -d 1

//每1秒刷新一次

top -d 5 -p PID1,PID....

//查看指定进程的动态信息

3.3. 使用信号控制进程

kill -序号 进程PID

eg:kill - 1 8878 //重新加载8878进程的配置

像2、3、20这些是通过键盘的快捷键来进行控制进程的

信号9和15:

1.创建两个文件,查看终端号

# cd /home/test

# touch file1 file2

#tty //查看终端号

/dev/pts/0 //此时这个终端叫做pts0

2.通过一个终端窗口打开vim

# vim file1 //在pts0的终端打开文本记事工具

iiiiiiii

3.新建一个终端窗口打开vim

# tty

/dev/pts/1

# vim file2 //在pts1的终端打开文本记事工具

zzzzzz

4.再新建一个终端窗口,查询两个进程

# ps aux | grep vim

5.发送15信号

# kill - 15 9305

正常结束

5.发送9信号

# kill - 9 9372

直接杀死

# tty查看终端号,不同窗口其终端号是不同的(TTY)

平时尽量用15号信息,但比如程序僵死了,不听话了,就可以用9号信息直接强制终止

3.4 nice-优先级

Linuxj进程调度以及多任务,每个CPU在一个时间点上只能处理一个进程,通过时间片技术,来同时运行多个程序

优先级范围和特性:

查看:

# ps axo pid, command, nice -- sort =-nice | head -5

显示特定的列且只显示前5行,按照nice降序排列

启动具有不同nice级别的进程:

默认情况:启动进程时,通常会继承父进程的nice级别,默认为0

# sleep 6000 &

启动一个程序且立马进入睡眠状态7000秒,不管输入什么都没有反应,

&将其丢到后台去不阻碍输入,默认优先级是0,会输出该程序的PID

# nice - n - 5 sleep 6000 &

将启动的程序的优先级设为-5

更改现有进程的nice进程:

# renice - 优先级值 PID

二.作业控制jobs

作业控制是一个命令功能,也叫后台运行

观察占领前台的现象

# sleep 2000

//运行一个程序,当前终端无法输入,观察占领前台的现象,大部分命令输入已经失效

ctrl + c终止进程

或者ctrl + z立刻将其丢到后台,不过丢进去后是暂停状态 -- bg 序号可以使其再次运行起来

运行后台程序

# sleep 3000 &

ps查询所有程序

# ps axo PID

jobs查看后台进程

# jobs

[1]- Running sleep 3000 &

调动后台程序至前台

# fg 1

//将作业1([1])调回到前台

ctrl + z

# bg 1

//将重新丢到后台的暂停的程序重新运行起来

消灭后台程序

# kill 1

//终止掉PID为1的进程

# kill %1

//杀死作业序号为1的后台程序

三.虚拟文件系统proc

采集服务器自身内核、进程运行的状态信息

CPU:

/proc/cpuinfo

内存:

/proc/meninfo

内核:

/proc/cmdline

在开发板驱动程序编写中,proc下用来查看tty设备驱动、中断次数、行程规等也是非常有用的,留个伏笔,后面在开发板驱动专栏中会上传。

四. 线程(可看可不看)

1.状态

1.新建状态:当线程被创建到开始执行任务之间的状态,一般对应的是线程对象被创建到执行start结构之间的过程;

2.就绪状态:线程开始执行之后,只是表明线程准备好执行,需要CPU调度进行执行;

3.运行状态:线程被CPU翻牌子,开始执行任务;

4.阻塞状态:线程因为等待其他事件触发或者等待资源而发生阻塞,一般分为:

  • 等待阻塞:线程执行了wait;
  • 同步阻塞:因为同步锁获取失败,而进入阻塞;
  • 其他阻塞:因等待获取IO资源而阻塞或者线程调用了sleep;

5.死亡状态:线程任务执行完成,可以被销毁。

2.调度算法

  1. 先来先服务(FCFS)算法;
  2. 时间片轮转调度算法;
  3. 短作业优先算法;
  4. 最短剩余时间优先算法;
  5. 高响应比优先算法;
  6. 优先级调度算法;
  7. 多级反馈队列调度算法;

3.通信方式

  1. 消息队列;
  2. 共享内存;
  3. 有名管道/无名管道;
  4. 信号;
  5. scoket。

4.线程和进程的区别

线程是任务调度和执行的基本单位;进程是资源分配的基本单位;

单个进程可以包含多个线程,单个进程至少包含一个线程,不存在没有线程的进程,也没有不存在于进程的线程;

因为虚拟内存的关系不同的进程互相不知道对方的存在,相对独立,互相有独立的内存空间,地址空间;相同进程内的进程之间之间共享进程的内存空间,文件描述符表,部分寄存器等资源,但是每个线程都有自己独立的线程栈和部分寄存器,线程间访问资源需要考虑互斥问题;不同进程中的不同线程关系和不同进程关系相似,相对独立;

进程创建,销毁,切换代价大;线程创建,销毁,切换小。

进程和线程的优缺点:

进程有利于资源管理和保护,开销大;线程不利于资源管理和保护,需要使用锁保证线程的安全运行,开销小。

5.线程的实现方式

  内核级线程:由系统内核创建,撤销,调度的线程。

  用户级线程:由用户进程自行调度的线程。

  混合级线程:同时支持用户级线程和内核级线程。

  内核级线程和用户级线程的区别:

内核线程需要操作系统支持,系统可知;用户级线程,系统调度资源分配是面向进程的,并不可知;

内核级线程创建、调度和撤销类似于进程;用户级线程创建和调度由用户进程控制,需要用户程序控制线程的调度工作;

内核级线程不同线程之间相对独立;用户线程中如果一个线程因其他原因而阻塞则导致整个进程阻塞,相同进程中的其他线程也被阻塞;

内核级线程资源竞争空间为全局;用户级线程资源竞争空间为当前进程。

  内核级线程优缺点:

优点:

多核CPU友好,能够实现整整意义上的多线程;

如果单个进程中的一个线程被阻塞,进程中的其他线程仍然能够进程切换运行;

所有阻塞线程的调用都以系统调用实现,代价较小;

缺点:

由内核进行调度,用户的可定制性差;

线程在用户态运行,而线程的切换和调度相关操作在内核实现,进行线程切换时代价相对较高。

  用户级线程的优缺点:

优点:

线程调度由用户控制,不需要内核参与,控制灵活,相对可控;

不需要内核支持,可以在不支持多线程的系统中实现;

线程创建、销毁、调度和切换等管理操作的代价比内核级线程小;

线程能够利用的表空间和堆栈空间比内核线程多;

缺点:

资源分配和调度按照进程进行,单个进程中同一时间只有一个线程运行,多处理机不友好;

当进程中的一个线程因缺页中断等原因阻塞时整个进程都会阻塞。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值