首页 > 系统相关 >linux进程状态

linux进程状态

时间:2024-03-30 16:59:46浏览次数:22  
标签:状态 pid 内存 linux 进程 CPU 运行

目录

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内部的数据可以有多套(有几个进程就有几个--对应上下文数据)

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

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

标签:状态,pid,内存,linux,进程,CPU,运行
From: https://blog.csdn.net/yiqizhuashuimub/article/details/137111776

相关文章

  • 一文搞懂Javaweb的响应状态码
    一、状态码大类状态码分类说明1xx响应中——临时状态码,表示请求已经接受,告诉客户端应该继续请求或者如果它已经完成则忽略它2xx成功——表示请求已经被成功接收,处理已完成3xx重定向——重定向到其它地方:它让客户端再发起一个请求以完成整个处理。4xx客户端......
  • Linux服务器安装openJdk8
    环境说明linux系统版本:lsb_release-a  不同的操作系统以及软件版本,可能会遇到不一样的问题,一定要注意版本问题。 .1.查看服务器是否已经安装JDK。  创建目录mkdiropenJdk8&&mkdirmaven  .2.下载JDK,版本参照自己本地的版本,至少要大于等于1.8.121 ......
  • Linux服务器安装Maven
    环境说明linux系统版本:lsb_release-a  JDK版本:1.8  不同的操作系统以及软件版本,可能会遇到不一样的问题,一定要注意版本问题。 .1.Maven版本选择。自己本地使用的事3.9.6,因此服务器同样用此版本,如果有问题在更改版本。  按照如下操作找到Maven的下载地址。......
  • Linux常用快捷键
    必用必记1、命令或路径的补全键Tab使用:命令补全;文件名或者路径补全连续按2次Tab键,显示以已输入字符开头的所有命令、文件名或路径2、光标回到命令首行ctrl+a3、光标回到命令行尾ctrl+e4、中断终端正在执行的任务或者删除整行ctrl+c使用:结束目前正在运行的程......
  • Linux使用PulseAudio录取声音
    PulseAudio介绍PulseAudio是一个音频服务器,它充当了你的应用程序和硬件设备之间的中间件。简单来说就是你可以调用api,获取到系统捕获到的声音,可以录音。安装PulseAudiosudoaptinstalllibpulse-dev#不过一般都安装好了,Linux系统上使用有两种api,一种是简单的,同步的,Simp......
  • linux正则表达式之*
    1.*含义linux正则表达式*表示重复0个或多个前一个重复字符2.样例正则表达式*样例命令:grep-n"min*"anaconda-ks.cfg#找出含有mi、min、minn等字符串的行。注:因为*可以是0个,所以mi也是符合搜索字符串,另外,因为*为重复前一个字符的符号,因此,在*之前必须要紧挨着一个重复字......
  • linux 通过nvm安装node.js
    我的博客原文:linux通过nvm安装node前言 nvm是一个node版本控制的工具,他可以查看可以安装的node版本,安装node,以及切换node版本,传统的node安装,我们是下载压缩包,然后指定环境变量,当我们需要升级node的时候,需要重新下载node压缩包,更新或者回退版本显得有些麻烦,而使用nvm可以安......
  • MogDB备机处于standby need-repair(WAL)状态
    MogDB备机处于standbyneed-repair(WAL)状态本文出处:https://www.modb.pro/db/402820问题现象Mogdb主备环境,备机检查发现StandbyNeedrepair(WAL)故障。原因分析因网络故障、磁盘满等原因造成主备实例连接断开,主备日志不同步,导致数据库集群在启动时异常。处理分析通过......
  • FFmpeg开发笔记(九)Linux交叉编译Android的x265库
    ​《FFmpeg开发实战:从零基础到短视频上线》一书的“12.1.2 交叉编译Android需要的so库”介绍了如何在Windows环境交叉编译Android所需FFmpeg的so库,前文又介绍了如何在Linux环境交叉编译Android所需FFmpeg的so库,接下来介绍如何在Linux环境交叉编译Android所需x265的so库。1、安......
  • 【Linux】Linux进程控制>进程创建&&进程终止&&进程等待&&进程程序替换
    主页:醋溜马桶圈-CSDN博客专栏:Linux_醋溜马桶圈的博客-CSDN博客gitee:mnxcc(mnxcc)-Gitee.com目录1.进程创建1.1fork函数1.2fork函数返回值1.2.1写时拷贝1.3fork常规用法1.4fork调用失败的原因 、2.进程终止 2.1进程退出场景2.2进程常见退出方法 2......