linux进程状态

目录

1. 进程状态分类

1.1 进程状态查看 

 2. Z(zombie)-僵尸进程

 2.1 pid

 2.2 僵尸进程危害

 3. 孤儿进程

4. 理论

4.1 运行态

 4.2 阻塞态(S,D)

4.3 挂起态

 4.4 进程的切换


1. 进程状态分类

CPU内存在很多寄存器

看看下面的状态在kernel源代码里定义:

/*
* The task state array is a strange "bitmap" of
* reasons to sleep. Thus "running" is zero, and
* you can test for combinations of others with
* simple bit tests.
*/
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 */
};

 R运行状态:并不意味着进程一定在运行,它表明状态要么在运行中要么在运行队列里

S睡眠状态:: 意味着进程在等待事件完成(这里的睡眠有时候也叫做可中断睡眠)

D磁盘休眠状态(Disk sleep)有时候也叫不可中断睡眠状态(uninterruptible sleep),在这个状态的 进程通常会等待IO的结束。

T停止状态(stopped): 可以通过发送 SIGSTOP 信号给进程来停止(T)进程。这个被暂停的进程可 以通过发送 SIGCONT 信号让进程继续运行。

X死亡状态(dead):这个状态只是一个返回状态,你不会在任务列表里看到这个状态

1.1 进程状态查看 

ps aux / ps axj 命令

 kill -l 显示进程命令

kill -x pid   执行相应的进程命令

 ​​​​​​

s睡眠状态,CTRL+c时进程停止,加&时表示后台运行进程所以时S不是S+,S+表示前台运行 
进程在等待,资源就绪,可中断睡眠

-19后变成T,-18后变成S ,-9是干掉进程,一个进程被暂停了自动会变成后台的所以是s
所以T/t让进程暂停,等待进一步唤醒

 R+前台运行:如果不注释的话显示S+,因为没有与外设接触了没有资源了
printf是在显示器上打印东西,而根据冯诺依曼体系,prinftf是先往cpu和内存打印东西,但是cpu的处理的速度比屏幕显示代码以及内部的传输到cpu的速度要快,所以cpu大部分时间都在等待数据的输入,并没有都在运行,而且运行的熟读极快造成了速度差,所以被判断是休眠状态。所以会造成代码刷屏时,会处于休眠状态,其实休眠状态就是cpu处于等待状态,也可以说,休眠状态就是进程在等待资源的就绪

需要注意的是linux下很难查到X死亡状态,也能查到但是比较损耗

D:linux系统比较特有的一种进程状态 

linux操作系统有权利杀掉进程来释放空间,防止内存不够用使OS崩溃

D状态最大意义是确保进程不可被杀,S是浅度睡眠可被OS杀掉

 2. Z(zombie)-僵尸进程

僵死状态(Zombies)是一个比较特殊的状态。当进程退出并且父进程(使用wait()系统调用,后面讲)没有读取到子进程退出的返回代码时就会产生僵死(尸)进程

僵死进程会以终止状态保持在进程表中,并且会一直在等待父进程读取退出状态代码。 所以,只要子进程退出,父进程还在运行,但父进程没有读取子进程状态,子进程进入Z状态

僵尸进程
​​

Z状态已经运行完毕但是需要维护自己的退出信息,在自己的task_struct会记录自己的退出信息,未来让我们的父进程来进行读取 
如果没有父进程读取,此时僵尸进程会一直存在。不访问一直存在导致造成内存泄漏
每一个进程在退出的时候,如果没有父进程去读取他获取它的退出结果那么此时进程会一直处于僵尸,相当于一直在占用内存
此时kill不掉Z状态进程因为已经死掉了再kill也没用

进程=内核数据结构task_struct+进程的代码和数据。当一个进程退出时,其 task_struct 结构体通常会被保留一段时间,直到父进程调用 wait() 或 waitpid() 等系统调用来获取该进程的退出状态信息。在这段时间内,进程处于僵尸(Zombie)状态,其 task_struct 结构体仍然存在,但实际上进程已经终止运行。进程退出了那么他的代码和数据就无法访问了

经过waitpid()后由Z变为X后由os释放

 2.1 pid

