Linux进程管理
目录
1. 进程
1.1 概述
计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。
如果站在内核的角度来看:进程是分配系统资源的单位
1.2 进程的组成
进程的组成: PCB 、程序段和数据段
系统中存在大量的进程,操作系统通过创建PCB(process control black)进程控制块管理进程。PCB就是描述进程的结构体。
在Linux系统中,PCB 是 task_struct
struct task_struct
{
PID:描述本进程的唯一标示符,用来区别其他进程.
STAT:进程状态
PRI:进程的优先级,相对于其他进程的优先级,先后问题,值越小优先级越高。
程序计数器:程序中正在被执行的下一条指令的地址
内存指针:包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针
上下文数据:进程执行时处理器的寄存器中与进程强相关的的临时数据
I/O状态信息:包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表。
记账信息:可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等。
进程创建出来,CPU要执行它对应的代码,然而CPU很少,进程很多。因此OS内有一个调度模块,
负责较为均衡的调度每一个进程,较为公平的获得CPU资源。
...
其他信息
}
2.查看进程
2.1 ps
ps -axj 或 ps -aux
ls /proc 进程文件
ll /proc/24263 进程属性数据
2.2 top 动态的
3.进程状态
3.1 操作系统源代码和转换图
static const char * const task_state_array[] = {
"R (running)", /* 0 */ 运行状态
"S (sleeping)", /* 1 */ 浅度睡眠状态,也叫中断睡眠
"D (disk sleep)", /* 2 */深度睡眠状态,也叫不可中断睡眠
"T (stopped)", /* 4 */ 暂停状态
"t (tracing stop)", /* 8 */ 跟踪状态
"X (dead)", /* 16 */ 死亡状态
"Z (zombie)", /* 32 */ 僵尸状态
};
kill 指令
3.2 R 运行状态(running)
R 运行状态(running): 并不意味着进程一定在运行中 进程可能在运行队列中等或者正在被执行,就叫做 运行态,随时可以被CPU调度。
运行状态 R ——— 死循环
#include<stdio.h>
int main(){
while(1);
return 0;
}
R:后台进程,R+:前台进程 其他也一样+代表前台进程
- 前台进程:./myproc,输入指令无效bash的命令行解释器就停止工作了,可以被【Ctrl +C】终止
- 后台进程:./myproc &,可以执行指令,【Ctrl +C】 不能终止进程,退出进程要用kill
3.3 S 浅度睡眠状态(sleeping) ,也叫做可中断睡眠(interruptible sleep)
等待非CPU资源就绪。这种休眠是可被换醒的,我们可以 Ctrl + C 退出循环,而此时的进程就没了,也就是说它虽然是一种休眠状态,但是它随时可以接收外部的信号,处理外部的请求。
睡眠状态S —— sleep
#include<stdio.h>
#include<time.h>
int main(int num,char *arg[]){
while(1){
printf("hello work\n");
sleep(1);
}
return 0;
}
挂起状态(也属于S 状态):当内存不足的时候,OS提供适当的置换进程的代码和数据到磁盘中,PCB不换(好比你学籍还在,人把你赶走了)进程的状态就叫做挂起。
你现在正在等待某种资源的时候,正巧内存不足了,内存不够是你正在阻塞状态,所以把你的代码数据置换到磁盘里,所以叫做“挂起阻塞”。
3.4 D 深度睡眠状态(Disk sleep),也叫不可中断睡眠状态(uninterruptible sleep)
进程处于D状态,不可被杀掉,耶稣来了都没用,只能等这个进程自动醒来,kill -9 都杀不掉它,也得等它醒来 (关机除外,有可能关机都要被磁盘写入卡住,只能拔电源).
3.5T暂停状态(stopped)
可以通过发送 SIGSTOP(kill -19) 信号给进程来停止(T)进程。这个被暂停的进程可以通过发送 SIGCONT 信号让进程继续运行.
这时,发送信号恢复状态,会发现S后面没有+号,[ctrl + C] 也没法终止程序,这是因为你的暂停和继续让进程变成了后台运行
kill -9 pid // 直接杀死
3.6 Z僵尸状态(Zombie)
一个进程已经退出,但还不允许被OS释放,处于一个被检测的状态(好比出事了,警察要拉警戒线去调查原因),一般是父进程或者OS,想要得知该进程的结果,如何检测呢?这个我们后文再细说
僵尸进程的危害:进程的退出状态被一直维持,本身就需要数据维护,占用了内存空间,长时间的占用就会导致内存泄漏
4. linux中ctrl+c
作用:
1.当执行命令过程中,想中断命令的执行。比如查看几百M的文本内容。
2.当执行输入某些命令时,发现需要需要执行其他命令。此时不需要回删,使用ctrl+c会自动进入新命令输入。
5.程序优先级
cpu资源分配的先后顺序,就是指进程的优先权(priority)
ps -axl
- PRI :代表这个进程可被执行的优先级,其值越小越早被执
- 行 NI :代表这个进程的nice值,优先值的修正数据;调整进程优先级,在Linux下,就是调整进程nice值
- UID : 代表执行者的身份
注意:需要强调一点的是,进程的nice值不是进程的优先级,他们不是一个概念,但是进程nice值会影响到进程的优先级变化。nice值是进程优先级的修正修正数据 - 优先级 = 老的优先级 + nice
- nice其取值范围是-20至19,一共40个级别