pid,进程id,  pid是一种进度标识,在由于内存的内部有多个PCB结构体/进程控制块,为了区分这些进度块,从而衍生出pid,是每一个进程都有的唯一标识。

同时,和pid 相对因的是ppid 也就是父进程,每一个进程都是由父进程创建的,子进程可以继承父进程的代码,而父进程的代码和数据一般来自于磁盘

在Linux中,可以创建C语言文件,使用函数getpid()和函数getppid()获取当前进程的pid和ppid

进程可以通过fork()函数,进行创建,同时之后的新进程就由fork()创造的进程产生,是它的子进程,而子进程和父进程的代码共享,但是数据分别独立,这也表明了进程的特点,独立性! 

 因为grep本身也会产生包含关键字的进程,使用grep -v grep进行屏蔽操作!

 查看进程信息使用 /proc , 如:要获取PID为1的进程信息,你需要查看 /proc/1 这个文件夹

 2.2 僵尸进程危害

进程的退出状态必须被维持下去,因为他要告诉关心它的进程(父进程),你交给我的任务,我办的怎 么样了。可父进程如果一直不读取,那子进程就一直处于Z状态.

 维护退出状态本身就是要用数据维护,也属于进程基本信息,所以保存在task_struct(PCB)中,换句话 说,Z状态一直不退出,PCB一直都要维护.

那一个父进程创建了很多子进程,就是不回收,是不是就会造成内存资源的浪费?是的!因为数据结构 对象本身就要占用内存,想想C中定义一个结构体变量(对象),是要在内存的某个位置进行开辟空 间! 内存泄漏?是的!

 3. 孤儿进程

父进程运行五次就退出,子进程一直运行

此时只有11947进程在跑因为父进程先退出,此时子进程就是孤儿进程
孤儿进程没父进程后一般会被1号进程领养,可以理解为被os进程领养。那么孤儿进程为什么要被os领养,因为我们依旧要保证子进程正常被回收
如果CTRL+c无法阻止pid.c结束,那么用kill杀掉进程pid就行

小问题:我们启动linux写代码时为什么我们之前从来都没关心过僵尸呢?内存泄漏?

直接在命令行中启动的进程,他的父进程是bash,bash会自动回收新进程的Z
在Linux系统中,Bash进程实际上是一个用户空间的进程,其进程名称通常为"bash"。当你在Linux系统中打开一个终端窗口,并输入命令时,系统会创建一个Bash进程来解释和执行你输入的命令。

4. 理论

4.1 运行态

os调度算法一种:一个进程一旦持有CPU,不会一直运行到这个进程结束,它是基于时间片进行轮转调度的,让多个进程以切换的方式进行调度(进程链表形式存在),在一个时间段内同时得以推进代码,叫做并发

在并发处理中,通过操作系统的调度机制,多个任务可以交替地共享单个 CPU 的执行时间。虽然在任意时刻只有一个任务在 CPU 上执行,但由于任务之间的快速切换和时间片轮转,看起来就好像多个任务在同时进行一样,这就是并发处理。

任何时刻都同时有多个进程在真的同时进行,叫做并行。通常情况下,并行处理需要多个 CPU 或者多个核心来实现。每个 CPU 核心都可以独立地执行指令,因此在多个核心或者多个 CPU 存在的情况下,可以实现多个任务的真正并行执行。

并发调度

 4.2 阻塞态(S,D)

唤入唤出用户感知不到,频繁唤入唤出会导致效率降低,相当于用效率换空间

4.3 挂起态

挂起态(Suspended State)是指进程或线程由于某些原因暂时停止执行,但仍然占用系统资源,并可以在稍后恢复执行的状态。在挂起态中,进程或线程不会消耗 CPU 时间,但它们的内存空间、打开的文件等资源仍然被保留。

 

 4.4 进程的切换

可以大概理解

 CPU内部的寄存器:

寄存器本身是硬件,具有数据存储的能力,CPU的寄存器硬件只有一套!

但是cpu内部的数据可以有多套(有几个进程就有几个--对应上下文数据)

所以寄存器!=寄存器的内容

进程的切换在任何时间点都能切换 

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wangsir.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值